0

我需要编写一个separate类型的函数,int * 'a * 'a list -> 'a lst以便 返回在列表的每个元素之后separate (k, x, l)插入元素的列表(从列表末尾开始计数)。例如,应该返回和 应该返回。xklseparate (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
            )
4

1 回答 1

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是初始值,count并且[]是结果列表),然后在迭代的每一步减少计数。

于 2018-08-14T06:20:01.887 回答