-
Notifications
You must be signed in to change notification settings - Fork 12
Description
It it might eventually be useful to be able to ‘constrain’ representation types using something like Format { Repr = ... }
(this popped up in other approaches to figuring out the font tables).
This could allow us to write formats like:
join16 : fun (len : U16) (A : Type) -> Array16 len (Format { Repr = A }) -> Format { Repr = Array16 len A }
As Fathom is based on intensional type theory implementing such a construct could require a bit of thought – I'm not entirely clear on what the interactions and difficulties are, or if there are ways to simplify this.
A weird connection to module systems and associated types
This reminds me a bit of a limited form of:
where type
in Standard ML (A Crash Course on ML Modules)- OCaml's
with type
(OCaml Manual) - Rust's
Iterator<Item = T>
- Record patches in CoolTT (Slides | Presentation Recording)
This kind of makes sense if you imagine a Format
to be a builtin/hard-coded module type:
let Format = {
Repr : Type,
decode : Decoder Repr,
encode : Encoder Repr,
};
You could imagine extending this 'module' to support sizes too:
let Format = {
Repr : Type,
size : Size,
decode : Decoder Repr size,
encode : Encoder Repr size,
};
Note: I'm absolutely not recommending we implement Format
s in this way - I just find it an interesting perspective!