源码及工程:https://github.com/bzhkl/haskellStudy/
module Main where import Control.Monad.Writer merge [] xs = xs merge xs [] = xs merge (x:xs) (y:ys) | x<=y = x:merge xs (y:ys) | otherwise = y:merge (x:xs) ys indent n = showString (take (4*n) (repeat ' ')) nl = showChar '\n' mergesort :: Int -> [Int] -> Writer String [Int] mergesort l [] = do return [] mergesort l s@[x] = do return [x] mergesort l s@xs = do tell $ (indent l.showString "mergesort: ".shows s.showString "\n") "" let (a1,a2) = splitAt (length s `div` 2) xs curMergeResult <- liftM2 merge (mergesort (l+2) a1) (mergesort (l+2) a2) tell $ (indent l.showString "after merge: " .shows curMergeResult) "\n" return curMergeResult main :: IO () main = do let res = runWriter $ mergesort 0 [5,4,3,10,9,101,2,1] putStrLn $show $ fst $res putStrLn $ snd $ res
运行输出:
[1,2,3,4,5,9,10,101] mergesort: [5,4,3,10,9,101,2,1] mergesort: [5,4,3,10] mergesort: [5,4] after merge: [4,5] mergesort: [3,10] after merge: [3,10] after merge: [3,4,5,10] mergesort: [9,101,2,1] mergesort: [9,101] after merge: [9,101] mergesort: [2,1] after merge: [1,2] after merge: [1,2,9,101] after merge: [1,2,3,4,5,9,10,101]
编译依赖的库:
build-depends: base >= 4.7 && < 5 , mtl