我想了解顺序组合如何在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以特定顺序执行多个功能。我的理解是,第一个被调用的函数具有第二个函数的范围,它具有第三个函数的范围......等等。我在这里做错了什么?
答案 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]