alpaca-lang / alpaca

Functional programming inspired by ML for the Erlang VM
Other
1.44k stars 48 forks source link

Cannot unify recursive union #224

Open lpil opened 6 years ago

lpil commented 6 years ago

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

j14159 commented 6 years ago

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()}.

j14159 commented 6 years ago

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.