e1587ebdae
First stdlib fn that imports three other stdlib modules (std_list,
std_either, std_pair) and returns a compound polymorphic ADT tree
(Pair<List<e>, List<a>>). Stresses monomorphisation across nested
parameterised ADTs.
What shipped:
- examples/std_either_list.{ailx,ail.json}: 3 combinators —
- lefts : forall e a. (List<Either<e, a>>) -> List<e>
- rights : forall e a. (List<Either<e, a>>) -> List<a>
- partition_eithers : forall e a. (List<Either<e, a>>)
-> Pair<List<e>, List<a>>
lefts/rights use depth-2 nested Ctor patterns (Cons (Left l) t)
— exercises 16a's desugar pass at a depth not reached by any
prior fixture.
- examples/std_either_list_demo.{ailx,ail.json}: drives all three
combinators on a five-element List<Either<Int, Int>>; expected
output one per line: 2, 3, 2, 3.
- crates/ail/tests/e2e.rs::std_either_list_demo: e2e count 34 → 35.
- docs/JOURNAL.md: Iter 15g entry.
Compiler bug surfaced (queued as 15g-aux, not fixed):
unify_for_subst in ailang-codegen/src/lib.rs accepts $u wildcards
only on the arg side. Mixing inline (Either Left n) and (Either
Right n) in a list literal lands $u on the param side via the
outer List<a>'s binding and errors. Reduced repro: `length [Left
1, Right 10]`. Demo works around with monomorphic mkleft/mkright
helpers; workaround documented inline. Fix is a one-line symmetric
extension of the early-return.
Tests: 94/94. Stdlib: 5 modules, 27 combinators.
1 line
5.5 KiB
JSON
1 line
5.5 KiB
JSON
{"defs":[{"body":{"args":[{"name":"x","t":"var"}],"ctor":"Left","t":"ctor","type":"std_either.Either"},"doc":"Monomorphic Left-injector at Either<Int, Int>. Pins both type vars at the call site so the codegen synth doesn't leave a `$u` wildcard on the second var.","kind":"fn","name":"mkleft","params":["x"],"type":{"effects":[],"k":"fn","params":[{"k":"con","name":"Int"}],"ret":{"args":[{"k":"con","name":"Int"},{"k":"con","name":"Int"}],"k":"con","name":"std_either.Either"}}},{"body":{"args":[{"name":"x","t":"var"}],"ctor":"Right","t":"ctor","type":"std_either.Either"},"doc":"Monomorphic Right-injector at Either<Int, Int>. Symmetric to mkleft.","kind":"fn","name":"mkright","params":["x"],"type":{"effects":[],"k":"fn","params":[{"k":"con","name":"Int"}],"ret":{"args":[{"k":"con","name":"Int"},{"k":"con","name":"Int"}],"k":"con","name":"std_either.Either"}}},{"body":{"lhs":{"args":[{"args":[{"args":[{"args":[{"args":[{"lit":{"kind":"int","value":1},"t":"lit"}],"fn":{"name":"mkleft","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":10},"t":"lit"}],"fn":{"name":"mkright","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":2},"t":"lit"}],"fn":{"name":"mkleft","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":20},"t":"lit"}],"fn":{"name":"mkright","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":30},"t":"lit"}],"fn":{"name":"mkright","t":"var"},"t":"app"},{"args":[],"ctor":"Nil","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"fn":{"name":"std_either_list.lefts","t":"var"},"t":"app"}],"fn":{"name":"std_list.length","t":"var"},"t":"app"}],"op":"io/print_int","t":"do"},"rhs":{"lhs":{"args":[{"args":[{"args":[{"args":[{"args":[{"lit":{"kind":"int","value":1},"t":"lit"}],"fn":{"name":"mkleft","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":10},"t":"lit"}],"fn":{"name":"mkright","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":2},"t":"lit"}],"fn":{"name":"mkleft","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":20},"t":"lit"}],"fn":{"name":"mkright","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":30},"t":"lit"}],"fn":{"name":"mkright","t":"var"},"t":"app"},{"args":[],"ctor":"Nil","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"fn":{"name":"std_either_list.rights","t":"var"},"t":"app"}],"fn":{"name":"std_list.length","t":"var"},"t":"app"}],"op":"io/print_int","t":"do"},"rhs":{"lhs":{"args":[{"args":[{"args":[{"args":[{"args":[{"args":[{"lit":{"kind":"int","value":1},"t":"lit"}],"fn":{"name":"mkleft","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":10},"t":"lit"}],"fn":{"name":"mkright","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":2},"t":"lit"}],"fn":{"name":"mkleft","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":20},"t":"lit"}],"fn":{"name":"mkright","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":30},"t":"lit"}],"fn":{"name":"mkright","t":"var"},"t":"app"},{"args":[],"ctor":"Nil","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"fn":{"name":"std_either_list.partition_eithers","t":"var"},"t":"app"}],"fn":{"name":"std_pair.fst","t":"var"},"t":"app"}],"fn":{"name":"std_list.length","t":"var"},"t":"app"}],"op":"io/print_int","t":"do"},"rhs":{"args":[{"args":[{"args":[{"args":[{"args":[{"args":[{"lit":{"kind":"int","value":1},"t":"lit"}],"fn":{"name":"mkleft","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":10},"t":"lit"}],"fn":{"name":"mkright","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":2},"t":"lit"}],"fn":{"name":"mkleft","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":20},"t":"lit"}],"fn":{"name":"mkright","t":"var"},"t":"app"},{"args":[{"args":[{"lit":{"kind":"int","value":30},"t":"lit"}],"fn":{"name":"mkright","t":"var"},"t":"app"},{"args":[],"ctor":"Nil","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"ctor":"Cons","t":"ctor","type":"std_list.List"}],"fn":{"name":"std_either_list.partition_eithers","t":"var"},"t":"app"}],"fn":{"name":"std_pair.snd","t":"var"},"t":"app"}],"fn":{"name":"std_list.length","t":"var"},"t":"app"}],"op":"io/print_int","t":"do"},"t":"seq"},"t":"seq"},"t":"seq"},"doc":"Drive lefts, rights, and partition_eithers on the same five-element List<Either<Int, Int>> (Left 1, Right 10, Left 2, Right 20, Right 30). Expected output (one per line): 2, 3, 2, 3.","kind":"fn","name":"main","params":[],"type":{"effects":["IO"],"k":"fn","params":[],"ret":{"k":"con","name":"Unit"}}}],"imports":[{"module":"std_list"},{"module":"std_either"},{"module":"std_pair"},{"module":"std_either_list"}],"name":"std_either_list_demo","schema":"ailang/v0"} |