Предположим, у меня есть 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
должна быть разрешимой. Так что я не уверен, где проблема.