Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Haskell:向数据类型内的列表添加元素_List_Haskell_Types - Fatal编程技术网

List Haskell:向数据类型内的列表添加元素

List Haskell:向数据类型内的列表添加元素,list,haskell,types,List,Haskell,Types,我正在尝试实现一个函数,将一个元素(类型)添加到该类型的列表中,并添加到现有创建的数据类型中。由于Haskell数据变量是不可变的,我知道您必须创建一个与第一个数据具有相同特征的新数据并将其添加到其中,但我似乎可以让ghci编译我的程序,并让它完成我试图完成的任务 以下是我的代码和功能,该功能应将联系人添加到我正在尝试处理的现有联系人列表中addContact: type Model = String type Serie = String type SerialNumber = String

我正在尝试实现一个函数,将一个元素(类型)添加到该类型的列表中,并添加到现有创建的数据类型中。由于Haskell数据变量是不可变的,我知道您必须创建一个与第一个数据具有相同特征的新数据并将其添加到其中,但我似乎可以让ghci编译我的程序,并让它完成我试图完成的任务

以下是我的代码和功能,该功能应将联系人添加到我正在尝试处理的现有联系人列表中
addContact

type Model = String
type Serie = String
type SerialNumber = String
type Type= (Model, Serie)
data Car =      Car
                SerialNumber
                Type
                deriving (Show, Read) 
type PastCars= (Car, ChangeCause)
data ChangeCause = Broken | Contract deriving (Show, Eq, Read)
type Phone = (Extension, Number)
type Number = String
type Extension = String
type Person = (FirstName, LastName)
type FirstName = String
type LastName = String
type Contact = (Person, Phone)

data Owner  = Owner Car Phone [PastCars] [Contact]
--Getters

listPastSN [] = []
listPastSN ((p,e):xs) = (serialNumber p, e):listPastSN xs

serialNumber :: Car -> String
serialNumber (Car s _)= s

car :: Owner -> Car 
car (Owner c _ _ _ ) = c

phone :: Owner -> Phone 
phone (Owner _ p _ _ ) = p

pastCar :: Owner -> [PastCars]
pastCar (Owner _ _ p _ ) = p

contacts :: Owner -> [Contact]
contacts (Owner _ _ _ c) = c

addContact :: FirstName -> LastName -> Extension -> Number -> Owner -> Owner
addContact f l e n ow = Owner car(ow) phone(ow) pastCar(ow) contacts(ow) ++ (Contact ((f, l), (e, n)))
让我们来看看这些数据变量

car1 = Car  "X234X" ("Honda", "Civic")
car2 = Car  "X233X" ("Mazda", "3")
person1 =  Person "Peter" "Mcleod"
owner1 = Owner car1 ("888" , "4144144") [(car2, Broken)] [(person1,("123", "1231231")) ]
我希望能够将另一个联系人添加到所有者1的联系人列表中


正确的方法是什么。因此,围绕这种情况提出的LYAH解决方案似乎没有帮助。

代码中存在多个问题。addContact功能的固定版本:

addContact f l e n ow = 
  Owner (car ow) (phone ow) (pastCar ow) $ (contacts ow) ++ [((f, l), (e, n))]
  • Contact
    不是构造函数,而是类型别名
  • fa(b)
    fab
    相同。因此,
    Owner phone(x)
    Owner phone x
    相同,这同样适用于其他参数
  • 看看
    (++)的签名::[a]->[a]->[a]
    。您正在尝试,
    联系人(ow)+(联系人(f,l)、(e,n))
  • fab++[1,2,3]
    (fab++[1,2,3]
    相同。您想要的是
    fa(b++[1,2,3])
    fa$b++[1,2,3]

我非常感谢您的帮助,现在命令的编译错误已大大减少,但仍然有一个,您知道是什么原因导致了这一错误吗?错误:•无法将预期类型“Person”与实际类型(FirstName,LastName)•匹配在表达式中:(f,l)在表达式中:((f,l),(e,n))在“(++)”的第二个参数中,即“[((f,l),(e,n))]”,这意味着您端的代码与所讨论的代码不同。您将Person的声明从类型别名更改为数据声明,并且没有更新我给您的答案。