Я хочу сделать функцию zip, которая будет заключать два ленивых списка в один.Например, ленивый список, показанный как обычный список для большей читабельности, zip [1; 3; 5; 7; 9; 11] [2; 4; 6; 8], возвращает [1; 2; 3; 4; 5; 6; 7; 8; 9; 11].
Я делаю эту функцию:
type 'a lazyList = LNil | LCons of 'a * (unit -> 'a lazyList);;
let zip list1 list2 =
let rec zipHelper listA listB count = match (list1, list2) with
| (LCons(xA, xfA), LCons(xB, xfB)) ->
if (count mod 2 == 0)
then LCons(xA, function() -> zipHelper (xfA()) (xfB()) (count + 1))
else LCons(xB, function() -> zipHelper (xfA()) (xfB()) (count + 1))
| (LCons(x, xf), LNil) -> LCons(x, function() -> zipHelper (xf()) LNil count)
| (LNil, LCons(x, xf)) -> LCons(x, function() -> zipHelper (xf()) LNil count)
| (LNil, LNil) -> LNil
in zipHelper list1 list2 0
;;
let rec ltake = function
| (0, _) -> []
| (_, LNil) -> []
| (n, LCons(x, xf)) -> x :: ltake(n - 1, xf())
;;
let a = (LCons(1, function() -> LCons(3, function() -> LCons(5, function() -> LCons(7, function() -> LCons(9, function() -> LCons(11, function() -> LNil)))))));;
let b = (LCons(2, function() -> LCons(4, function() -> LCons(6, function() -> LCons(8, function() -> LNil)))));;
ltake (12, zip a b);;
Функция ltake помогает в тестировании, она возвращает ленивый список в обычный список.Теперь моя функция zip возвращает меня [1; 2; 1; 2; 1; 2; 1; 2; 1; 2; 1; 2].