2014-10-16 49 views
0

我目前正在學習haskell,然後我來到這個練習中,我必須定義一個函數來獲取數字列表的結果。我被提供了選擇,並且因爲我是哈斯克爾的新手,所以有一些符號我有點不清楚。冒號與括號中的haskell列表語法

所以我看到的選擇一個這樣的定義:

p [x, xs] = x * product xs 

我能理解這個相當多,就意味着拿到名單的產物,然後用x的值相乘。

然後我看到了其他的選擇之一這個其他的定義:

p (x : xs) = x * product xs 

我完全不明白。它使用括號和冒號,我很難找到它們的定義。我很感激有人可以在語法和語義方面給我啓發。

+3

需要注意的是,語法'[x,y,z]'是'x:y:z:[]'的語法糖。實際上,列表的定義看起來非常像'data [] a = [] | a:([] a)'。 ':'是數據類型'[a]'的構造函數,你只是在構造函數上進行模式匹配。因爲我們是程序員,並且喜歡用'[1,2,3]'而不是'1:2:3:[]'來編寫列表,所以編譯器有特殊的規則來將前者變成後者。當你看到'(x:xs)'形式的模式時,記住這一點。 – bheklilr 2014-10-16 15:05:30

+2

第一個例子看起來不像它應該類型檢查... – MathematicalOrchid 2014-10-16 15:54:45

+1

@自己:不,它可能是類型檢查,因爲有人可以編寫'實例Num []'... – MathematicalOrchid 2014-10-16 16:39:49

回答

2

:是利弊經營者,其中一個元素追加到列表

(x : xs)是模式匹配的列表爲元素x和列表的其餘部分xs

讓我們得到一個具體的例子:

l = [1,2,3] 

show_rest_of_list (x:xs) = xs 

show_rest_of_list l 
-- would return [2,3] 

play_with_list (x:xs) = x : x : xs 

play_with_list l 
-- would return [1,1,2,3] 
+0

有趣的是,這個例子讓我明白更好。我必須在我的ghci中試試這個 – it2051229 2014-10-16 15:22:28

3

[x, xs]是一個包含兩個元素的列表。第一個元素稱爲x,第二個元素稱爲xs。所以在這種情況下,product xs不計算列表的乘積,它計算第二個元素的乘積。由於列表中的元素不能是列表本身(否則與x相乘將不起作用),這是一種類型錯誤。

x : xs是一個包含至少一個元素的列表。其第一個元素叫做x,包含其餘元素的列表被稱爲xs