diff options
| author | Jan Sucan <jan@jansucan.com> | 2025-10-26 20:47:53 +0100 |
|---|---|---|
| committer | Jan Sucan <jan@jansucan.com> | 2025-10-26 20:47:53 +0100 |
| commit | 4bade78170769d8f26ff709c69cfa4f37341a466 (patch) | |
| tree | a5a86824d09dd611eef5496f4b62bd3f207b6281 /ch24/Sorting.hs | |
| parent | 57a55d2b9d97496ac4544d7c047e6f1d76d1f4a9 (diff) | |
24_b_1, 24_b_2: Add solution
Diffstat (limited to 'ch24/Sorting.hs')
| -rw-r--r-- | ch24/Sorting.hs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/ch24/Sorting.hs b/ch24/Sorting.hs new file mode 100644 index 0000000..6fb9870 --- /dev/null +++ b/ch24/Sorting.hs @@ -0,0 +1,56 @@ +{-- snippet parSort --}
+module Sorting where
+
+import Control.Parallel (par, pseq)
+
+parSort :: (Ord a) => [a] -> [a]
+parSort (x:xs) = force greater `par` (force lesser `pseq`
+ (lesser ++ x:greater))
+ where lesser = parSort [y | y <- xs, y < x]
+ greater = parSort [y | y <- xs, y >= x]
+parSort _ = []
+{-- /snippet parSort --}
+
+{-- snippet sillySort --}
+sillySort (x:xs) = greater `par` (lesser `pseq`
+ (lesser ++ x:greater))
+ where lesser = sillySort [y | y <- xs, y < x]
+ greater = sillySort [y | y <- xs, y >= x]
+sillySort _ = []
+{-- /snippet sillySort --}
+
+{-- snippet sort --}
+sort :: (Ord a) => [a] -> [a]
+sort (x:xs) = lesser ++ x:greater
+ where lesser = sort [y | y <- xs, y < x]
+ greater = sort [y | y <- xs, y >= x]
+sort _ = []
+{-- /snippet sort --}
+
+{-- snippet seqSort --}
+seqSort :: (Ord a) => [a] -> [a]
+seqSort (x:xs) = lesser `pseq` (greater `pseq`
+ (lesser ++ x:greater))
+ where lesser = seqSort [y | y <- xs, y < x]
+ greater = seqSort [y | y <- xs, y >= x]
+seqSort _ = []
+{-- /snippet seqSort --}
+
+{-- snippet force --}
+force :: [a] -> ()
+force xs = go xs `pseq` ()
+ where go (_:xs) = go xs
+ go [] = 1
+{-- /snippet force --}
+
+{-- snippet parSort2 --}
+parSort2 :: (Ord a) => Int -> [a] -> [a]
+parSort2 d list@(x:xs)
+ | d <= 0 = sort list
+ | otherwise = force greater `par` (force lesser `pseq`
+ (lesser ++ x:greater))
+ where lesser = parSort2 d' [y | y <- xs, y < x]
+ greater = parSort2 d' [y | y <- xs, y >= x]
+ d' = d - 1
+parSort2 _ _ = []
+{-- /snippet parSort2 --}
|
