首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >无法将预期类型'x‘与实际类型`([Char]、[Char]、[Char])’匹配

无法将预期类型'x‘与实际类型`([Char]、[Char]、[Char])’匹配
EN

Stack Overflow用户
提问于 2017-08-26 04:23:30
回答 2查看 364关注 0票数 0

我创建了一种数据类型,用于存储有关一组人的信息:他们的姓名和出生日期。数据类型只是两个三元组列表,第一个列表包含名称(first, middle, last),第二个列表包含道布(日、月、年)。您可以看到下面的数据类型(我省略了道布类型,因为它与这个问题无关):

代码语言:javascript
代码运行次数:0
运行
复制
data Names = Names [(String, String, String)]
data People = People Names

我试图编写一个函数来创建初始列表,因此它返回第一个人的名称,然后返回People的列表。到目前为止:

代码语言:javascript
代码运行次数:0
运行
复制
initiallist :: ([String], People)
initiallist = (first_name, all_people)
    where first_name = "Bob" : "Alice" : "George" : []
        all_people = People ("Bob","Alice","George") : []

这会导致

代码语言:javascript
代码运行次数:0
运行
复制
error:
* Couldn't match expected type `Names'
     with actual type `([Char], [Char], [Char])'
* In the first argument of `People', namely `("Bob", "Alice", "George")'
  In the first argument of `(:)', namely
    `People ("Bob", "Alice", "George")'
  In the expression: People ("Bob", "Alice", "George") : []

现在,根据我对Haskell的了解,我认为String只是一个[Char]。所以我想我的代码会很好,但这让我很困惑。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-26 09:41:16

代码中有两个问题。

首先,People数据类型接受Names数据类型,但是您试图用[(String,String,String)]数据类型来填充它。

第二,正如@Koter支柱的答复中提到的,值构造函数(此处为People和/或Names)的优先级高于列表值构造函数: (左关联)。

另一点是,您的数据类型可以由newtype定义,生成更高效的代码。

因此,请记住,值构造函数也是函数,如果您想使用:构造函数来创建您的列表,您也可以这样做;

代码语言:javascript
代码运行次数:0
运行
复制
newtype Names  = Names [(String, String, String)]
newtype People = People Names

initiallist :: ([String], People)
initiallist = (first_name, all_people)
    where first_name = "Bob" : "Alice" : "George" : []
          all_people = People $ Names $ ("Bob","Alice","George") : []

当然,你最好还是喜欢

代码语言:javascript
代码运行次数:0
运行
复制
all_people = People (Names [("Bob","Alice","George")])
票数 1
EN

Stack Overflow用户

发布于 2017-08-26 04:32:25

:操作符的优先级低于应用People构造函数。所以你的表情实际上是:

代码语言:javascript
代码运行次数:0
运行
复制
all_people = (People ("Bob","Alice","George")) : []

它在错误消息中表示,说明People构造函数适用于什么:

代码语言:javascript
代码运行次数:0
运行
复制
...first argument of `People', namely `("Bob", "Alice", "George")'

您必须将其明确如下:

代码语言:javascript
代码运行次数:0
运行
复制
all_people = People (("Bob","Alice","George")) : [])

或者,使用列表表示法:

代码语言:javascript
代码运行次数:0
运行
复制
all_people = People [("Bob","Alice","George")]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45891910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档