Mercurial > hg > Members > atton > delta_monad
changeset 47:1aefea69f71b
Implement bubble sort by delta
author | Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 11 Nov 2014 14:01:31 +0900 |
parents | cb5c190aa45d |
children | 820af7cc8485 |
files | delta.hs |
diffstat | 1 files changed, 27 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/delta.hs Tue Nov 11 13:28:55 2014 +0900 +++ b/delta.hs Tue Nov 11 14:01:31 2014 +0900 @@ -14,8 +14,11 @@ value :: (Delta a) -> a value (Delta _ x _ _) = x -similar :: (Delta a) -> a -similar (Delta _ _ _ y) = y +deltaLeft :: (Delta a) -> a +deltaLeft (Delta _ x _ _) = x + +deltaRight :: (Delta a) -> a +deltaRight (Delta _ _ _ y) = y instance (Eq a) => Eq (Delta a) where s == ss = (value s) == (value ss) @@ -27,6 +30,10 @@ fmapS :: (Show a) => (a -> b) -> Delta a -> Delta b fmapS f (Delta lx x ly y) = Delta (lx ++ [(show x)]) (f x) (ly ++ [(show y)]) (f y) +-- not proof +fmapSS :: (Show a) => (a -> b) -> (a -> b) -> Delta a -> Delta b +fmapSS f g (Delta lx x ly y) = Delta (lx ++ [(show x)]) (f x) (ly ++ [(show y)]) (g y) + instance Applicative Delta where pure f = Delta [] f [] f (Delta lf f lg g) <*> (Delta lx x ly y) = Delta (lf ++ lx) (f x) (lg ++ ly) (g y) @@ -64,10 +71,23 @@ primeCount x = generator x >>= primeFilter >>= count bubbleSort :: [Int] -> Delta [Int] -bubbleSort [] = returnS [] -bubbleSort xs = fmapS (\x -> (replicate maxNumCount maxNum) ++ x) (bubbleSort remainList) +bubbleSort = rightReverse . bubbleSortDelta . returnS + +bubbleSortDelta :: Delta [Int] -> Delta [Int] +bubbleSortDelta (Delta lx [] ly []) = (Delta lx [] ly []) +bubbleSortDelta xs = fmapSS (\x -> (replicate maxNumCount maxNum) ++ x) + (\y -> (replicate minNumCount minNum) ++ y) + (bubbleSortDelta $ fmapSS remainListMax remainListMin xs) where - maxNum = maximum xs - remainList = filter (/= maxNum) xs - maxNumCount = (length xs) - (length remainList) + leftValue = deltaLeft xs + rightValue = deltaRight xs + maxNum = maximum leftValue + minNum = minimum rightValue + remainListMax = filter (/= maxNum) + remainListMin = filter (/= minNum) + maxNumCount = (length leftValue) - (length $ remainListMax leftValue) + minNumCount = (length rightValue) - (length $ remainListMin rightValue) + +rightReverse :: Delta [Int] -> Delta [Int] +rightReverse d = fmapSS id reverse d