2012-09-20 63 views
0

如果我試圖寫一個簡單函數列表的整數 - 表示一個圖形並返回一個整數列表:圖表中的所有節點 例如,如果輸入是[(1, 2)(3,4)(5,6)(1,5)] o/p應該是[1,2,3,4,5,6,1,5] 該函數只是返回節點列表,在返回列表中的值可以如上重複。 我寫了以下函數簡單的函數返回整數列表

fun listofnodes((x:int,y:int):: xs)= if xs = nil then [x :: y] else [[x :: y] @listofnodes(xs )]

STDIN:15.12-15.18錯誤:操作符和操作數不贊同[tycon失配 運營商域:整數* INT列表 操作數:表達式INT * INT : X ::收率

我無法弄清楚什麼是錯的。

回答

1

首先你應該知道每個操作員做什麼: ::把個人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),被稱爲元組。

+0

謝謝你的工作......反正在你回覆之前,我已經寫了這個,它也起作用了。有趣的getlistoftuples((x,y):: xs)= x :: [y] @getlistoftuples(xs) | getlistoftuples(nil)= nil; @Gnurgen – Rpant

+0

哇我很慢回來,但我確定你現在知道,x :: [y]是相同的,只是定義列表中的兩個元素[x,y] =) – Gnurgen