【问题标题】:Haskell Converting paramaters into typeHaskell 将参数转换为类型
【发布时间】:2021-05-17 18:53:04
【问题描述】:

我创建了联系人类型,我正在尝试创建一个函数,该函数采用 4 个参数(名字、姓氏、电话和州)并创建一个联系人并将其添加到现有联系人列表中。

type LastName = String
type FirstName = String
type Phone = String
type Contact = (Person, State)
data Person = Person Phone Name deriving (Show, Read)
type Name = (FirstName, LastName)
data State = Good | Bad

addContact :: Phone -> FirstName -> LastName -> State -> [Contact] -> [Contact]
addContact  c p n s [] = Contact (Person c (p,n)  ,s) : []
addContact c p n xs = Contact (Person c (p,n)  , s) : xs

我似乎无法在 LYAH 或 SOF 上找到解决方案,我完全按照本节所说的内容进行操作,尤其是关于形状的部分:http://learnyouahaskell.com/making-our-own-types-and-typeclasses#record-syntax 但我收到以下编译错误:

• Data constructor not in scope:
        Contact :: (Person, [Char]) -> Contact

我尝试将类型的大写更改为小写,但仍然出现未定义变量错误编译。

这里有什么我遗漏的吗?

【问题讨论】:

  • 您的第二种和第三种类型定义没有意义,并且不会编译。如果你输入了这个源代码,你会在到达函数定义之前得到一个错误。请编辑问题以包含实际失败的源代码。

标签: list haskell types construction


【解决方案1】:

Contact 不是类型构造函数,Contact 只是 (Person, State) 的别名,所以是 2 元组,因此 (,) 是数据构造函数:

addContact :: Phone -> FirstName -> LastName -> State -> [Contact] -> [Contact]
addContact c p n s xs = (,) (Person c (p,n)) s : xs

或者不那么冗长:

addContact :: Phone -> FirstName -> LastName -> State -> [Contact] -> [Contact]
addContact c p n s xs = (Person c (p,n), s) : xs

Person 的数据类型无效,应该是:

data Person = <b>Person</b> Phone Name deriving (Show, Read)

或者您可以使用类型别名,例如:

type Person = <b>(</b>Phone<b>,</b> Name<b>)</b>

那么你可以这样实现:

addContact :: Phone -> FirstName -> LastName -> State -> [Contact] -> [Contact]
addContact c p n s xs = ((Person c (p, n)), s) : xs

或:

addContact :: Phone -> FirstName -> LastName -> State -> [Contact] -> [Contact]
addContact c p n s xs = ((c, (p, n)),s) : xs

最后名字类型又出问题了,FirstName之间不能写空格,应该用括号:

type Name = <b>(</b>FirstName<b>,</b> LastName<b>)</b>

【讨论】:

  • 很抱歉出现了错误的格式。我对您提出的建议进行了更正,并尝试实现第一个功能,结果出现以下错误:无法将类型 'b0 -> (a0, b0)' 与 '(Person, State)' 预期类型匹配:[联系方式] 实际类型: [b0 -> (a0, b0)] • 在表达式中: (,) (Person c (p, n) s) : xs 在'addContact' 的等式中: addContact cpns xs = (,) (人 c (p, n) s) : xs | 10 | addContact c p n s xs = (,) (人 c (p,n) s) : xs | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  • @930404JP:对不起,打错了,是(,) (Person c (p, n)) s
猜你喜欢
  • 2017-04-17
  • 1970-01-01
  • 2021-08-11
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
相关资源
最近更新 更多