翻转列表ML中的备用元素

时间:2015-10-29 01:05:37

标签: sml smlnj ml

我已经写了一个函数来翻转列表中的替代元素,但是我必须调用它,然后调用它的方法(我是ML的新手,所以如果我使用的是错误的术语,我会道歉)。我宁愿只调用函数而不必调用其中的方法。这就是我现在要做的事情:

(*3. Flip alternate elements in a list, if n = odd, element n remains at end*)
fun flip nil x = x
  | flip x nil = x
  | flip (x::xs) (y::ys) = x::y::flip xs ys;

fun take l =
    if l = nil then nil
    else hd l::skip (tl l)

and skip l =
    if l = nil then nil
    else take (tl l);

但是当我把它称为反转元素时,我不得不称之为:

flip (skip d) (take d);
flip (skip e) (take e);

有没有办法把这个函数称为:

flip (d);

如果我现在拨打flip (d);,则只打印

val take = fn : ''a list -> ''a list
val skip = fn : ''a list -> ''a list

提前谢谢大家!

编辑:我应该提到d只是一个整体列表:

val d = [1,2,3,4];

1 个答案:

答案 0 :(得分:2)

假设"翻转列表中的备用元素"意味着将[1,2,3,4,5,6]转换为[2,1,4,3,6,5],如果长度为奇数则丢弃最后一个元素,那么您只需通过单个函数中的模式匹配即可实现此目的:

fun flip (x::y::xs) = y::x::flip xs
  | flip _ = []

有关您的代码段的一些反馈:

  • 你的许多括号都是不必要的。
  • 请勿使用hd / tl,而应使用模式匹配。
  • 实际翻转发生在takeskip

    flip可以恰当地称为merge

  • 如果是这种情况,为了解决flip所以它只需要一个参数:

    fun flip xs = merge (skip xs) (take xs)
    

    能够使用更多参数创建辅助函数并调用它们非常有用。