2015-07-20 12 views
1

我是sml的新手,現在我正在試圖定義一個zip函數,它將兩個列表作爲一個元組。 這裏是代碼。 我得到它的工作,但我有幾個問題關於sml zip函數的幾個問題

exception Mismatch; 
fun zip ([],[]) = [] 
| zip ((x::xs),(y::ys)) = (x, y)::zip (xs, ys) 
| zip (_, _) = raise Mismatch; 

我可以定義例外zip函數裏面,就像讓最後,我試過了,但總是出現錯誤。

另一個問題是第二個模式匹配,我寫

zip ([x::xs],[y::ys]) = (x, y)::zip (xs, ys) 

也給我的錯誤。

Zip取一個元組,但每個元素都是列表,爲什麼我不能像其他列表一樣使用[x :: xs]?

最後一個問題,在模式匹配中,順序是否重要?我想是的,我改變了順序,得到了錯誤,只是想確保

感謝

回答

1

你不應該定義的let ... in ... end *內的異常。在let表達式之外,它不可能通過名稱來捕捉它。

*:沒關係,如果你不打算讓它從let表達式中逃脫,但是你打算在這裏做。

至於你的其他問題:

當你寫[...]中,SML編譯器將其理解爲「含...名單。」

E.g,[1]是含有1列表中,[4, 6, 2]是含有462,等等的列表。

當您編寫​​時,SML編譯器將其理解爲「該列表以x開頭,後跟列表xs」。

E.g. 1 :: []是以1開頭的列表,後面是空列表,而4 :: [6, 2]是以4開頭的列表,其次是62,依此類推。

現在,當你寫[x :: xs],你做兩者的結合,SML將其理解爲:「含有開始x名單,其次是xs列表。」

因此,通過編寫[...]而不是(...),您正在詢問另一個列表中的列表。這不是你想要的。

對於您的最終問題:是的,訂單很重要。模式按自上而下的順序進行檢查。因此,

fun foo _ = 4 
    | foo 4 = 5 

總是會返回4,而

fun foo 4 = 5 
    | foo _ = 4 

給予4時將返回5

+0

非常感謝你的解釋,所以[x :: xs]意味着列表中有兩個元素,x和xs? – hao

+0

'x :: xs'表示包含1個或更多元素的列表。 'x'是一個元素,'xs'是剩下的列表。 –