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

在SML中编写多个函数-顺序组合,sml,composition,sequential,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 问题在于我的else语句,我想做的是首先将第一个术语连接

我想了解顺序组合是如何比我现在在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

问题在于我的else语句,我想做的是首先将第一个术语连接到末尾,然后再删除第一个术语。这似乎很简单,我只是不明白如何使用SML以特定的顺序执行多个函数。我的理解是,调用的第一个函数的作用域与第二个函数的作用域相同,第二个函数的作用域与第三个函数的作用域相同。。等等。。这里我做错了什么?

SML中的大多数东西都是不可变的——您的函数不是修改列表,而是构建一个新列表<代码>列表。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]

SML中的大多数内容都是不可变的——您的函数不是修改列表,而是构建一个新列表<代码>列表。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”的文章。再次感谢非常感谢,这很有帮助。我要读一读关于“in”的文章。再次感谢