{- `build` is the inverse of `fold` -} let build : ∀(a : Type) → ( ∀(optional : Type) → ∀(some : a → optional) → ∀(none : optional) → optional ) → Optional a = λ(a : Type) → λ ( build : ∀(optional : Type) → ∀(some : a → optional) → ∀(none : optional) → optional ) → build (Optional a) (λ(x : a) → Some x) (None a) let example0 = assert : build Natural ( λ(optional : Type) → λ(some : Natural → optional) → λ(none : optional) → some 1 ) ≡ Some 1 let example1 = assert : build Natural ( λ(optional : Type) → λ(some : Natural → optional) → λ(none : optional) → none ) ≡ None Natural in build