私はこれに戸惑っています。これはHaskellのループのようなもので、書き方がわかりません。基本的に、split、riffle、shuffleの3つの関数を定義しました。
split :: [a] -> ([a],[a])
split xs = splitAt (length xs `div` 2) xs
riffle :: [a] -> [a] -> [a]
riffle xs [] = xs
riffle [] ys = ys
riffle (x:xs) (y:ys) = x:y:riffle xs ys
shuffle :: Int -> [a] -> [a]
shuffle 0 xs = xs
shuffle n xs = shuffle (n-1) (riffle a b)
where (a, b) = split xs
基本的にsplitはリストを半分に分割するだけで、riffleは2つのリストを「インターレース」することになっているので、たとえば次のようになります。
riffle [1,2,3] [4,5,6] = [1,4,2,5,3,6]
そしてシャッフルは、リストアイテムの分割とリフリングの量を繰り返すことです。次に、元のリストを再度取得するために必要なシャッフルの反復回数を出力する関数repeatsを定義する必要があります。関数は次のように定義されます。
repeats :: [Int] -> Int
シャッフルをループする方法に固執しています...リスト内包表記と関係があると思いますが、何も得られませんでした。ラムダ式はまだ試していませんが、必要ないと思います。ちなみに、シャッフルは偶数のリストで行う必要があります。何か案は?