在SML中编写多个函数 - 顺序组合

时间:2014-03-03 02:46:52

标签: sml composition sequential

我想了解顺序组合如何在SML中比我现在做得更好。我必须编写一个程序,它接受一个整数列表,并将索引为零的整数移动到列表中的最后一个索引。即。 [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

问题在于我的其他陈述,我想要发生的事情是先将第一个词连接到最后一个词,然后再将第二个词连接到第一个词。这看起来很简单,我只是不明白如何使用SML以特定顺序执行多个功能。我的理解是,第一个被调用的函数具有第二个函数的范围,它具有第三个函数的范围......等等。我在这里做错了什么?

1 个答案:

答案 0 :(得分:4)

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]