2014-06-05 40 views
1

我有点尴尬地问这样一个平凡的问题在这里,但我想跟随最近的'Beginning Haskell'一书(Apress)作为介绍Haskell,但代码不起作用。我在网上找到了源代码,这与我自己的代码完全相同,也不起作用。开始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(个人 “亚当”, “史密斯”) - (或此函数调用的任何其他排列)

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

可能原因:'公司”施加过多的参数

正如你或许可以告诉,我有困难的时候与这个阶段的语法,但我敢肯定,我会如果我能够在第一时间开始工作,可以有更好的时间。如何从解释器调用函数有什么问题吗?

回答

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 
+0

谢谢!作者从来没有澄清如何调用这些函数,我想我假定由于定义的函数对整个数据不感兴趣,函数调用不应该包含它。再次感谢!。 – MHJ

+0

@ user3710884,无论函数是否实际检查所有(或任何)参数,都需要应用参数。如果你没有全部应用,你得到的东西实际上是一个函数,等着你去应用其余的东西。由于'clientName'函数需要一个'Client'并获取一个函数,所以你会得到一个类型错误。 – dfeuer

0

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

不仅如此,而且IndividualPerson作为第一个参数。

你应该例如,呼吁:

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

Live demo

1

的问题是,你试图让一个CompanyVirgin作为其唯一的参数。您实际需要的参数Company是字符串整数一个人另一个字符串。

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

将工作。

+0

这显然不是你的意思。字符串不是函数。 – dfeuer

+0

是的,谢谢你指出。 – ThreeFx

相关问题