alpaca icon indicating copy to clipboard operation
alpaca copied to clipboard

Cannot unify recursive union

Open lpil opened this issue 7 years ago • 2 comments

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

lpil avatar Jan 02 '18 20:01 lpil

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 avatar Jan 02 '18 21:01 j14159

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.

j14159 avatar Feb 05 '18 00:02 j14159