【问题标题】:The >>= implementation of (State s) Monad in Haskell>>= Haskell 中 (State s) Monad 的实现
【发布时间】: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
  • 作者在此处提供了与其类型相匹配的变量名称。第一个函数给出as (newState),第二个函数(f) 将a 转换为m b

标签: haskell functional-programming state


【解决方案1】:

由于f 的类型为a -> m b(实际上是a -> State s b),因此其输入的类型为a。它是 输出,其类型的形状为您提到的 s -> (b, s)(实际上是 State s b)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 2018-08-27
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多