pub opaque type Dict { inner: List>, } pub fn constant(a: a) -> Fuzzer { fn(s0) { Some((s0, a)) } } pub fn map(fuzz_a: Fuzzer, f: fn(a) -> b) -> Fuzzer { fn(s0) { when fuzz_a(s0) is { Some((s1, a)) -> Some((s1, f(a))) None -> None } } } // NOTE: Inlining `do_list` fixes the problem. But the indirection here causes: // // --> Type mismatch expected 'pair data data' got 'data' pub fn list(fuzzer: Fuzzer) -> Fuzzer> { do_list(fuzzer, []) } fn do_list(fuzzer, xs) -> Fuzzer> { let x <- map(fuzzer) [x, ..xs] } pub fn dict() -> Fuzzer> { list(constant(Pair(1, True))) |> map(fn(inner) { Dict { inner } }) } test prop_dict_between(_d via dict()) { True }