2014-06-05 71 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

相關問題