Skip to content

Instantly share code, notes, and snippets.

@lagenorhynque
Last active June 10, 2026 01:14
Show Gist options
  • Select an option

  • Save lagenorhynque/a065dcad6b35be39a6d8571ac0dc7780 to your computer and use it in GitHub Desktop.

Select an option

Save lagenorhynque/a065dcad6b35be39a6d8571ac0dc7780 to your computer and use it in GitHub Desktop.
Records in Standard ML and Flix
flix> let {name | _} = {name = "Peter", age = 58}; name
Peter
flix> (p -> p#name)({name = "Peter", age = 58})
Peter
flix> ((p: {name = String | _}) -> p#name)({name = "Peter", age = 58})
-- Type Error [E7796] ------------------------------------------- __SHELL__.flix
>> Unexpected type: expected '{ age = Int32, name = String } -> String', found '{ name = String | _ } -> String'.
2 | def _f() = { println(((p: {name = String | _}) -> p#name)({name = "Peter", age = 58})) };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
unexpected type
-- Type Error [E6794] ------------------------------------------- __SHELL__.flix
>> Unable to unify the types: '_' and 'r0'.
2 | def _f() = { println(((p: {name = String | _}) -> p#name)({name = "Peter", age = 58})) };
^^^^^^
mismatched types.
Type One: { name = String | _ }
Type Two: { name = String | r0 }
Compilation failed with 2 error(s).
flix> ((p: {name = String | r}) -> p#name)({name = "Peter", age = 58})
-- Type Error [E7249] ------------------------------------------- __SHELL__.flix
>> ToString is not defined on t0. Define or derive an instance of ToString.
2 | def _f() = { println(((p: {name = String | r}) -> p#name)({name = "Peter", age = 58})) };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
missing ToString instance
Explanation:
To define a string representation of 't0', either:
(a) define an instance of ToString for 't0', or
(b) use 'with' to derive an instance of ToString for 't0', for example:.
enum Color with ToString {
case Red, Green, Blue
}
-- Resolution Error [E3027] ------------------------------------- __SHELL__.flix
>> Undefined type variable 'r'.
2 | def _f() = { println(((p: {name = String | r}) -> p#name)({name = "Peter", age = 58})) };
^
undefined type variable
Compilation failed with 2 error(s).
flix> def name(p: {name = String, age = Int32}): String = p#name
Ok.
flix> name({name = "Peter", age = 58})
Peter
flix> def name2(p: {name = String | _}): String = p#name
Ok.
flix> name2({name = "Peter", age = 58})
Peter
(* レコードについて型推論が効く *)
- val {Name, ...} = {Name="Peter", Age=58};
val Name = "Peter" : string
- (fn {Name=x, ...} => x) {Name="Peter", Age=58};
val it = "Peter" : string
- fun name {Name, Age} = Name;
val name = fn : {Age:'a, Name:'b} -> 'b
(* レコードについて型推論が効かない *)
- fun name {Name, ...} = Name;
stdIn:4.1-4.28 Error: unresolved flex record
(can't tell what fields there are besides #Name)
- fun name x = #Name x;
stdIn:1.2-1.22 Error: unresolved flex record
(can't tell what fields there are besides #Name)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment