2012-03-25 84 views
0

我一直試圖解決這對元組問題,其中輸入是元組列表,輸出是列表元組,其中每個元組的第一個元素分組在一起,並與第二個元素類似即[(1,2),(3,4),(5,6)] - >([1,3,5],[2,4,6]))。SML對元組轉換

我想過這個代碼,但它給了我一個錯誤:

fun convert L = foldl (fn ((x,y),(u,v)) => (([email protected]),([email protected])) ([],[]) L; 

任何建議的解決?

回答

3

級聯(@)需要兩個列表,但是x和y的值,所以你需要用[]來包裝他們做一個單元素列表:

fun convert l=foldl (fn((x,y),(u,v))=>([email protected][x],[email protected][y])) (nil,nil) l 

可以使用利弊,而不是串聯,儘管返回的元組內的列表是相反的:

fun convert l=foldl (fn((x,y),(u,v))=>(x::u,y::v)) (nil,nil) l 
1

@連接列表(並且xy不是列表)。

嘗試([email protected][x],[email protected][y])

但是,請注意,追加是線性時間操作,而預先計算(即x :: u)是恆定的。正如Alex指出的那樣,這將以相反的方式構建您的列表,但您也可以通過反向處理您的輸入來解決此問題 - 即使用foldr而不是foldl