2
2
Copyright (c) 2018 Simon Hudon. All rights reserved.
3
3
Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Simon Hudon
5
+ -/
6
+ import control.applicative
7
+ import control.traversable.basic
8
+
9
+ /-!
10
+ # Traversing collections
5
11
6
- Lemmas about traversing collections.
12
+ This file proves basic properties of traversable and applicative functors and defines
13
+ `pure_transformation F`, the natural applicative transformation from the identity functor to `F`.
7
14
8
- Inspired by:
15
+ ## References
9
16
10
- The Essence of the Iterator Pattern
11
- Jeremy Gibbons and Bruno César dos Santos Oliveira
12
- In Journal of Functional Programming. Vol. 19. No. 3&4. Pages 377−402. 2009.
13
- <http://www.cs.ox.ac.uk/jeremy.gibbons/publications/iterator.pdf>
17
+ Inspired by [ The Essence of the Iterator Pattern ] [gibbons2009 ].
14
18
-/
15
- import control.traversable.basic
16
- import control.applicative
17
19
18
20
universes u
19
21
@@ -42,19 +44,16 @@ to `F`, defined by `pure : Π {α}, α → F α`. -/
42
44
def pure_transformation : applicative_transformation id F :=
43
45
{ app := @pure F _,
44
46
preserves_pure' := λ α x, rfl,
45
- preserves_seq' := λ α β f x, by simp; refl }
46
-
47
- @[simp] theorem pure_transformation_apply {α} (x : id α) :
48
- (pure_transformation F) x = pure x := rfl
47
+ preserves_seq' := λ α β f x, by { simp only [map_pure, seq_pure], refl } }
49
48
49
+ @[simp] theorem pure_transformation_apply {α} (x : id α) : pure_transformation F x = pure x := rfl
50
50
51
51
variables {F G} (x : t β)
52
52
53
53
lemma map_eq_traverse_id : map f = @traverse t _ _ _ _ _ (id.mk ∘ f) :=
54
54
funext $ λ y, (traverse_eq_map_id f y).symm
55
55
56
- theorem map_traverse (x : t α) :
57
- map f <$> traverse g x = traverse (map f ∘ g) x :=
56
+ theorem map_traverse (x : t α) : map f <$> traverse g x = traverse (map f ∘ g) x :=
58
57
begin
59
58
rw @map_eq_traverse_id t _ _ _ _ f,
60
59
refine (comp_traverse (id.mk ∘ f) g x).symm.trans _,
@@ -69,14 +68,12 @@ begin
69
68
congr, apply comp.applicative_id_comp
70
69
end
71
70
72
- lemma pure_traverse (x : t α) :
73
- traverse pure x = (pure x : F (t α)) :=
71
+ lemma pure_traverse (x : t α) : traverse pure x = (pure x : F (t α)) :=
74
72
by have : traverse pure x = pure (traverse id.mk x) :=
75
73
(naturality (pure_transformation F) id.mk x).symm;
76
74
rwa id_traverse at this
77
75
78
- lemma id_sequence (x : t α) :
79
- sequence (id.mk <$> x) = id.mk x :=
76
+ lemma id_sequence (x : t α) : sequence (id.mk <$> x) = id.mk x :=
80
77
by simp [sequence, traverse_map, id_traverse]; refl
81
78
82
79
lemma comp_sequence (x : t (F (G α))) :
@@ -88,34 +85,29 @@ lemma naturality' (η : applicative_transformation F G) (x : t (F α)) :
88
85
by simp [sequence, naturality, traverse_map]
89
86
90
87
@[functor_norm]
91
- lemma traverse_id :
92
- traverse id.mk = (id.mk : t α → id (t α)) :=
93
- by ext; simp [id_traverse]; refl
88
+ lemma traverse_id : traverse id.mk = (id.mk : t α → id (t α)) :=
89
+ by { ext, exact id_traverse _ }
94
90
95
91
@[functor_norm]
96
92
lemma traverse_comp (g : α → F β) (h : β → G γ) :
97
93
traverse (comp.mk ∘ map h ∘ g) =
98
94
(comp.mk ∘ map (traverse h) ∘ traverse g : t α → comp F G (t γ)) :=
99
- by ext; simp [ comp_traverse]
95
+ by { ext, exact comp_traverse _ _ _ }
100
96
101
- lemma traverse_eq_map_id' (f : β → γ) :
102
- traverse (id.mk ∘ f) =
103
- id.mk ∘ (map f : t β → t γ) :=
104
- by ext;rw traverse_eq_map_id
97
+ lemma traverse_eq_map_id' (f : β → γ) : traverse (id.mk ∘ f) = id.mk ∘ (map f : t β → t γ) :=
98
+ by { ext, exact traverse_eq_map_id _ _ }
105
99
106
100
-- @[ functor_norm ]
107
101
lemma traverse_map' (g : α → β) (h : β → G γ) :
108
- traverse (h ∘ g) =
109
- (traverse h ∘ map g : t α → G (t γ)) :=
110
- by ext; simp [traverse_map]
102
+ traverse (h ∘ g) = (traverse h ∘ map g : t α → G (t γ)) :=
103
+ by { ext, rw [comp_app, traverse_map] }
111
104
112
105
lemma map_traverse' (g : α → G β) (h : β → γ) :
113
- traverse (map h ∘ g) =
114
- (map (map h) ∘ traverse g : t α → G (t γ)) :=
115
- by ext; simp [map_traverse]
106
+ traverse (map h ∘ g) = (map (map h) ∘ traverse g : t α → G (t γ)) :=
107
+ by { ext, rw [comp_app, map_traverse] }
116
108
117
109
lemma naturality_pf (η : applicative_transformation F G) (f : α → F β) :
118
110
traverse (@η _ ∘ f) = @η _ ∘ (traverse f : t α → F (t β)) :=
119
- by ext; simp [ naturality]
111
+ by { ext, rw [comp_app, naturality] }
120
112
121
113
end traversable
0 commit comments