Так что я сделал это ...типы Ранг N в LET привязок
{-# LANGUAGE Rank2Types, GADTs #-}
type Record fields = forall t. fields t -> t
data PersonField t where
Name :: PersonField String
Age :: PersonField Int
type Person = Record PersonField
А потом это ...
nigel :: Person
nigel Name = "Nigel"
nigel Age = 39
И все это, кажется, работает, как ожидалось.
То, с чем я борюсь, - это определение значения Person внутри привязки let. Например, это не работает:
abigail :: Person
abigail = let x Name = "Abigail"
x Age = 27
in x
Дает мне:
Не удалось соответствовать ожидаемому типу `t1' с фактическим типом` [Char] `t1' неприкасаемых ...
Есть ли способ сделать эту работу внутри связывания?
Думаю, вам нужно добавить аннотацию типа внутри 'let', например. 'let x :: Person; x Name = "Abigail"; x Возраст = 27'. – chi
Это делает. Благодаря! Если вы сделаете комментарий в ответ, я соглашусь с ним. –