有什么区别++和:在haskell中?

时间:2012-07-19 21:32:03

标签: haskell ghci

我不明白 -

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”?

3 个答案:

答案 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