forked from HigherOrderCO/HVM
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.hs
35 lines (27 loc) · 836 Bytes
/
main.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
module Main where
import Data.Word
import System.Environment
data List = Nil | Cons Word64 List
-- Sorts a list
sort' :: List -> List
sort' Nil = Nil
sort' (Cons x xs) = insert x (sort' xs)
insert :: Word64 -> List -> List
insert v Nil = Cons v Nil
insert v (Cons x xs) = swapGT (if v > x then 1 else 0) v x xs
swapGT :: Word64 -> Word64 -> Word64 -> List -> List
swapGT 0 v x xs = Cons v (Cons x xs)
swapGT 1 v x xs = Cons x $! insert v xs
-- Generates a random list
rnd' :: Word64 -> Word64 -> List
rnd' 0 s = Nil
rnd' n s = Cons s (rnd' (n - 1) ((s * 1664525 + 1013904223) `mod` 4294967296))
-- Sums a list
sum' :: List -> Word64
sum' Nil = 0
sum' (Cons x xs) = x + sum' xs
main :: IO ()
main = do
-- n <- read . head <$> getArgs :: IO Word64
let n = 30
print $ sum' (sort' (rnd' (n * 1000) 1))