aboutsummaryrefslogtreecommitdiff
path: root/ch24/Sorting.hs
diff options
context:
space:
mode:
authorJan Sucan <jan@jansucan.com>2025-10-26 20:47:53 +0100
committerJan Sucan <jan@jansucan.com>2025-10-26 20:47:53 +0100
commit4bade78170769d8f26ff709c69cfa4f37341a466 (patch)
treea5a86824d09dd611eef5496f4b62bd3f207b6281 /ch24/Sorting.hs
parent57a55d2b9d97496ac4544d7c047e6f1d76d1f4a9 (diff)
24_b_1, 24_b_2: Add solution
Diffstat (limited to 'ch24/Sorting.hs')
-rw-r--r--ch24/Sorting.hs56
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 --}