私は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))
なぜそうなるのかについては漠然とした直感がありますが、私の質問は2つの部分に分かれています。誰かがその現象を明確に説明できますか?次のように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