开始Haskell:调用一个简单的函数,匹配数据结构

时间:2014-06-05 11:36:49

标签: haskell

我在这里问这样一个平庸的问题有点尴尬,但我试图按照最近的'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”) - (或此函数调用的任何其他排列)

结果是类型不匹配,并且:

  

可能原因:“公司”适用于太少的论点

正如你可能会说的那样,在这个阶段我的语法很困难,但是如果我能让它在第一时间工作的话,我相信我会有更好的时间。我如何从解释器调用函数有什么问题吗?

3 个答案:

答案 0 :(得分:4)

那是因为你没有传递整个数据。试试这个:

λ> clientName (Company "Virgin" 3 (Person "fname" "lname" Male) "hello")
"Virgin"
λ> clientName (Individual (Person "Adam" "Smith" Male) True)
"Adam Smith"

CompanyIndividual都是数据构造函数,您也可以检查它们的类型:

λ> :t Individual
Individual :: Person -> Bool -> Client

因此,对于Construcing Individual,您应该将PersonBool类型传递给它。这样的东西构建了Client类型:

λ> let a = Individual (Person "Adam" "Roy" Male) True
λ> :t a
a :: Client

答案 1 :(得分:1)

问题是,您尝试将Company作为唯一参数VirginCompany实际需要的参数是字符串整数一个人另一个字符串。

clientName (Company "Virgin" 123 (Person "Three" "Fx" Unknown) "someString")

会奏效。

答案 2 :(得分:0)

CompanyIndividual都有数据构造函数,这些构造函数需要多于1个参数。具体来说,Company也需要IntegerPersonString; Individual也需要Bool

不仅如此,Individual还需要Person作为第一个参数。

例如,您应该致电:

clientName (Individual (Person "Adam" "Smith" Male) True)

Live demo