我是 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)
如果传递的 R 在 r 中是单态的,则 rCons 效果很好,可以根据需要限制列表的 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