Может ли система типов Purescript разрешать узкие строки - PullRequest
2 голосов
/ 03 марта 2020

Предположим, у меня есть type Open o = ( i :: Int | o ) и type Closed = ( i :: Int ). Затем, если я пытаюсь создать что-то вроде { i: 1 } :: Record (Open Closed), я получаю ошибку, потому что отсутствует метка i. Так что я хотел бы сказать: { i: 1 } :: forall n. Nub (Open Closed) n => n.

Это не сработает, и ошибка не имеет большого смысла для меня. Он говорит, что не может сопоставить t0 с ( i :: Int | t1 ) (t0 связан, t1 неизвестен) при проверке, что { i: 1 } имеет тип Record t0. И если бы у меня был открытый ряд здесь, я думаю, что получил бы это. Если тип открыт, нуб не может быть однозначно определен. Но, насколько я могу судить, поскольку он пытается сопоставить { i: 1 } с Record t0, он должен пытаться сопоставить t0 с ( i :: Int ), а не ( i :: Int | t1 ).

Я думал, что, поскольку есть функциональная зависимость от класса типов Nub и Open Closed полностью определена, n должна быть разрешимой. Так что я не уверен, где проблема.

...