こんにちは皆さん、私は Haskel でマージソートを再現しようとしています。これが私のコードです:
-- merge
merge :: (Ord a) => [a] -> [a] -> [a]
merge [] [] = []
merge xs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys)
| x <= y = x:(merge xs (y:ys))
| otherwise = y:(merge (x:xs) ys)
-- split
splitIn2 :: (Ord a) => [a] -> ([a],[a])
splitIn2 [] = ([],[])
splitIn2 xs = splitAt ((length xs `div` 2)+1) xs
-- msort
msort :: (Ord a) => [a] -> [a]
msort [] = []
msort [x] = [x]
msort (xs) = merge (msort as) (msort bs)
where (as,bs) = splitIn2 xs
ghc でコンパイルされ、以下で動作します。
*Main> msort([])
[]
*Main> msort([1])
[1]
ただし、無限ループを開始し(少なくともこれは私が考えていたことです)、何も出力しないため、適切に機能しません。
他の再帰実験で行ったように、リストから要素を削除しないためだと思いますが、何か提案はありますか?