| Safe Haskell | Safe-Inferred |
|---|---|
| Language | Haskell2010 |
AsyncRattus.Primitives
Description
Documentation
The "later" type modality. A value v of type O 𝜏 consists of
two components: Its clock, denoted cl(v), and a delayed
computation that will produce a value of type 𝜏 as soon as the
clock cl(v) ticks. The clock cl(v) is only used for type
checking and is not directly accessible, whereas the delayed
computation is accessible via adv and select.
The return type of the select primitive.
This is the constructor for the "later" modality O:
Γ ✓θ ⊢ t :: 𝜏 -------------------- Γ ⊢ delay t :: O 𝜏
The typing rule requires that its argument t typecheck with an
additional tick ✓θ of some clock θ.
This is the eliminator for the "later" modality O:
Γ ⊢ t :: O 𝜏 Γ' tick-free
---------------------------------
Γ ✓cl(t) Γ' ⊢ adv t :: 𝜏It requires that a tick ✓θ is in the context whose clock matches
exactly the clock of t, i.e. θ = cl(t).
This is the constructor for the "stable" modality Box:
Γ☐ ⊢ t :: 𝜏 -------------------- Γ ⊢ box t :: Box 𝜏
where Γ☐ is obtained from Γ by removing all ticks and all variables
x :: 𝜏, where 𝜏 is not a stable type.
This is the eliminator for the "stable" modality Box:
Γ ⊢ t :: Box 𝜏 ------------------ Γ ⊢ unbox t :: 𝜏
select :: O a -> O b -> Select a b Source #
If we want to eliminate more than one delayed computation, i.e.
two s :: O σ and t :: O 𝜏, we need to use select instead of
just adv.
Γ ⊢ s :: O σ Γ ⊢ t :: O 𝜏 Γ' tick-free -------------------------------------------------- Γ ✓cl(s)⊔cl(t) Γ' ⊢ select s t :: Select σ 𝜏
It requires that we have a tick ✓θ in the context whose clock
matches the union of the clocks of s and t, i.e. θ =
cl(s)⊔cl(t). The union of two clocks ticks whenever either of the
two clocks ticks, i.e. cl(s)⊔cl(t), whenever cl(s) or cl(t)
ticks.
That means there are three possible outcomes, which are reflected
in the result type of select s t. A value of Select σ 𝜏 is
either
- a value of type
σand a delayed computation of typeO 𝜏, ifcl(s)ticks beforecl(t), - a value of type
𝜏and a delayed computation of typeO σ, ifcl(t)ticks beforecl(s), or - a value of type
σand a value of type𝜏, ifcl(s)and cl(s)tick simultaneously.
The clock of never :: O 𝜏 will never tick, i.e. it will never
produce a value of type 𝜏. With never we can for example
implement the constant signal x ::: never of type Sig a for any x ::
a.
A type is Stable if it is a strict type and the later modality
O and function types only occur under Box.
For example, these types are stable: Int, Box (a -> b), Box (O
Int), Box (Sig a -> Sig b).
But these types are not stable: [Int] (because the list type is
not strict), Int -> Int, (function type is not stable), O
Int, Sig Int.