余暇にはHaskellを学んでいるので、これは初心者の質問です。
Either a
私の読書で、私はどのようにインスタンスが作成されるかを示す例に出くわしましたFunctor
:
instance Functor (Either a) where
fmap f (Right x) = Right (f x)
fmap f (Left x) = Left x
ここで、値コンストラクターの場合に実装がマップされる理由を理解しようとしていますが、 ?Right
の場合はマップされません。Left
これが私の理解です:
まず、上記のインスタンスを次のように書き直します
instance Functor (Either a) where
fmap g (Right x) = Right (g x)
fmap g (Left x) = Left x
今:
そんなこと知ってる
fmap :: (c -> d) -> f c -> f d
で代用
f
するEither a
とfmap :: (c -> d) -> Either a c -> Either a d
のタイプ
Right (g x)
はEither a (g x)
であり、のタイプg x
はd
であるため、のタイプはでRight (g x)
ある必要がありますEither a d
。これは、私たちが期待するものですfmap
(上記の2を参照)。ここで
Left (g x)
、同じ理由を使用して、そのタイプがEither (g x) b
、つまりEither d b
、期待するものではないことを示すことができfmap
ます(上記の2を参照)。d
これは、最初のパラメーターではなく、2番目のパラメーターである必要があります。したがって、にマップすることはできませんLeft
。
私の推論は正しいですか?