2012-07-19 241 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

相關問題