関数モナドと少し混乱しています。関数モナドは次のように定義されています。
instance Monad ((->) r) where
return x = \_ -> x
h >>= f = \w -> f (h w) w
バインディング操作を記述して、それを試してみました。
( (*2) >>= (+10) ) 3
(return 3) :: ((->) Int)
しかし、それはエラーを引き起こしました。また、関数AddStuffをバインディング操作に書き直そうとしています。
addStuff = do
a <- (*2)
b <- (+10)
return (a+b)
次に、この関数をに変換します
addStuff' w = (*2) w >>= (\a ->
(+10) w >>= (\b ->
return (a+b) ))
新しい関数のタイプを確認します。
addStuff :: (Monad m, Num (m b), Num b) => m b -> m b
何故ですか?どうすれば修正できますか?