4

我不明白这个——

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> 

为什么那也不返回“这里”?

4

3 回答 3

12

类型。在 GCHi 中试试这个:

Prelude> :t (:)
(:) :: a -> [a] -> [a]
Prelude. :t (++)
(++) :: [a] -> [a] -> [a]
于 2012-07-19T21:36:44.420 回答
6

我现在明白了。第一个运算符必须是元素,而不是列表。

所以如果我这样做'h':"ithere"了,它会返回"hithere"

于 2012-07-19T21:34:20.453 回答
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
于 2012-07-20T00:07:17.297 回答