aboutsummaryrefslogtreecommitdiff
path: root/Haskell-book/05/src/TypeKwonDo.purs
blob: 994850245693b850c9568ca6522766fdb7e8b654 (plain)
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
36
37
38
39
40
41
42
43
44
45
46
47
module TypeKwonDo where

import Data.Tuple (Tuple(..), fst)
import Prelude
import Unsafe.Coerce (unsafeCoerce)

f :: Int -> String
f = unsafeCoerce unit

g :: String -> Char
g = unsafeCoerce unit

h :: Int -> Char
h x = g $ f x

data A
data B
data C

q :: A -> B
q = unsafeCoerce unit

w :: B -> C
w = unsafeCoerce unit

e :: A -> C
e x = w $ q x

data X
data Y
data Z

xz :: X -> Z
xz = unsafeCoerce unit

yz :: Y -> Z
yz = unsafeCoerce unit

xform :: Tuple X Y -> Tuple Z Z
xform (Tuple a b) = Tuple (xz a) (yz b)

munge :: forall x y z w.
         (x -> y)
      -> (y -> (Tuple w z))
      -> x
      -> w
munge f1 f2 a = fst (f2 (f1 a))