ファンクタf
は次のように定義されている、いわゆる「リーダーファンクタ」、次のとおりです。もちろん
newtype Reader r = Reader (r -> a)
、Haskellで、これが機能するためにネイティブに実装するので、ノーがあるさ実行時にラップまたはアンラップする。
対応Functor
とApplicative
インスタンスは、このようになりますように
instance Functor f where
fmap :: (a -> b) -> (r -> a)_-> (r -> b)
fmap f g = \x -> f (g x) -- or: fmap = (.)
instance Applicative f where
pure :: a -> (r -> a) -- or: a -> r -> a
pure x = \y -> x -- or: pure = const
(<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)
frab <*> fra = \r -> frab r (fra r)
、リーダファンクタ型を生成コンテキストr
を有し、他の全てのファンクタのような、あまりにも「ボックス」であるa
。
それでは(,) <$> sum
を見てみましょう:
:t (,) :: a -> b -> (a, b)
:t fmap :: (d -> e) -> (c -> d) -> (c -> e)
:t sum :: Foldable t, Num f => t f -> f
現在t f
にb -> (a, b)
とc
にa ~ f
、e
にd
タイプを特化することができます。今、私たちが得る:
:t (<$>) -- spcialized for your case
:: Foldable t, Num f => (a -> (b -> (a, b))) -> (t f -> f) -> (t f -> (b -> (a, b)))
:: Foldable t, Num f => (f -> b -> (f, b)) -> (t f -> f) -> (t f -> b -> (f, b))
は、関数を適用する:
GHCが言うまさにある
:t (,) <$> sum
:: Foldable t, Num f => (t f -> b -> (f, b))
。
' <$>中置されています。 – chepner