Я Хаскель и нуб из Stackoverflow, и вот мой
первый и, вероятно, довольно простой вопрос Хаскеля.
module M where
import Data.HList
data R r a
r1 = undefined :: R a Int
r2 = undefined :: R a Double
rPair :: R r a -> R r b -> (R r a, R r b)
rPair = (,)
rp = rPair r1 r2
Это имеет смысл, даже если r1 и r2 полиморфны в r
rPair выравнивает тип r в соответствии с типом
подпись. Есть ли технический термин для этого «выравнивания»?
class HList l => RList r l
instance RList r HNil
instance RList r l => RList r (HCons (R r a) l)
rCons :: RList r l => R r a -> l -> (HCons (R r a) l)
rCons = hCons
rc = rCons r1 (rCons r2 hNil)
rCons прекрасно работает, если переданные R мономорфны в r,
ограничивая тип r списка по желанию. но если они
полиморфны в r, это не выравнивает их так, как rPair
делает, и дает ошибку (определение rc выше).
No instance for (RList r (HCons (R r1 Double) HNil))
У меня есть смутная интуиция относительно того, почему это так, но
мой вопрос состоит из двух частей. Может ли кто-нибудь четко объяснить
феномен? Как бы я написал rCons так, чтобы
следующее будет иметь место?
r1 = undefined :: R a Int
r2 = undefined :: R a Double
rc :: HCons (R a Int) (HCons (R a Double) HNil)
rc = rCons r1 (rCons r2 hNil)
Спасибо,
_c