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

SML - Find element in a list and substitute it

我正在尝试构建一个函数,它将两个

类型的列表作为输入
(string*string) list

和 return 是同一类型的一个列表。第一个列表类似于 "lookup" 列表,其中第二个元素是要搜索的元素,第一个元素是要用于替换的元素。该函数的目的是找出第二个列表中的哪个元素等于第一个列表中的哪个元素。在匹配的情况下,第二个列表的元素将替换为第一个元素中元组的相应元素。下面是一个例子:

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

有了这些输入,函数应该 return:

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)

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

你把这种方式搞得太复杂了。

第一个函数在第一个列表中查找字符串:

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;