2012-07-19 219 views
4

我不明白th​​is--++和:haskell之间的区别是什么?

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

回答

11

的类型。在GCHI试试这个:

Prelude> :t (:) 
(:) :: a -> [a] -> [a] 
Prelude. :t (++) 
(++) :: [a] -> [a] -> [a] 
+0

谢谢你给我介绍':t'! – Micah 2012-07-19 21:49:33

+0

@Micah:尝试':help' – 2012-07-19 22:13:00

+1

@Micah:其他真正有用的是':info',它可以给你很多关于类型的信息。 – 2012-07-19 22:13:24

6

我现在明白了。第一个操作符需要是一个元素,而不是一个列表。

所以,如果我没有'h':"ithere"它将返回"hithere"

+1

请不要发布言论,作为一个回答你的问题。您可以添加评论。 – fuz 2012-07-19 21:37:35

+0

即使我的评论是答案? – Micah 2012-07-19 21:42:30

+0

如果这是对您的问题的真实答案,您应该将其作为答案张贴,这是正确的。但是这个帖子不是你的问题的答案;这只是一个评论。 – fuz 2012-07-19 21:53:30

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 
+0

请注意,唯一阻止这是真正的Haskell语法的是'[]'。你确实可以添加数据构造函数(例如Data.Ratio的':%',它们必须以':'开始,就像前缀数据的构造函数必须以大写字母开头),甚至是类型构造函数(' - >'是一个这样的中缀型构造函数) – Jedai 2012-07-20 21:12:14

相关问题