Open binder
Keyword open on a generic binder declares that the type parameter must stand for an open variant ([ … ] type built from a row of tags).
type Timed(open 'r) = [ 'r | :timeout(Duration) ]
let as_timed = fn('r)(result: 'r) -> Timed('r) {
return result :> Timed('r);
}
Unannotated
'aparameters infer any Type (products, closed variants, primitives, functions, open variants, and so on).A plain generic parameter used in an open-only position also infers open shape:
fn('r)(value: 'r) -> Timed('r)treats'ras an open variant becauseTimeddeclaredopen 'r.Function behavior requirements use inline
:binders ('a: Compare). Do not spell open-variant shape as a behavior requirement.Additional shape constraints on type parameters (for example closed-variant-only slots) are not settled — only
openis decided for now.See variant, row, open-variant, and ../01-syntax.md (Generics).