我在这里问这样一个平庸的问题有点尴尬,但我试图按照最近的'Beginning Haskell'一书(Apress)作为Haskell的介绍,但代码不起作用。我在网上找到了源代码,这与我自己的代码相同,但也无效。
data Client = GovOrg String
| Company String Integer Person String
| Individual Person Bool
deriving Show
data Person = Person String String Gender
deriving Show
data Gender = Male | Female | Unknown
deriving Show
clientName :: Client -> String
clientName (GovOrg name) = name
clientName (Company name _ _ _) = name
clientName (Individual (Person fName lName _) _) = fName ++ " " ++ lName
当我尝试用
调用该函数时clientName(GovOrg“NASA”)
它返回“NASA”。 但是当我试着用它来调用它时:
clientName(公司“处女”)
或者:
clientName(个人“Adam”“Smith”) - (或此函数调用的任何其他排列)
结果是类型不匹配,并且:
可能原因:“公司”适用于太少的论点
正如你可能会说的那样,在这个阶段我的语法很困难,但是如果我能让它在第一时间工作的话,我相信我会有更好的时间。我如何从解释器调用函数有什么问题吗?
答案 0 :(得分:4)
那是因为你没有传递整个数据。试试这个:
λ> clientName (Company "Virgin" 3 (Person "fname" "lname" Male) "hello")
"Virgin"
λ> clientName (Individual (Person "Adam" "Smith" Male) True)
"Adam Smith"
Company
和Individual
都是数据构造函数,您也可以检查它们的类型:
λ> :t Individual
Individual :: Person -> Bool -> Client
因此,对于Construcing Individual
,您应该将Person
和Bool
类型传递给它。这样的东西构建了Client
类型:
λ> let a = Individual (Person "Adam" "Roy" Male) True
λ> :t a
a :: Client
答案 1 :(得分:1)
问题是,您尝试将Company
作为唯一参数Virgin
。 Company
实际需要的参数是字符串和整数和一个人和另一个字符串。
clientName (Company "Virgin" 123 (Person "Three" "Fx" Unknown) "someString")
会奏效。
答案 2 :(得分:0)
Company
和Individual
都有数据构造函数,这些构造函数需要多于1个参数。具体来说,Company
也需要Integer
,Person
和String
; Individual
也需要Bool
。
不仅如此,Individual
还需要Person
作为第一个参数。
例如,您应该致电:
clientName (Individual (Person "Adam" "Smith" Male) True)