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

标签 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)

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

最佳答案

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

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

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;

关于string - SML - 在列表中查找元素并替换它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30963345/

相关文章:

python - 在 Python 中,如何在保留词序的同时从两个列表中找到常用词?

python - 将具有单个元素和列表的列表转换为平面列表

linux - 如何在 unix 中格式化带有目录名的文件列表?

php - 如何为 imagecolorallocate 指定颜色?

c# - 使通用扩展方法正常工作的问题

java - 数组列表和文件

arrays - Matlab,找到最小值的索引,条件是它必须为负

regex - 尽管使用了 regextypeegrep,为什么 GNU find 实用程序在正则表达式和 egrep 上生成不同的匹配项?

string - MATLAB 中的数字到字符串的转换

c++ - 将 C++ 本地字符串返回给另一个函数