-
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
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-- https://github.com/BartoszMilewski/DaoFP
-- import Mathlib
-- universe u
def absurd' {C : Sort u} : Empty → C := Empty.rec
#check absurd'
#check id
-- Universes sad
-- #eval id id
-- Naturality condition
inductive Bool'
| true' (a : Unit) : Bool'
| false' (a : Unit) : Bool'
#check Bool'.true' = Bool'.false'
def f
| 0 => 1
| x + 1 => (x + 1) * f x
#eval f 69
def third {α β γ} (x : α × β × γ) :=
let (_, _, c) := x
c
universe v
-- class Natural (f : (Type u → Type v) → Type u → Type v) : Type (max (u + 1) v) where
-- Oops it's not a typeclass
def id' {α} (x : α) := x
#check id'
def yoneda {α} (m : Type u → Type v) [Functor m] (g : {β : Type u} → (α → β) → m β) : m α := g id
def yoneda' {α} (m : Type u → Type v) [Functor m] (y : m α) : {β : Type u} → (α → β) → m β := λ h ↦ h <$> y
-- def map_to_T (x : String) : Type :=
-- if x = "0" then
-- Nat
-- else
-- String
-- def natOrStringThree (b : Bool) : if b then Nat else String :=
-- match b with
-- | true => (3 : Nat)
-- | false => "three"
-- abbrev map_to_T (x : String) : Type :=
-- if x = "0" then Nat else String
-- def map_to (x : String) : map_to_T x :=
-- match decide (x = "0") with
-- | true => (42 : Nat)
-- | false => x
-- def map_to (x : String) : map_to_T x :=
-- if h : x = "0" then by
-- simp [map_to_T, h]
-- exact 42
-- else by
-- simp [map_to_T, h]
-- exact x
def ap [Monad m] (fs : m (α → β)) (as : m α) : m β := do
-- fs >>= λ f ↦ as >>= λ a ↦ pure (f a)
-- fs >>= (· <$> as)
return (← fs) (← as)
class Monad' (m : Type → Type) where
fish : (β → m γ) → (α → m β) → (α → m γ)
join : (a : m (m α)) → m α := fish id id