haskell添加项目列表不起作用

时间:2013-09-29 17:46:04

标签: arrays list 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'
...

有谁知道为什么会这样?

2 个答案:

答案 0 :(得分: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]类型,但实际上类型为tc的类型应为t,但实际上属于[t]类型。在您的示例中,tChar

如果要在列表末尾添加单个项目,可以使用连接(++)

xs ++ [i]

答案 1 :(得分:3)

运算符:用于元素添加到列表中。在你的表达

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

前三个表达式(slprintH headersl)是列表元素(显然是字符串),而第四个表达式(map printR t)是列表元素将这些添加到。

如果您想将追加元素添加到列表中,则无法使用运算符:。你将不得不使用类似的东西:

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