Ship

Lexicon · Open binder

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 'a parameters 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 'r as an open variant because Timed declared open '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 open is decided for now.

    See variant, row, open-variant, and ../01-syntax.md (Generics).