SML - 列表字符串的递归函数

时间:2015-06-02 12:35:20

标签: string list recursion sml

我需要你的帮助! 我正在尝试创建一个函数,它将两个

类型的元素作为输入
    (string*string*string) list 

    (string*string) list

并返回

类型的元素
    (string*string) list 

以特定方式操纵。 我需要这样的东西:

    returnString(([("s0","l0","s1"),("s1","l1","s0")]),([("s0","phi1"),("l0","chi1"),("l1","chi2"),("s1","phi2")])); 

接受这些输入的函数应该返回我:

    val it = [(("s0l0s1","chi1"),("s1l1s0","chi2"))]

应该是: 如果是第一个输入元素的第二个字符串

    (string*string*string) 

对应于第二个输入元素的第一个字符串

    (string*string) 

然后我会把我需要的元素放在列表中,否则我会继续检查。

我尝试了很多方法...使用递归函数,使用地图函数...但我对这种语言有点新意,我找不到办法,因为sml不容易处理循环。

如果你帮助我,或者你有一些提示,我将非常感激。

非常感谢大家!

1 个答案:

答案 0 :(得分:1)

如果代码中的解释有意义,请告诉我。

fun example (xss, yss) =
  case (xss, yss) of
    (* If the 1st list is empty, then the result is an empty list. *)
    ([], _) => []
    (* If the 2nd list is empty, then the result is also an empty list. *)
  | (_, []) => []
    (* Otherwise, we decompose the tuples in the two lists *)
  | ((a, b, c) :: xs, (x, y) :: ys) =>
      (* verify that our condition holds *)
      if b = x then
        (* in which case we have a solution and recurse with the rest *)
        (a ^ b ^ c, y) :: example (xs, ys)
      else
        (* otherwise, we recurse with the first list intact, but skip the *)
        (* current element in the second list. *)
        example (xss, ys)

另外,请查看this answer of mine,了解如何在标准ML中调用函数。