2015-06-21 74 views
2

我試圖建立一個函數作爲輸入型SML - 在列表中查找元素,並用它替換

(string*string) list 

的兩個列表,並返回相同類型的一個列表。第一個列表就像是一個「查找」列表,其中第二個元素是要搜索的元素,第一個元素是用於替換的元素。該函數的目的是查找第二個列表中的哪個元素等於第一個列表中的哪個元素。在匹配的情況下,第二個列表的元素將替換爲第一個元素中的元組的通訊元素。下面的例子:

fun check([("0","s0"),("1","s0l0s1"),("2","s1"),("3","s1l1s0")],[("s0","s0l0s1"),("s0l0s1","s1"),("s1","s1l1s0"),("s1l1s0","s0")]); 

利用這些輸入函數應該返回:

val it = [("0","1"),("1","2"),("2","3"),("3","0")] 

由於 「S0」 對應於 「0」, 「s0l0s1」 對應於 「1」, 「S1」 對應於「2」和「s1l1s0」對應於「3」。

我做了兩個功能至今:

fun check1((l1 as (x1,y1))::nil,(l2 as (x2,y2))::nil) = if x2 = y1 then [(x1,y2)] else nil 
|check1((l1 as (x1,y1))::rest1,(l2 as (x2,y2))::rest2) = 
if x2 = y1 then (x1,y2)::check1(rest1,rest2) 
else check1(rest1,l2::rest2) 

fun check2((l1 as (x1,y1))::nil,(l2 as (x2,y2))::nil) = if y2 = y1 then [(x2,x1)] else nil 
|check2((l1 as (x1,y1))::rest1,(l2 as (x2,y2))::rest2) = 
if y2 = y1 then (x2,x1)::check2(rest1,rest2) 
else check2(rest1,l2::rest2) 

第一個檢查第二列表的第一個元組和第二功能的元素檢查第二元組的元素。但他們不能正常工作。有人可以幫助我理解錯誤在哪裏? 非常感謝!

回答

2

你讓這種方式太複雜了。

第一個函數查找在第一個列表的字符串:

fun lookup ((a,b)::xs) v = if v = b then a else lookup xs v 
    | lookup nil v = v; 

而這只是一個遞歸運行在第二列表兩個元素:

fun check (xs,((a,b)::ys)) = (lookup xs a, lookup xs b)::check(xs,ys) 
    | check (xs,nil) = nil; 
+0

你是對的,謝謝! :D我仍然需要用sml工作很多 – gabribass89

+0

請注意,儘管不必要,您可以*按照您嘗試的方式進行操作,但需要一些修復和統一所有內容的第三個功能。 – L3viathan