如何在第n轮添加元素到列表?

时间:2018-03-03 16:29:19

标签: list sml ml mosml

我需要 编写separate类型的函数int * 'a * 'a list -> 'a lst separate (k, x, l)返回在列表x的每个k元素之后插入元素l的列表(从 列表的结尾)。例如,separate (1, 0, [1,2,3,4])应该返回[1,0,2,0,3,0,4]separate (3, 0, [1,2,3,4])应该返回[1,0,2,3,4]

到目前为止,这就是我所拥有的,但它导致了错误。任何人都可以帮助我吗?

fun separate (k: int, x: 'a, l: 'a list) : 'a list =
   let val count:int = k
    in foldr(
        (fn (h, t) =>
            if count = 0
            then count := 1 in
               x::h::t 
            else count = count + 1 : int
                h::t
            )

1 个答案:

答案 0 :(得分:0)

实际上,逻辑是正确的,但是由于不可变性,应该通过将更改的状态传递到foldr的另一个迭代中来实现:

fun separate (k: int, x: 'a, l: 'a list) : 'a list =
  #2 (foldr (fn (h, (count, t)) =>
      if count = 0
      then (k - 1, h::x::t)
      else (count - 1, h::t)
    ) (k, []) l);

因此,我们不使用元组count(其中foldr(k, [])和{的初始值)来初始化k作为变量。 {1}}是结果列表),然后在迭代的每个步骤中减少计数。