1{-# LANGUAGE LinearTypes #-}
2{-# LANGUAGE UnicodeSyntax #-}
3{-# LANGUAGE GADTs #-}
4module Linear12 where
5
6type N a = a ⊸ ()
7
8consume :: aN a ⊸ ()
9consume x k = k x
10
11data N' a where N :: N aN' a
12
13data M' a where M :: M a -> M' a
14
15consume' :: aN' a ⊸ ()
16consume' x (N k) = k x
17
18data W = W (W ⊸ ())
19
20wPlusTwo :: WW
21wPlusTwo n = W (\(W k) -> k n)
22
23data Nat = S Nat
24
25natPlusOne :: NatNat
26natPlusOne n = S n
27
28data D = D ()
29
30mkD :: () ⊸ D
31mkD x = D x
32
33data Odd = E Even
34data Even = O Odd
35
36evenPlusOne :: EvenOdd
37evenPlusOne e = E e
38
39