2015-06-05 58 views
1

這裏的財產是我的代碼:訪問的數據類型

data Person = Person {name :: String} 

greet :: Person -> String -> String 
greet person lastName = 
    "Hi my name is " ++ name ++ ", last name: " ++ lastName 

這是我的,我在這裏寫了什麼解釋:對於其中存在的方法name返回一個數據類型Person串。

還有一個函數greet它需要一個PersonString並返回一個不同的String。但是,問候方法調用Person數據類型的name方法來連接此字符串。

然而,當我編譯這段代碼,我得到這個錯誤:

Couldn't match expected type `[Char]' with actual type `Person -> String' 

這究竟是爲什麼?

回答

8

注意name是你從記錄語法免費的功能。你可以看到它的類型ghci

λ> :t name 
name :: Person -> String 

由於你試圖++功能應用於一個名爲name而不是String功能得到一個錯誤。所以,你的代碼應該是這樣的:

greet :: Person -> String -> String 
greet person lastName = "Hi my name is " ++ name person ++ ", last name: " ++ lastName 
4

@思碧的答案是正確的,但RecordWildCards你可以得到接近你的原文:

{-# LANGUAGE RecordWildCards #-} 

data Person = Person {name :: String} 

greet :: Person -> String -> String 
greet Person{..} lastName = 
    "Hi my name is " ++ name ++ ", last name: " ++ lastName 
+0

什麼是RecordWildCards? – dopatraman

+0

@dopatraman這是所謂的語言擴展。除Haskell語言規範外,這些是一些語法或行爲。它們是編譯器特定的,但GHC支持相當數量的編譯器。其中一些有助於編寫與C庫的綁定,一些用於更高級的系統功能,另一些用於擴展語法,如上面的語法。例如,爲了讓字符串文字也可以作爲'Text'或'ByteString',你可以使用'OverloadedStrings'擴展名。有很多有趣的和有用的,但你會在學習Haskell時遇到它們。 – bheklilr