我不明白 -
Prelude> "hi"++"there"
"hithere"
Prelude> "hi":"there"
<interactive>:12:6:
Couldn't match expected type `[Char]' with actual type `Char'
Expected type: [[Char]]
Actual type: [Char]
In the second argument of `(:)', namely `"there"'
In the expression: "hi" : "there"
Prelude>
为什么不回归“hithere”?
答案 0 :(得分:12)
类型。在GCHi中试试这个:
Prelude> :t (:)
(:) :: a -> [a] -> [a]
Prelude. :t (++)
(++) :: [a] -> [a] -> [a]
答案 1 :(得分:6)
我现在明白了。第一个运算符需要是元素,而不是列表。
所以,如果我'h':"ithere"
,它将返回"hithere"
答案 2 :(得分:4)
运算符:
是列表的构造函数之一。因此"hello"
是'h':'e':'l':'l':'o':[]
。您可以想象列表被定义为:(不是真正的haskell语法)
data List a = (:) a (List a) | []
:
通过获取元素和列表来构造列表。这就是类型为a->[a]->[a]
的原因。
++
是使用:
作为基元定义的:
(++) :: [a] -> [a] -> [a]
(++) [] ys = ys
(++) (x:xs) ys = x : xs ++ ys