SML - 在列表中查找元素并替换它

时间:2015-06-21 10:08:03

标签: string list find sml substitution

我正在尝试构建一个函数,它将两个类型列表作为输入

(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)

第一个检查第二个列表的第一个元组的元素,第二个函数检查第二个元组的元素。但它们不能正常工作。有人可以帮我理解错误在哪里? 非常感谢!

1 个答案:

答案 0 :(得分: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;