首先你應該知道每個操作員做什麼: ::把個人elemtents到現有的列表,以便:1 :: 2 :: 3 :: [] = [1,2,3] @放兩個列表在一起,使:[1,2] @ [3,4] = [1,2,3,4]
你也可以使用::把名單在一起,但隨後它變得像一個列表的列表: [1,2] :: [3,4] = [[1,2],[3,4]]
所以通過編寫[x :: y]你應該說x和y應該變成列表中的列表。
,你不應該使用if語句來檢查列表的末尾,而不是可以使用的模式做這樣的:
fun listofnodes [] = []
| listofnodes ((x,y)::xs) = x :: y :: listofnodes(xs);
第一模式保證當我們到達的結束列表中,當你提取最後一個元組時,你的xs被綁定到一個空的列表,它將自己調用它,留下一個空列表來放入所有元素,這樣[(1,2)(3,4)(5, 6)(1,5)]將評估這樣的:
1 :: 2 :: 3 :: 4 :: 5 :: 6 :: 1 :: 5 :: [] = [1,2,3 ,4,5,6,1,5]。
你也可以做這樣的:
fun listofnodes [] = []
| listofnodes ((x,y)::xs) = [x,y] @ listofnodes(xs);
這樣你做一個小的2元單出每個元組,然後將所有這些小表合併成一個大名單。你最終不需要空列表,但是它是確保遞歸在列表末尾停止的唯一方法,並且你必須在等號的另一側放置某些東西。它評估這樣的:
[1,2] @ [3,4] @ [5,6] @ [1,5] @ [] = [1,2,3,4,5,6,1 ,5]。
你也投你的x和y爲整數,但你並不真正需要。如果你沒有,它會得到類型「('a *'a)list - >'一個列表',這隻意味着它適用於所有輸入類型,包括整數(只要元組不包含衝突類型,如char和一個int)。 即時猜測你知道這一點,但萬一你不:你叫什麼對,(1,2),被稱爲元組。
謝謝你的工作......反正在你回覆之前,我已經寫了這個,它也起作用了。有趣的getlistoftuples((x,y):: xs)= x :: [y] @getlistoftuples(xs) | getlistoftuples(nil)= nil; @Gnurgen – Rpant
哇我很慢回來,但我確定你現在知道,x :: [y]是相同的,只是定義列表中的兩個元素[x,y] =) – Gnurgen