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