1

我是 Haskell 的新手,我正在尝试使用:运算符将​​字符串添加到字符串列表中,但不知何故它无法正常工作......这段代码正在工作:

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

但是当我尝试sl在末尾添加字符串时,如下所示:

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

它抛出了一个错误,这对我来说没有任何意义(因为其他连接确实很顺利):

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

有谁知道为什么会这样?

4

2 回答 2

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应该是 type [t],但实际上是 type tc应该是 type t,但实际上是 type [t]。在您的示例中,tChar.

如果要将单个项目添加到列表的末尾,可以使用 concatenate (++)

xs ++ [i]

于 2013-09-29T17:54:30.820 回答
3

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

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

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

如果要将元素附加到列表中,则不能使用 operator :。您将不得不使用类似的东西:

sl:(printH header):sl:(map printR t) ++ [sl]
于 2013-09-29T17:54:20.037 回答