F#中Monad法则的解释

dag*_*lee 9 monads f#

这是Haskell 中Monad定律的解释.

如何解释F#中的Monad法则?

  1. bind(M,return)相当于M.

  2. bind((返回x),f)等价于f x.

  3. bind(bind(m,f),g)相当于bind(m,(fun x - > bind(fx,g))).

Tom*_*cek 13

我认为在F#中理解它们的一个好方法是使用计算表达式语法来查看它们的含义.我会写m一些计算构建器,但你可以想象这是async或任何其他计算类型.

左派身份

m { let! x' = m { return x }   =   m { let x' = x
    return! f x' }                     return! f x' }
Run Code Online (Sandbox Code Playgroud)

正确的身份

m { let! x = comp              =   m { return! comp }
    return x }
Run Code Online (Sandbox Code Playgroud)

关联性

m { let! x = comp              =   m { let! y = m { let! x = comp
    let! y = f x                                    return! f x }
    return! g y }                      return! g y }
Run Code Online (Sandbox Code Playgroud)

法律基本上告诉你,你应该能够在不改变含义的情况下将一个版本的程序重构到另一个版本 - 就像你可以重构普通的F#程序一样.

  • Associativity的例子有点令人困惑:正确的代码示例中的`g`发生了什么?应该最后一行是"返回!gy`? (2认同)
  • @ChristopherStevenson 我只花了 4.5 年时间就修复了这个拼写错误! (2认同)