2010-09-24 74 views
3

嗨,即時通訊對於SML和編程都很新穎,我想寫一個在列表中結合的函數,這樣 [x1,x2,x3,x4,...] = [(x1, x2),(x3,x4),...]高度讚賞任何提示或幫助我走向正確的方向。SML中的組合功能

回答

3

通過查看問題,我們很可能會想要一次處理輸入兩個項目。

那麼讓我們來看看我們想要對每對做什麼:如果x1和x2是我們目前正在查看的項目,我們希望將這對(x1, x2)放入我們創建的列表中。如果xsx1x2之後的項目列表,我們希望(x1, x2)後面跟着「合併」xs的結果。因此,我們可以將我們的組合函數編寫爲:

fun combineWithin (x1::x2::xs) = (x1, x2)::(combineWithin xs) 

但是,此定義尚未完成。我們只查看xs至少有兩個項目的情況。所以我們需要問自己在另外兩種情況下我們想要做什麼。

對於空列表很容易:結合空列表的結果是空列表。

對於只有一個項目的列表,我們可以返回空列表,或者引發錯誤(或者可能將一個項目與自身配對)。換句話說:我們需要決定是否combineWithin [1,2,3]應返回[(1,2)][(1,2), (3,3)]或發生錯誤。

如果我們決定,我們希望是前者,我們的函數變爲:

fun combineWithin (x1::x2::xs) = (x1, x2)::(combineWithin xs) 
    | combineWithin _ = [] 
-1
let rec pairs = function 
| [] -> [] 
| [x] -> [] 
| x1::x2::rest -> (x1, x2)::(pairs rest) 
+1

也就是說OCaml的語法,而不是SML。 – sepp2k 2010-09-24 10:50:53