Как добавлять элементы в список каждый n-й тур?

Мне нужно написать функцию 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 ответ

На самом деле логика совершенно правильная, но она должна быть реализована путем передачи измененного состояния в другую итерацию 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 а также [] является результирующим списком), а затем уменьшать счетчик на каждом шаге итерации.

Другие вопросы по тегам