|
8 | 8 |
|
9 | 9 | module Codata.Thunk where
|
10 | 10 |
|
| 11 | +open import Level |
11 | 12 | open import Size
|
12 |
| -open import Relation.Unary |
| 13 | + |
| 14 | +private |
| 15 | + variable |
| 16 | + ℓ ℓ₁ ℓ₂ : Level |
13 | 17 |
|
14 | 18 | ------------------------------------------------------------------------
|
15 | 19 | -- Basic types.
|
16 | 20 |
|
| 21 | +SizedType : (ℓ : Level) → Set (suc ℓ) |
| 22 | +SizedType ℓ = Size → Set ℓ |
| 23 | + |
| 24 | +∀ˢ[_] : SizedType ℓ → Set ℓ |
| 25 | +∀ˢ[ F ] = ∀{i} → F i |
| 26 | + |
| 27 | +infixr 8 _⇒ˢ_ |
| 28 | + |
| 29 | +_⇒ˢ_ : SizedType ℓ₁ → SizedType ℓ₂ → SizedType (ℓ₁ ⊔ ℓ₂) |
| 30 | +F ⇒ˢ G = λ i → F i → G i |
| 31 | + |
17 | 32 | record Thunk {ℓ} (F : Size → Set ℓ) (i : Size) : Set ℓ where
|
18 | 33 | coinductive
|
19 | 34 | field force : {j : Size< i} → F j
|
@@ -42,26 +57,26 @@ syntax Thunk-syntax (λ j → e) i = Thunk[ j < i ] e
|
42 | 57 | -- Thunk is a functor
|
43 | 58 | module _ {p q} {P : Size → Set p} {Q : Size → Set q} where
|
44 | 59 |
|
45 |
| - map : ∀[ P ⇒ Q ] → ∀[ Thunk P ⇒ Thunk Q ] |
| 60 | + map : ∀ˢ[ P ⇒ˢ Q ] → ∀ˢ[ Thunk P ⇒ˢ Thunk Q ] |
46 | 61 | map f p .force = f (p .force)
|
47 | 62 |
|
48 | 63 | -- Thunk is a comonad
|
49 | 64 | module _ {p} {P : Size → Set p} where
|
50 | 65 |
|
51 |
| - extract : ∀[ Thunk P ] → P ∞ |
| 66 | + extract : ∀ˢ[ Thunk P ] → P ∞ |
52 | 67 | extract p = p .force
|
53 | 68 |
|
54 |
| - duplicate : ∀[ Thunk P ⇒ Thunk (Thunk P) ] |
| 69 | + duplicate : ∀ˢ[ Thunk P ⇒ˢ Thunk (Thunk P) ] |
55 | 70 | duplicate p .force .force = p .force
|
56 | 71 |
|
57 | 72 | module _ {p q} {P : Size → Set p} {Q : Size → Set q} where
|
58 | 73 |
|
59 | 74 | infixl 1 _<*>_
|
60 |
| - _<*>_ : ∀[ Thunk (P ⇒ Q) ⇒ Thunk P ⇒ Thunk Q ] |
| 75 | + _<*>_ : ∀ˢ[ Thunk (P ⇒ˢ Q) ⇒ˢ Thunk P ⇒ˢ Thunk Q ] |
61 | 76 | (f <*> p) .force = f .force (p .force)
|
62 | 77 |
|
63 | 78 | -- We can take cofixpoints of functions only making Thunk'd recursive calls
|
64 | 79 | module _ {p} (P : Size → Set p) where
|
65 | 80 |
|
66 |
| - cofix : ∀[ Thunk P ⇒ P ] → ∀[ P ] |
| 81 | + cofix : ∀ˢ[ Thunk P ⇒ˢ P ] → ∀ˢ[ P ] |
67 | 82 | cofix f = f λ where .force → cofix f
|
0 commit comments