Решение без использования concat
или явной рекурсии:
blend l = foldr($)[] . zipWith(.) (map(:)l) . map(:)
Мы также можем сделать это без очков
blend' = (foldr($)[].) . (.map(:)) . zipWith(.) . map(:)
Как это работает: сначала украсьте оба списка с операторами cons
\[1,2,3] [4,5,6] -> [1:, 2:, 3:] [4:, 5:, 6:]
тогда мы архивируем это вместе с составом функции
-> [(1:).(4:), (2:).(5:), (3:).(6:)]
и, наконец, сверните приложение всех этих композиций справа на пустой список
-> (1:).(4:) $ (2:).(5:) $ (3:).(6:) $ [] = 1:4:2:5:3:6:[] = [1,4,2,5,3,6]