Haskellでモナドを定義するときって、FunctorとApplicativeのインスタンスにする必要もあって面倒くさいですよね。
そこで、FunctorとApplicativeを以下のように定義すると簡単です。
instance
newtype Foo s = Foo s
instance Functor Foo where
fmap f mv = do
v <- mv
return $ f v
instance Applicative Foo where
pure = return
mf <*> mv = do
f <- mf
v <- mv
return $ f v
instance Monad Foo where
...
Identity、Maybe、Either、List、Writer、Reader、Stateあたりのモナドはこの定義で正しく動きます。
質問は、「この定義でFunctorとApplicativeを正しく定義できないモナドは存在するか」もしくは、「これ以外のFunctorとApplicativeの定義でモナド則を満たすモナドは定義できるか」ということです。
強い人だれか懇切丁寧に教えて下さい……