Skip to content

Commit ff6c8f3

Browse files
Modernise Data.Vec(.Properties) (#1673)
1 parent b871cc1 commit ff6c8f3

File tree

3 files changed

+439
-491
lines changed

3 files changed

+439
-491
lines changed

CHANGELOG.md

+8
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,14 @@ Deprecated names
552552
idIsFold ↦ id-is-foldr
553553
sum-++-commute ↦ sum-++
554554
```
555+
and the type of the proof `zipWith-comm` has been generalised from:
556+
```
557+
zipWith-comm : ∀ {f : A → A → B} (comm : ∀ x y → f x y ≡ f y x) (xs ys : Vec A n) → zipWith f xs ys ≡ zipWith f ys xs
558+
```
559+
to
560+
```
561+
zipWith-comm : ∀ {f : A → B → C} {g : B → A → C} (comm : ∀ x y → f x y ≡ g y x) (xs : Vec A n) ys → zipWith f xs ys ≡ zipWith g ys xs
562+
```
555563

556564
* In `Function.Construct.Composition`:
557565
```

src/Data/Vec/Base.agda

+68-75
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ private
2626
A : Set a
2727
B : Set b
2828
C : Set c
29+
m n :
2930

3031
------------------------------------------------------------------------
3132
-- Types
@@ -34,121 +35,121 @@ infixr 5 _∷_
3435

3536
data Vec (A : Set a) : Set a where
3637
[] : Vec A zero
37-
_∷_ : {n} (x : A) (xs : Vec A n) Vec A (suc n)
38+
_∷_ : (x : A) (xs : Vec A n) Vec A (suc n)
3839

3940
infix 4 _[_]=_
4041

41-
data _[_]=_ {A : Set a} : {n} Vec A n Fin n A Set a where
42-
here : {n} {x} {xs : Vec A n} x ∷ xs [ zero ]= x
43-
there : {n} {i} {x y} {xs : Vec A n}
44-
(xs[i]=x : xs [ i ]= x) y ∷ xs [ suc i ]= x
42+
data _[_]=_ {A : Set a} : Vec A n Fin n A Set a where
43+
here : {x} {xs : Vec A n} x ∷ xs [ zero ]= x
44+
there : {i} {x y} {xs : Vec A n}
45+
(xs[i]=x : xs [ i ]= x) y ∷ xs [ suc i ]= x
4546

4647
------------------------------------------------------------------------
4748
-- Basic operations
4849

49-
length : {n} Vec A n
50+
length : Vec A n
5051
length {n = n} _ = n
5152

52-
head : {n} Vec A (1 + n) A
53+
head : Vec A (1 + n) A
5354
head (x ∷ xs) = x
5455

55-
tail : {n} Vec A (1 + n) Vec A n
56+
tail : Vec A (1 + n) Vec A n
5657
tail (x ∷ xs) = xs
5758

58-
lookup : {n} Vec A n Fin n A
59+
lookup : Vec A n Fin n A
5960
lookup (x ∷ xs) zero = x
6061
lookup (x ∷ xs) (suc i) = lookup xs i
6162

62-
insert : {n} Vec A n Fin (suc n) A Vec A (suc n)
63+
insert : Vec A n Fin (suc n) A Vec A (suc n)
6364
insert xs zero v = v ∷ xs
6465
insert (x ∷ xs) (suc i) v = x ∷ insert xs i v
6566

66-
remove : {n} Vec A (suc n) Fin (suc n) Vec A n
67+
remove : Vec A (suc n) Fin (suc n) Vec A n
6768
remove (_ ∷ xs) zero = xs
6869
remove (x ∷ y ∷ xs) (suc i) = x ∷ remove (y ∷ xs) i
6970

70-
updateAt : {n} Fin n (A A) Vec A n Vec A n
71+
updateAt : Fin n (A A) Vec A n Vec A n
7172
updateAt zero f (x ∷ xs) = f x ∷ xs
7273
updateAt (suc i) f (x ∷ xs) = x ∷ updateAt i f xs
7374

7475
-- xs [ i ]%= f modifies the i-th element of xs according to f
7576

7677
infixl 6 _[_]%=_
7778

78-
_[_]%=_ : {n} Vec A n Fin n (A A) Vec A n
79+
_[_]%=_ : Vec A n Fin n (A A) Vec A n
7980
xs [ i ]%= f = updateAt i f xs
8081

8182
-- xs [ i ]≔ y overwrites the i-th element of xs with y
8283

8384
infixl 6 _[_]≔_
8485

85-
_[_]≔_ : {n} Vec A n Fin n A Vec A n
86+
_[_]≔_ : Vec A n Fin n A Vec A n
8687
xs [ i ]≔ y = xs [ i ]%= const y
8788

8889
------------------------------------------------------------------------
8990
-- Operations for transforming vectors
9091

91-
map : {n} (A B) Vec A n Vec B n
92+
map : (A B) Vec A n Vec B n
9293
map f [] = []
9394
map f (x ∷ xs) = f x ∷ map f xs
9495

9596
-- Concatenation.
9697

9798
infixr 5 _++_
9899

99-
_++_ : {m n} Vec A m Vec A n Vec A (m + n)
100+
_++_ : Vec A m Vec A n Vec A (m + n)
100101
[] ++ ys = ys
101102
(x ∷ xs) ++ ys = x ∷ (xs ++ ys)
102103

103-
concat : {m n} Vec (Vec A m) n Vec A (n * m)
104+
concat : Vec (Vec A m) n Vec A (n * m)
104105
concat [] = []
105106
concat (xs ∷ xss) = xs ++ concat xss
106107

107108
-- Align, Restrict, and Zip.
108109

109-
alignWith : {m n} (These A B C) Vec A m Vec B n Vec C (m ⊔ n)
110+
alignWith : (These A B C) Vec A m Vec B n Vec C (m ⊔ n)
110111
alignWith f [] bs = map (f ∘′ that) bs
111112
alignWith f as@(_ ∷ _) [] = map (f ∘′ this) as
112113
alignWith f (a ∷ as) (b ∷ bs) = f (these a b) ∷ alignWith f as bs
113114

114-
restrictWith : {m n} (A B C) Vec A m Vec B n Vec C (m ⊓ n)
115+
restrictWith : (A B C) Vec A m Vec B n Vec C (m ⊓ n)
115116
restrictWith f [] bs = []
116117
restrictWith f (_ ∷ _) [] = []
117118
restrictWith f (a ∷ as) (b ∷ bs) = f a b ∷ restrictWith f as bs
118119

119-
zipWith : {n} (A B C) Vec A n Vec B n Vec C n
120+
zipWith : (A B C) Vec A n Vec B n Vec C n
120121
zipWith f [] [] = []
121122
zipWith f (x ∷ xs) (y ∷ ys) = f x y ∷ zipWith f xs ys
122123

123-
unzipWith : {n} (A B × C) Vec A n Vec B n × Vec C n
124+
unzipWith : (A B × C) Vec A n Vec B n × Vec C n
124125
unzipWith f [] = [] , []
125126
unzipWith f (a ∷ as) = Prod.zip _∷_ _∷_ (f a) (unzipWith f as)
126127

127-
align : {m n} Vec A m Vec B n Vec (These A B) (m ⊔ n)
128+
align : Vec A m Vec B n Vec (These A B) (m ⊔ n)
128129
align = alignWith id
129130

130-
restrict : {m n} Vec A m Vec B n Vec (A × B) (m ⊓ n)
131+
restrict : Vec A m Vec B n Vec (A × B) (m ⊓ n)
131132
restrict = restrictWith _,_
132133

133-
zip : {n} Vec A n Vec B n Vec (A × B) n
134+
zip : Vec A n Vec B n Vec (A × B) n
134135
zip = zipWith _,_
135136

136-
unzip : {n} Vec (A × B) n Vec A n × Vec B n
137+
unzip : Vec (A × B) n Vec A n × Vec B n
137138
unzip = unzipWith id
138139

139140
-- Interleaving.
140141

141142
infixr 5 _⋎_
142143

143-
_⋎_ : {m n} Vec A m Vec A n Vec A (m +⋎ n)
144+
_⋎_ : Vec A m Vec A n Vec A (m +⋎ n)
144145
[] ⋎ ys = ys
145146
(x ∷ xs) ⋎ ys = x ∷ (ys ⋎ xs)
146147

147148
-- Pointwise application
148149

149150
infixl 4 _⊛_
150151

151-
_⊛_ : {n} Vec (A B) n Vec A n Vec B n
152+
_⊛_ : Vec (A B) n Vec A n Vec B n
152153
[] ⊛ [] = []
153154
(f ∷ fs) ⊛ (x ∷ xs) = f x ∷ (fs ⊛ xs)
154155

@@ -157,27 +158,27 @@ _⊛_ : ∀ {n} → Vec (A → B) n → Vec A n → Vec B n
157158
module CartesianBind where
158159
infixl 1 _>>=_
159160

160-
_>>=_ : {m n} Vec A m (A Vec B n) Vec B (m * n)
161+
_>>=_ : Vec A m (A Vec B n) Vec B (m * n)
161162
xs >>= f = concat (map f xs)
162163

163164
infixl 4 _⊛*_
164165

165-
_⊛*_ : {m n} Vec (A B) m Vec A n Vec B (m * n)
166+
_⊛*_ : Vec (A B) m Vec A n Vec B (m * n)
166167
fs ⊛* xs = fs CartesianBind.>>= λ f map f xs
167168

168-
allPairs : {m n} Vec A m Vec B n Vec (A × B) (m * n)
169+
allPairs : Vec A m Vec B n Vec (A × B) (m * n)
169170
allPairs xs ys = map _,_ xs ⊛* ys
170171

171172
-- Diagonal
172173

173-
diagonal : {n} Vec (Vec A n) n Vec A n
174+
diagonal : Vec (Vec A n) n Vec A n
174175
diagonal [] = []
175176
diagonal (xs ∷ xss) = head xs ∷ diagonal (map tail xss)
176177

177178
module DiagonalBind where
178179
infixl 1 _>>=_
179180

180-
_>>=_ : {n} Vec A n (A Vec B n) Vec B n
181+
_>>=_ : Vec A n (A Vec B n) Vec B n
181182
xs >>= f = diagonal (map f xs)
182183

183184
------------------------------------------------------------------------
@@ -190,43 +191,37 @@ module _ (A : Set a) (B : ℕ → Set b) where
190191
FoldrOp = {n} A B n B (suc n)
191192
FoldlOp = {n} B n A B (suc n)
192193

193-
foldr : (B : Set b) {m}
194-
FoldrOp A B
195-
B zero
196-
Vec A m B m
197-
foldr B _⊕_ n [] = n
198-
foldr B _⊕_ n (x ∷ xs) = x ⊕ foldr B _⊕_ n xs
194+
foldr : (B : Set b) FoldrOp A B B zero Vec A n B n
195+
foldr B _⊕_ e [] = e
196+
foldr B _⊕_ e (x ∷ xs) = x ⊕ foldr B _⊕_ e xs
199197

200-
foldl : (B : Set b) {m}
201-
FoldlOp A B
202-
B zero
203-
Vec A m B m
204-
foldl B _⊕_ n [] = n
205-
foldl B _⊕_ n (x ∷ xs) = foldl (B ∘ suc) _⊕_ (n ⊕ x) xs
198+
foldl : (B : Set b) FoldlOp A B B zero Vec A n B n
199+
foldl B _⊕_ e [] = e
200+
foldl B _⊕_ e (x ∷ xs) = foldl (B ∘ suc) _⊕_ (e ⊕ x) xs
206201

207202
-- Non-dependent folds
208203

209-
foldr′ : {n} (A B B) B Vec A n B
210-
foldr′ _⊕_ = foldr _ λ {n} _⊕_
204+
foldr′ : (A B B) B Vec A n B
205+
foldr′ _⊕_ = foldr _ _⊕_
211206

212-
foldl′ : {n} (B A B) B Vec A n B
213-
foldl′ _⊕_ = foldl _ λ {n} _⊕_
207+
foldl′ : (B A B) B Vec A n B
208+
foldl′ _⊕_ = foldl _ _⊕_
214209

215210
-- Non-empty folds
216211

217-
foldr₁ : {n} (A A A) Vec A (suc n) A
212+
foldr₁ : (A A A) Vec A (suc n) A
218213
foldr₁ _⊕_ (x ∷ []) = x
219214
foldr₁ _⊕_ (x ∷ y ∷ ys) = x ⊕ foldr₁ _⊕_ (y ∷ ys)
220215

221-
foldl₁ : {n} (A A A) Vec A (suc n) A
216+
foldl₁ : (A A A) Vec A (suc n) A
222217
foldl₁ _⊕_ (x ∷ xs) = foldl _ _⊕_ x xs
223218

224219
-- Special folds
225220

226-
sum : {n} Vec ℕ n
221+
sum : Vec ℕ n
227222
sum = foldr _ _+_ 0
228223

229-
count : {P : Pred A p} Decidable P {n} Vec A n
224+
count : {P : Pred A p} Decidable P Vec A n
230225
count P? [] = zero
231226
count P? (x ∷ xs) with does (P? x)
232227
... | true = suc (count P? xs)
@@ -238,11 +233,11 @@ count P? (x ∷ xs) with does (P? x)
238233
[_] : A Vec A 1
239234
[ x ] = x ∷ []
240235

241-
replicate : {n} A Vec A n
236+
replicate : A Vec A n
242237
replicate {n = zero} x = []
243238
replicate {n = suc n} x = x ∷ replicate x
244239

245-
tabulate : {n} (Fin n A) Vec A n
240+
tabulate : (Fin n A) Vec A n
246241
tabulate {n = zero} f = []
247242
tabulate {n = suc n} f = f zero ∷ tabulate (f ∘ suc)
248243

@@ -275,18 +270,18 @@ group (suc n) k .(ys ++ zs) | (ys , zs , refl) with group n k zs
275270
group (suc n) k .(ys ++ concat zss) | (ys , ._ , refl) | (zss , refl) =
276271
((ys ∷ zss) , refl)
277272

278-
split : {n} Vec A n Vec A ⌈ n /2⌉ × Vec A ⌊ n /2⌋
273+
split : Vec A n Vec A ⌈ n /2⌉ × Vec A ⌊ n /2⌋
279274
split [] = ([] , [])
280275
split (x ∷ []) = (x ∷ [] , [])
281276
split (x ∷ y ∷ xs) = Prod.map (x ∷_) (y ∷_) (split xs)
282277

283-
uncons : {n} Vec A (suc n) A × Vec A n
278+
uncons : Vec A (suc n) A × Vec A n
284279
uncons (x ∷ xs) = x , xs
285280

286281
------------------------------------------------------------------------
287282
-- Operations for converting between lists
288283

289-
toList : {n} Vec A n List A
284+
toList : Vec A n List A
290285
toList [] = List.[]
291286
toList (x ∷ xs) = List._∷_ x (toList xs)
292287

@@ -301,42 +296,40 @@ fromList (List._∷_ x xs) = x ∷ fromList xs
301296

302297
infixl 5 _∷ʳ_
303298

304-
_∷ʳ_ : {n} Vec A n A Vec A (suc n)
299+
_∷ʳ_ : Vec A n A Vec A (suc n)
305300
[] ∷ʳ y = [ y ]
306301
(x ∷ xs) ∷ʳ y = x ∷ (xs ∷ʳ y)
307302

308303
-- vanilla reverse
309304

310-
reverse : {n} Vec A n Vec A n
311-
reverse {A = A} = foldl (Vec A) (λ rev x x ∷ rev) []
305+
reverse : Vec A n Vec A n
306+
reverse = foldl (Vec _) (λ rev x x ∷ rev) []
312307

313308
-- reverse-append
314309

315310
infix 5 _ʳ++_
316311

317-
_ʳ++_ : {m n} Vec A m Vec A n Vec A (m + n)
318-
_ʳ++_ {A = A} {n = n} xs ys = foldl ((Vec A) ∘ (_+ n)) (λ rev x x ∷ rev) ys xs
312+
_ʳ++_ : Vec A m Vec A n Vec A (m + n)
313+
xs ʳ++ ys = foldl (Vec _ ∘ (_+ _)) (λ rev x x ∷ rev) ys xs
319314

320315
-- init and last
321316

322-
initLast : {n} (xs : Vec A (1 + n))
323-
∃₂ λ (ys : Vec A n) (y : A) xs ≡ ys ∷ʳ y
324-
initLast {n = zero} (x ∷ []) = ([] , x , refl)
325-
initLast {n = suc n} (x ∷ xs) with initLast xs
326-
initLast {n = suc n} (x ∷ .(ys ∷ʳ y)) | (ys , y , refl) =
327-
((x ∷ ys) , y , refl)
317+
initLast : (xs : Vec A (1 + n)) ∃₂ λ ys y xs ≡ ys ∷ʳ y
318+
initLast {n = zero} (x ∷ []) = ([] , x , refl)
319+
initLast {n = suc n} (x ∷ xs) with initLast xs
320+
... | (ys , y , refl) = (x ∷ ys , y , refl)
328321

329-
init : {n} Vec A (1 + n) Vec A n
330-
init xs with initLast xs
331-
init .(ys ∷ʳ y) | (ys , y , refl) = ys
322+
init : Vec A (1 + n) Vec A n
323+
init xs with initLast xs
324+
... | (ys , y , refl) = ys
332325

333-
last : {n} Vec A (1 + n) A
334-
last xs with initLast xs
335-
last .(ys ∷ʳ y) | (ys , y , refl) = y
326+
last : Vec A (1 + n) A
327+
last xs with initLast xs
328+
... | (ys , y , refl) = y
336329

337330
------------------------------------------------------------------------
338331
-- Other operations
339332

340-
transpose : {m n} Vec (Vec A n) m Vec (Vec A m) n
333+
transpose : Vec (Vec A n) m Vec (Vec A m) n
341334
transpose [] = replicate []
342335
transpose (as ∷ ass) = replicate _∷_ ⊛ as ⊛ transpose ass

0 commit comments

Comments
 (0)