; Iter 15g — fifth consumer demo. First demo to import four stdlib ; modules (std_list, std_either, std_pair, std_either_list); first to ; thread a List> through three combinators that ; together exercise every monomorphisation site introduced by 15g. ; ; The list is constructed via the monomorphic helpers `mkleft` and ; `mkright` rather than bare `(term-ctor std_either.Either Left ...)` / ; `(term-ctor std_either.Either Right ...)`. This sidesteps a codegen ; bug that 15g surfaced: when an inline list literal mixes ; `Either Left n` (pins e, leaves a as `$u`) and `Either Right n` (pins ; a, leaves e as `$u`), the synth-time unification of the outer ; `List`'s parameter against the `$u`-bearing element types fails ; on the param side because `unify_for_subst` only accepts arg-side ; `$u` wildcards. The helpers fully pin both type vars at the call ; site, so each list element arrives with concrete `Either` ; and the bug is dodged. Logged as known-debt under 15g; the fix is ; a one-line symmetric extension of the `$u` early-return. (module std_either_list_demo (import std_list) (import std_either) (import std_pair) (import std_either_list) (fn mkleft (doc "Monomorphic Left-injector at Either. Pins both type vars at the call site so the codegen synth doesn't leave a `$u` wildcard on the second var.") (type (fn-type (params (con Int)) (ret (con std_either.Either (con Int) (con Int))))) (params x) (body (term-ctor std_either.Either Left x))) (fn mkright (doc "Monomorphic Right-injector at Either. Symmetric to mkleft.") (type (fn-type (params (con Int)) (ret (con std_either.Either (con Int) (con Int))))) (params x) (body (term-ctor std_either.Either Right x))) (fn main (doc "Drive lefts, rights, and partition_eithers on the same five-element List> (Left 1, Right 10, Left 2, Right 20, Right 30). Expected output (one per line): 2, 3, 2, 3.") (type (fn-type (params) (ret (con Unit)) (effects IO))) (params) (body (seq (do io/print_int (app std_list.length (app std_either_list.lefts (term-ctor std_list.List Cons (app mkleft 1) (term-ctor std_list.List Cons (app mkright 10) (term-ctor std_list.List Cons (app mkleft 2) (term-ctor std_list.List Cons (app mkright 20) (term-ctor std_list.List Cons (app mkright 30) (term-ctor std_list.List Nil))))))))) (seq (do io/print_int (app std_list.length (app std_either_list.rights (term-ctor std_list.List Cons (app mkleft 1) (term-ctor std_list.List Cons (app mkright 10) (term-ctor std_list.List Cons (app mkleft 2) (term-ctor std_list.List Cons (app mkright 20) (term-ctor std_list.List Cons (app mkright 30) (term-ctor std_list.List Nil))))))))) (seq (do io/print_int (app std_list.length (app std_pair.fst (app std_either_list.partition_eithers (term-ctor std_list.List Cons (app mkleft 1) (term-ctor std_list.List Cons (app mkright 10) (term-ctor std_list.List Cons (app mkleft 2) (term-ctor std_list.List Cons (app mkright 20) (term-ctor std_list.List Cons (app mkright 30) (term-ctor std_list.List Nil)))))))))) (do io/print_int (app std_list.length (app std_pair.snd (app std_either_list.partition_eithers (term-ctor std_list.List Cons (app mkleft 1) (term-ctor std_list.List Cons (app mkright 10) (term-ctor std_list.List Cons (app mkleft 2) (term-ctor std_list.List Cons (app mkright 20) (term-ctor std_list.List Cons (app mkright 30) (term-ctor std_list.List Nil))))))))))))))))