私の自由な時間に私はHaskellを学んでいるので、これは初心者の質問です。私はEither a
がFunctor
のインスタンス作られる様子を示した例に出くわした私の読書で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
として上記のインスタンスを書き換えてみましょう:
我々は
f
を置き換えた場合、私はそのfmap :: (c -> d) -> f c -> f d
を知っています
Either a
我々が得るfmap :: (c -> d) -> Either a c -> Either a d
Right (g x)
のタイプはEither a (g x)
で、g x
のタイプはd
あるので、我々はRight (g x)
の種類は、我々は(上記の2を参照)fmap
から期待するものである、Either a d
であることを持っている我々は
Left (g x)
を見れば今、私たちは、それは我々が(上記の2を参照)fmap
から何を期待されていない、Either d b
あり、その種類はEither (g x) b
であると言うことは同じ推論を使用することができます。d
は、二番目のパラメータでなければなりません、最初のものではありません!したがって、Left
にマップすることはできません。
私の推論は正しいですか?
いずれかはおそらくより明らかBifunctorファンクタより - 2領域マップ:: - ( - > M) - Bifunctor操作2領域マップを有し>( b→n)→fab→fm nとなる。これにより、左と右の両方の場合のマッピングが得られます。ハスケルの標準ライブラリにはBifunctorクラスがありません。これは、 "野生の" FunctorよりもBifunctorsの方がずっと少ないためです。どちらかとペア(a、b)には便利ですが。 –
3では、型の一部として(g x)を使用しますが、値です。それは '(g x)'ではなく、 'typeof(g x)'を書くことを意味しています。 – Peaker
@stephen tetley:それは興味深い!ありがとう – MarcoS