instance Monad ((->) r) where>>= 的类型 是 输入monadic value, 输出也是monadic value. 输入是 函数, 输出也应该是函数。 所以输出 lambda 函数。
return x = \_ -> x
h >>= f = \w -> f (h w) w
要从一个函数得到一个结果,我们必须喂给他一些东西,这也是为什么我们先用 (h w)
取得结果,然后将他丢给f
。而 f
回传一个 monadic value,在这边这个 monadic value 也就是一个函数。我们再把 w
喂给他。<记录下, 没全明白>
import Control.Monad.Instances
addStuff :: Int -> Int
addStuff = do
a <- (*2)
b <- (+10)
return (a+b)
ghci> addStuff 3
19
addStuff :: Int -> Intfunction monad 也被称作 reader monad。所有函数都从一个固定的地方读取
addStuff x = let
a = (*2) x
b = (+10) x
in a+b
我们见识了把函数视作具有 context 的值很自然的可以表达成 reader monad。只要我们当作我们知道函数会回传什么值就好。他作的就是把所有的函数都黏在一起做成一个大的函数,然后把这个函数的参数都喂给全部组成的函数,这有点取出他们未来的值的意味。实作做完了然后 >>=
就会保证一切都能正常运作。