2015-02-11 6 views
3

Я просто изучаю Haskell, и я хотел бы сделать функцию «перетасовки», которая перемешивает два списка, чередуясь, пока не закончится. Итак, shuffle "abc" "defgh" вернется "adbecfgh". Или shuffle "abc" """abc".Смешайте два списка в Haskell

До сих пор у меня есть:

shuffle xs ys = concatMap (\(x,y) -> [x,y]) (zip xs ys) 

Проблема заключается в том, что это только перетасовки списков для длины кратчайшего списка и не включая остальную часть длинного списка. Таким образом, shuffle "abc" "defgh" возвращает "adbecf", а не "adbecfgh".

Может ли кто-нибудь помочь мне найти лучший подход к этому?

+0

Также [список перемежения списков] (http://stackoverflow.com/questions/14186433/interleave-list-of -lists-in-haskell) похож, но немного более общий. – phadej

ответ

9

Вы могли бы просто дать определение точечно:

shuffle :: [a] -> [a] -> [a] 
shuffle [] ys = ys 
shuffle xs [] = xs 
shuffle (x:xs) (y:ys) = x : y : shuffle xs ys 

Каждый zip* метод Prelude или Data.List не будет работать, так как они будут принимать только длину более короткого списка.

7

Другой, немного короче, способ сделать это точечно, как это было предложено Zeta:

shuffle :: [a] -> [a] -> [a] 
shuffle [] ys = ys 
shuffle (x:xs) ys = x : shuffle ys xs 
Смежные вопросы