1import Control.Monad.ST (ST, runST)
2import Data.Foldable (for_)
3import Data.List (nub, partition)
4import Data.STRef (STRef)
5import GHC.Arr (STArray, elems, freezeSTArray, newSTArray, writeSTArray)
7-- Parametricity, polynomials and ST
9-- newtype State s a = State { runState :: s -> (s, a) }
11increment :: Int -> Int
14increment' :: (Num a) => a -> a
17whatIsThis :: forall a. a -> a
21-- Wadler: Theorems for free
23-- f :: forall a. a -> a
27map' :: forall a. (a -> a) -> [a] -> [a]
31-- map' f . g = g . map' f
34f x = x + 3 * x * x + x * x * x
36newtype Poly = Poly {runPoly :: forall a. (Num a) => a -> a}
38instance Num Poly where
39 Poly p + Poly q = Poly (\x -> p x + q x)
40 Poly p * Poly q = Poly (\x -> p x * q x)
41 abs (Poly p) = Poly (abs . p)
42 signum (Poly p) = Poly (signum . p)
43 negate (Poly p) = Poly (negate . p)
44 fromInteger c = Poly (const (fromInteger c))
46eval :: (Num a) => Poly -> a -> a
49subst :: Poly -> Poly -> Poly
52newtype PolyN i = PolyN {runPolyN :: forall a. (Num a) => (i -> a) -> a}
56eval' :: (Num a) => PolyN i -> (i -> a) -> a
59subst' :: PolyN i -> (i -> PolyN j) -> PolyN j
62newtype Variables i = Variables {getVariables :: [i]}
64instance (Eq i) => Num (Variables i) where
65 Variables xs + Variables ys = Variables $ nub (xs <> ys)
66 Variables xs * Variables ys = Variables $ nub (xs <> ys)
67 abs (Variables xs) = Variables xs
68 signum (Variables xs) = Variables xs
69 fromInteger _ = Variables []
70 negate (Variables xs) = Variables xs
72variables :: (Eq i) => PolyN i -> [i]
73variables p = getVariables $ eval' p (Variables . (: []))
77runST' :: (forall s. ST s a) -> a
80-- what if a is a type of mutable variables?
84-- bad :: ST s (STRef s' Int)
87-- leak :: forall s. ST s Int
90qsort :: (Ord a) => [a] -> [a]
93 let (ys, zs) = partition (< x) xs
94 in qsort ys ++ x : qsort zs
96sort :: (Ord a) => [a] -> [a]
98 let range = (0, length xs - 1)
99 arr <- newSTArray range (head xs)
100 for_ (zip [0 ..] xs) $ \(i, x) -> writeSTArray arr i x
102 arr' <- freezeSTArray arr
105sortStep :: (Ord a) => STArray s Int a -> (Int, Int) -> ST s ()
106sortStep arr (l, r) = do
107 let m = l + (r - l) `div` 2
108 sortStep arr (l, m - 1)
112merge :: Ord a => STArray s Int a -> (Int, Int, Int) -> ST s ()
115newtype Gen s = Gen { genState :: STRef s Int }
117nextInt :: Gen s -> ST s Int
118nextInt = error "TODO"
120-- functor parametricity
121-- t = t * t | t + t | t -> t | mu x. t(x) | x
122-- fmap :: (a -> b) -> (f a, g a) -> (f b, g b)
123-- fmap :: (a -> b) -> Either (f a) (g a) -> Either (f b) (g b)
124-- fmap :: (a -> b) -> Fix (f a) -> Fix (f b)
125-- fmap :: (a -> b) -> a -> b
126-- fmap :: (a -> b) -> ((f a -> h) -> g a) -> ((f a -> h) -> g b)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list