alpaca
alpaca copied to clipboard
Cannot unify recursive union
I attempted to define the iolist type like so:
type iolist
= list iolist
| string
val my_iolist : iolist
let my_iolist =
["h", ["i", ["!"]]]
This does not compile
louis ~/projects/learning-alpaca/hello_world $ rebar3 eunit
===> Verifying dependencies...
===> Compiling hello_world
===> Alpaca 0.2.8: compiling hello_world.alp
===> Alpaca compile error:
(╯°□°)╯︵ ┻━┻ {cannot_unify,hello_world,0,t_string,error}
Sorry, we do not have a proper message for this error yet.
Is this a bug or by design?
Thanks, Louis
Definite bug, thanks for finding this! The error atom suggests that the typer is assuming success somewhere where it should be checking for an error tuple, e.g. {error, _}. This can happen because typ_of/2 usually returns {Type, NextTypeVariableNumber :: integer()} or {error, term()}.
I think I know what this is now, roughly: alpaca_typer.find_covering_types/4 (or rather try_types/6) isn't looking at list iolist as a possible alias for list string. Not 100% sure this is it but looking likely.