【发布时间】:2020-03-02 14:09:53
【问题描述】:
在《Learn You A Haskell for Great Good》一书中,(State s) Monad 中 >>= 运算符的实现是:
instance Monad (State s) where
return x = State $ \s -> (x, s)
(State h) >>= f = State $ \s -> let (a, newState) = h s
(State g) = f a
in g newState
我们知道,>>= 运算符的类型为>>=::m a -> (a -> m b) -> m b。这个算子的第二个参数是一个函数f,它的类型是(a -> m b),那么为什么(State s)的实现中函数f的输入类型不是s -> (a, s) 但只是结果 a?
谢谢大家!我想我已经弄清楚 >> = 是如何工作的了。 我们不能将函数 f 的输入类型视为 Monad 中包含的类型,但我们应该将其视为 monad 的输入类型.
【问题讨论】:
-
a -> m b类型的字面意思是“一个输入a和输出m b的函数”。这就是为什么它的输入是a -
作者在此处提供了与其类型相匹配的变量名称。第一个函数给出
a和s(newState),第二个函数(f) 将a转换为m b。
标签: haskell functional-programming state