Я новичок в Haskell и Stackoverflow, и вот мой первый и, вероятно, довольно простой вопрос о Haskell.
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)
Спасибо, _с