【问题标题】:Writing multiple functions in SML - Sequential Composition在 SML 中编写多个函数 - 顺序组合
【发布时间】:2014-03-03 02:46:51
【问题描述】:

我想了解顺序组合如何比我现在在 SML 中做得更好。我必须编写一个程序,该程序采用整数列表并将索引零处的整数移动到列表中的最后一个索引。 IE。 [4, 5, 6] -> [5, 6, 4]。

我现在的代码是:

- fun cycle3 x =
= if length(x) = 1 then x
= else (List.drop(x, 1);
= x @ [hd(x)]);
val cycle3 = fn : 'a list -> 'a list

问题在于我的 else 语句,我想要发生的是首先将第一个术语连接到末尾,然后再删除第一个术语。看起来很简单,我只是不明白如何使用 SML 以特定顺序执行多个功能。我的理解是,调用的第一个函数具有第二个函数的范围,而第二个函数的范围将具有第三个函数的范围......等等等等。我在这里做错了什么?

【问题讨论】:

    标签: sml composition sequential


    【解决方案1】:

    SML 中的大部分内容都是不可变的——您的函数不是修改列表,而是构建一个新列表。 List.drop(x,1) 计算为一个新列表,该列表由 x 的第一个元素以外的所有元素组成,但不修改 x

    要使用您的方法,您可以将List.drop(x,1) 的结果绑定到一个变量,如下所示:

    fun cycle3 x = if length x = 1
                   then x
                   else let
                          val y = List.drop(x,1)
                        in
                          y @ [hd(x)]
                        end
    

    或者,做同样事情的一种更简洁的方法,它也可以处理空列表的可能性:

    fun cycle3 [] = []
      | cycle3 (x::xs) = xs @ [x]
    

    【讨论】:

    • 非常感谢,这很有帮助。我要读一下'in'。再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2018-07-10
    • 2013-12-29
    • 1970-01-01
    • 2020-12-10
    相关资源
    最近更新 更多