【问题标题】:Recursive function in SMLSML 中的递归函数
【发布时间】:2015-06-19 00:27:39
【问题描述】:

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

并返回不同类型元组的列表: ((string * (string * string * string)) * ((string * string * string) * string)) 列表

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

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

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

【问题讨论】:

    标签: function recursion sml ml


    【解决方案1】:

    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)
    

    【讨论】:

    • 非常感谢!你的回答真的很有用! :)
    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多