String SML-在列表中查找元素并替换它
我正在尝试构建一个函数,它以两个类型列表作为输入String SML-在列表中查找元素并替换它,string,list,find,sml,substitution,String,List,Find,Sml,Substitution,我正在尝试构建一个函数,它以两个类型列表作为输入 (string*string) list 并返回一个相同类型的列表。第一个列表类似于“查找”列表,其中第二个元素是要搜索的元素,第一个元素是要用于替换的元素。函数的目的是找出第二个列表中的哪个元素等于第一个列表中的哪个元素。在匹配的情况下,第二个列表的元素将替换为第一个元素中元组的对应元素。下面是一个例子: fun check([("0","s0"),("1","s0l0s1"),("2","s1"),("3","s1l1s0")],[("s0
(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)
第一个函数检查第二个列表的第一个元组的元素,第二个函数检查第二个元组的元素。但它们不能正常工作。有人可以帮助我理解错误在哪里?
非常感谢 你把这条路弄得太复杂了 此第一个函数在第一个列表中查找字符串:
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;
你说得对,谢谢D我仍然需要与smlNote进行大量的合作。注意,虽然没有必要,但您可以按照您尝试的方式进行,但它需要一些修复和第三个函数来统一所有内容。