我对函数 monad 有一些困惑。函数 monad 定义如下:
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
这是为什么?我该如何解决?