2016-06-30 11 views
1

を返さない私の実装です:私はそれ私のマシンがクラッシュを実行したときにHaskellのマージソートの実装では、コンパイルが、ここでは何も

mergesort :: (Ord a) => [a] -> [a] 
mergesort list = merge (mergesort (left list)) (mergesort (right list)) 
    where 
    left xs = take (div (length xs) 2) xs 
    right xs = drop (div (length xs) 2) xs 
    merge [] ys = ys 
    merge xs [] = xs 
    merge (x:xs) (y:ys) 
     | x <= y = x : merge xs (y:ys) 
     | otherwise = y : merge (x:xs) ys 

コードがコンパイルされますが。私は間違って何をしていますか?

+0

オリジナル*コードに空文字が含まれていましたか? *そうでない場合は、その編集をロールバックしてください。彼の答えでその事例への参照を取り除くことができるように、アレックに知らせてください。 – Bakuriu

+0

正しい答えを表示する必要があります。ごめんなさい! – dopatraman

答えて

3

基本ケースがないため、無限の再帰が発生します。 []または[1]のようなリストを使ってあなたの例を進めてみると、問題に直面するでしょう。

mergesort :: (Ord a) => [a] -> [a] 
mergesort [] = [] -- < ADDED 
mergesort [x] = [x] -- < ADDED 
mergesort list = merge (mergesort (left list)) (mergesort (right list)) 
    where 
    left xs = take (div (length xs) 2) xs 
    right xs = drop (div (length xs) 2) xs 
    merge [] ys = ys 
    merge xs [] = xs 
    merge (x:xs) (y:ys) 
     | x <= y = x : merge xs (y:ys) 
     | otherwise = y : merge (x:xs) ys 
関連する問題