SML 中的递归函数

Recursive function in SML

我在 SML 上苦苦挣扎,因为我的硕士论文需要它,但我以前从未使用过。 我需要定义一个函数,它将一个元组列表作为输入: (字符串 * 字符串 * 字符串) 列表

和 return 不同种类元组的列表: ((字符串 * (字符串 * 字符串 * 字符串)) * ((字符串 * 字符串 * 字符串) * 字符串)) 列表

问题是我正在使用递归概念来创建动态列表,但我找不到方法。到目前为止我的代码是:

fun insertRelationLts ((x,y,z),nil) = 
        let val h=(x,y,z)
        in [((x,h),(h,z))]
        end
| insertRelationLts ((x,y,z),(a,b,c)::(d,e,f)) = 
        let val h=(x,y,z)
            val q=x
            val w=z
        in ((q,h),(h,w))::insertRelationLts((a,b,c),(d,e,f))     
        end

希望有人能帮助我。非常感谢!

cons 运算符 :: 需要右侧的列表,但元组 (d,e,f) 不是一个。也没有理由对其进行模式匹配,因此只需将两次出现的 (d,e,f) 替换为一个变量,它就应该进行类型检查。你也可以稍微简化一下:

fun insertRelationLts (h as (x,y,z), nil) = [((x,h),(h,z))]
  | insertRelationLts (h as (x,y,z), t::rest) = 
      ((x,h),(h,z))::insertRelationLts(t, rest)     

但是,我建议使用记录或至少使用一些类型缩写以更加清晰。

编辑:实际上,无需显式递归即可更轻松地表达此函数:

fun insertRelationsLts (h, list) =
    map (fn h as (x,y,z) => ((x,h), (h,z))) (h::list)