Last active
June 10, 2026 01:14
-
-
Save lagenorhynque/a065dcad6b35be39a6d8571ac0dc7780 to your computer and use it in GitHub Desktop.
Records in Standard ML and Flix
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| (* レコードについて型推論が効く *) | |
| - 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