We're a place where coders share, stay up-to-date and grow their careers.
import Control.Arrow (arr, (&&&)) faroShuffle :: [a] -> [a] faroShuffle a = let d = length a `div` 2 in concat $ uncurry (zipWith (\a b -> [a, b])) $ (arr (take d)) &&& (arr (drop d)) a
i feel in my bones there's wholly point-free way to do it but can't quite get there right now
I managed to get it point free!
import Control.Arrow (arr, (&&&)) faroShuffle :: [a] -> [a] faroShuffle = concat . uncurry (zipWith (\a b -> [a, b])) . uncurry splitAt . ((arr ((`div`2) . length)) &&& (arr id))
I remember looking for the splitAt function when I was writing my first answer, not sure how I missed it in hoogle.
splitAt
Also, I've never seen Control.Arrow before (I'm pretty new to Haskell). Seems useful.
Control.Arrow
i feel in my bones there's wholly point-free way to do it but can't quite get there right now
I managed to get it point free!
I remember looking for the
splitAt
function when I was writing my first answer, not sure how I missed it in hoogle.Also, I've never seen
Control.Arrow
before (I'm pretty new to Haskell). Seems useful.