# HG changeset patch # User Yasutaka Higa # Date 1424841799 -32400 # Node ID 861e3566546904af2b2b79fb0806452a8dc97527 # Parent 957496efbe5d7841e3656d219cb6659a6aab7e4b Add sort example using Delta/DeltaM diff -r 957496efbe5d -r 861e35665469 .hgignore --- a/.hgignore Sun Feb 15 17:44:20 2015 +0900 +++ b/.hgignore Wed Feb 25 14:23:19 2015 +0900 @@ -1,5 +1,7 @@ syntax: glob +.DS_Store + *.swp *.*~ *.agdai diff -r 957496efbe5d -r 861e35665469 haskell/Example/Delta.hs --- a/haskell/Example/Delta.hs Sun Feb 15 17:44:20 2015 +0900 +++ b/haskell/Example/Delta.hs Wed Feb 25 14:23:19 2015 +0900 @@ -20,3 +20,28 @@ numberCount :: Int -> Delta Int numberCount x = generator x >>= numberFilter >>= count + +sort :: [Int] -> Delta [Int] +sort xs = deltaFromList [ bubbleSort xs, + singleSort xs, + swapPair xs, + identity, + nil + ] + where + nil = [] + identity = xs + + swapPair [] = [] + swapPair [x] = [x] + swapPair (x:xx:xs) = (min x xx) : (max x xx) : xs + + singleSort [] = [] + singleSort xs = (minimum xs) : (singleSort (filter (/= (minimum xs)) xs)) + + bubbleSort [] = [] + bubbleSort xs = let + minVal = minimum xs + minVals = replicate (length (filter (== minVal) xs)) minVal + in + minVals ++ (bubbleSort (filter (/= (minimum xs)) xs)) diff -r 957496efbe5d -r 861e35665469 haskell/Example/DeltaM.hs --- a/haskell/Example/DeltaM.hs Sun Feb 15 17:44:20 2015 +0900 +++ b/haskell/Example/DeltaM.hs Wed Feb 25 14:23:19 2015 +0900 @@ -44,3 +44,44 @@ numberCountM :: Int -> DeltaWithLog Int numberCountM x = generatorM x >>= numberFilterM >>= countM + + +-- example : sort + +sort :: [Int] -> DeltaWithLog [Int] +sort xs = DeltaM $ deltaFromList [ --bubbleSort xs, + singleSort xs, + returnW $ swapPair xs, + identity, + nil + ] + where + nil = returnW [] + + identity = returnW xs + + swapPair [] = [] + swapPair [x] = [x] + swapPair (x:xx:xs) = (min x xx) : (max x xx) : xs + + singleSort [] = returnW [] + singleSort xs = do + tell [show xs] + res <- do + remanVals <- singleSort $ filter (/= (minimum xs)) xs + return $ (minimum xs) : remanVals + tell [ show res ] + return res + + bubbleSort [] = returnW [] + bubbleSort xs = let + minVal = minimum xs + minVals = replicate (length (filter (== minVal) xs)) minVal + in + do + tell [show xs] + res <- do + remainVals <- bubbleSort $ filter (/= minVal) xs + return $ minVals ++ remainVals + tell [show res] + return res