Это называется "молнией". Вы можете использовать zip :: [a] -> [b] -> [(a, b)]
. Действительно, например:
Prelude> zip [1,2,3] [4,5,6]
[(1,4),(2,5),(3,6)]
Вы можете реализовать свой собственный zip
с помощью явной рекурсии. Если один из двух списков (или оба) пуст, то результатом является пустой список. Если оба списка не пустые, вы должны получить 2 кортежа из двух голов списка и выполнить рекурсивный переход на двух хвостах.
Таким образом, программа будет выглядеть так:
zip' :: [a] -> [b] -> [(a, b)]
zip' [] _ = …
zip' _ [] = …
zip' (x:xs) (y:ys) = …
с …
частями, которые необходимо заполнить.