私はちょうどこれに困惑しています、それは私が書く方法を理解することができないハスケルループソートのものです。基本的には、私は3つの関数split,リフルとシャッフルを定義しました。Haskellでの関数のルーピング
riffle [1,2,3] [4,5,6] = [1,4,2,5,3,6]
をシャッフルの分割量とrifflingを反復することである。
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
は、基本的にはちょうど半分にリストを分割例えばので、リフルは、二つのリスト「インターレース」になっている分割しましたリストアイテム。今度は関数を定義する必要があります。は、元のリストを再度取得するためにシャッフルの繰り返し回数を出力します。機能は、次のように定義されます
repeats :: [Int] -> Int
私はちょうど私がそれはリスト内包とは何かを持っていると思う...あなたがシャッフルをループを実行することができますどのようにとこだわってますが、私は何かを得ることができませんでした。私はラムダ式をまだ試していないが、それは必要ではないと思う。ちなみに、シャッフルは偶数項目のリストで行う必要があります。何か案は?
@hammarが記述しているように 'tail $ iterate'でリストを生成し、[' elemIndex'](http://hackage.haskell.org/packages/archive/base/latest/doc/html/)を使うこともできます。 Data-List.html#v:elemIndex)を使用して、再帰のインデックスを検索します。 – dflemstr