试图在Haskell中的列表前面添加元组,但是收到错误?

时间:2019-02-14 12:11:47

标签: haskell

 type Name = String
 type PhoneNumber = Int
 type Person  = (Name, PhoneNumber)
 type PhoneBook = [Person]
 add :: Person -> PhoneBook -> PhoneBook
 add (a,b) 
 add (a,b) ++ [] 

我正在尝试在列表前面添加一个条目,但这给我一个错误

    Parse error: module header, import declaration
    or top-level declaration expected.
   |
30 | add (a,b) : xs
   | ^^^^^^^^^^^^^^

我要去哪里错了?

2 个答案:

答案 0 :(得分:5)

您正在尝试添加列表和元组。但是++的定义是将列表添加到列表,而不是将元组添加到列表。 Haskell 非常对类型严格,因此它不允许您这样做。

您应该将元组列为列表:

add [(a,b)] ++ [] 

或者,正如罗宾·齐格蒙德(Robin Zigmond)在其comment中所建议的那样,使用:运算符:

add (a,b) : [] 

但是,您还有另一个问题-您的函数定义应包含一个=运算符:

add (a,b) [] = [(a,b)]

这是在Haskell中定义函数的方式。在左侧,它告诉Haskell wat输入是。在右侧,它告诉Haskell应该将其转换为什么。

您可能想参考Learn You A Haskell : Syntax in Functions,以获取有关在Haskell中定义函数的很好的介绍。

答案 1 :(得分:1)

根据您的帖子,您可以运行以下代码:

 type Name = String
 type PhoneNumber = Int
 type Person  = (Name, PhoneNumber)
 type PhoneBook = [Person]

 add :: Person -> PhoneBook -> PhoneBook
 add (name, phoneNumber) phoneBook = (name, phoneNumber) : phoneBook 

 main = print $ add ("xyz", 987) (add ("abcd", 123) [])

产生:

[("xyz",987),("abcd",123)]