すごいHaskell十一章

 難しすぎて1日1ページのペース。


234pの真ん中下、 Either って Functor のインスタンスじゃないみたいだけど…

ghci> fmap (replicate 3) (Right "blah")

<interactive>:19:1:
    No instance for (Functor (Either a0))
      arising from a use of `it'
    Possible fix: add an instance declaration for (Functor (Either a0))
    In the first argument of `print', namely `it'
    In a stmt of an interactive GHCi command: print it
ghci> :i Either
data Either a b = Left a | Right b      -- Defined in `Data.Either'
instance (Eq a, Eq b) => Eq (Either a b)
  -- Defined in `Data.Either'
instance (Ord a, Ord b) => Ord (Either a b)
  -- Defined in `Data.Either'
instance (Read a, Read b) => Read (Either a b)
  -- Defined in `Data.Either'
instance (Show a, Show b) => Show (Either a b)
  -- Defined in `Data.Either'

(追記)Cotrol.Monad.Instances を import してなかったのが原因だった。

ghci> import Control.Monad.Instances
ghci> fmap (replicate 3) (Right "blah")
Right ["blah","blah","blah"]


 インスタンス定義だけを別のモジュールでやることができるんだな。

ghci> import Control.Monad.Instances
ghci> :i Functor
class Functor f where
  fmap :: (a -> b) -> f a -> f b
  (GHC.Base.<$) :: a -> f b -> f a
        -- Defined in `GHC.Base'
instance Functor Maybe -- Defined in `Data.Maybe'
instance [safe] Functor (Either a)
  -- Defined in `Control.Monad.Instances'
instance [safe] Functor ((->) r)
  -- Defined in `Control.Monad.Instances'
instance [safe] Functor ((,) a)
  -- Defined in `Control.Monad.Instances'
instance Functor [] -- Defined in `GHC.Base'
instance Functor IO -- Defined in `GHC.Base'

アプリカティブ

<*> はファンクターの中に入ってる関数を引っ張りだして、別のファンクター値に適用してくれるっぽい。
アプリカティブスタイルを使うとファンクタがバリバリ使えるようになるのはわかるけど、ファンクタがどういう局面で使われるのか、まだよくわかってない。→そうか、リストもファンクタか。


なんかイディオム的なのが多い気が