2013-09-29 61 views
1

我是新來的Haskell,我試圖添加一個字符串使用:運算符的字符串列表,但不知何故它不能正常工作......此代碼正在工作:haskell將項目添加到列表不工作

sl:(printH header):sl:(map printR t) 

,但是當我嘗試添加字符串sl上月底爲好,像這樣:

sl:(printH header):sl:(map printR t):sl 

它拋出了一個錯誤,這沒有任何意義,我(sincwe其他連接確實順利):

Couldn't match type '[Char]' with 'Char' 
Expected type: [String] -> Char 
    Actual type: [String] -> String 
In the first argument of 'map', namely 'printR' 
... 

有誰知道爲什麼會發生這種情況?

回答

5
Prelude> :type (:) 
(:) :: a -> [a] -> [a] 

這告訴你,(:)函數取左側和右側的列表中的單個項目。鑑於:

a :: t 
b :: t 
c :: [t], 

a:b:c解析爲a:(b:c),它的工作原理,因爲表達式b:c[t]型。同時,b:c:a解析爲b:(c:a),這是不行的,因爲c:a病類型的:a應該[t]型的,但實際上是t類型,ct型的,但實際上是[t]型。在你的例子中,tChar

如果您希望在單個項目添加到列表的末尾,你可以使用串聯(++)

xs ++ [i]

3

:用於前置到一個列表中的一個元素。在表達式

sl:(printH header):sl:(map printR t) 

第一三個表達式(slprintH headersl)是列表元素(字符串,顯然),而第四個(map printR t)是前面加上那些到列表中。

如果你想附加一個元素的列表,你不能使用運營商:。你將不得不使用這樣的:

sl:(printH header):sl:(map printR t) ++ [sl]