我是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'
...
有谁知道为什么会这样?
答案 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]
类型,但实际上类型为t
,c
的类型应为t
,但实际上属于[t]
类型。在您的示例中,t
为Char
。
如果要在列表末尾添加单个项目,可以使用连接(++)
:
xs ++ [i]
答案 1 :(得分:3)
运算符:
用于将元素添加到列表中。在你的表达
sl:(printH header):sl:(map printR t)
前三个表达式(sl
,printH header
和sl
)是列表元素(显然是字符串),而第四个表达式(map printR t
)是列表元素将这些添加到。
如果您想将追加元素添加到列表中,则无法使用运算符:
。你将不得不使用类似的东西:
sl:(printH header):sl:(map printR t) ++ [sl]