2010-10-18 58 views
2

我做的:類型的錯誤

Prelude> "sone" ++ "otehr" 
"soneotehr" 

但這樣的代碼:

addOneToElement :: [a] -> [a] 
addOneToElement element = element ++ "next" 

main = do 
    let s = addOneToElement("some") 
    putStrLn s 

產生這樣的輸出:

all_possible_combinations.hs:22:37: 
    Couldn't match expected type `a' against inferred type `Char' 
     `a' is a rigid type variable bound by 
      the type signature for `addOneToElement' 
      at all_possible_combinations.hs:21:20 
     Expected type: [a] 
     Inferred type: [Char] 
    In the second argument of `(++)', namely `"next"' 
    In the expression: element ++ "next" 

爲什麼我得到這個錯誤,我怎麼能解決它?

+4

此外,你可以(也應該,這是毫無意義和困惑)放棄功能調用的parens。 – delnan 2010-10-18 11:40:26

回答

6

你的類型的簽名應該是:

addOneToElement :: [Char] -> [Char] 

(或者更簡單地說,addOneToElement :: String -> String

的 「a」 在您的類型簽名是一個通配符 - 它可以匹配任何東西。但是,您試圖將Char列表連接到任何列表 - 並且沒有辦法做到這一點。

+0

謝謝,我明白了。 – demas 2010-10-18 11:29:21

+1

當你說數組時,你的意思是列表。 – sepp2k 2010-10-18 11:29:49

+0

乾杯,固定。我是白天的C++程序員,我的手指在自動駕駛。 – stusmith 2010-10-18 11:34:36

1

爲什麼你在這裏使用類型變量呢?由於(++)的第二個操作數固定爲[Char]"next"),所以可以與匹配的唯一類型是Char