这是Haskell中的Explanation of Monad laws。
如何解释F#中的Monad法则?
bind(M,return)相当于M.
bind((返回x),f)相当于f x。
bind(bind(m,f),g)相当于bind(m,(fun x - > bind(f x,g)))。
答案 0 :(得分:11)
我认为在F#中理解它们的好方法是使用计算表达式语法来查看它们的含义。我会为某些计算构建器编写m
,但您可以想象这是async
或任何其他计算类型。
左侧身份
m { let! x' = m { return x } = m { let x' = x
return! f x' } return! f x' }
正确的身份
m { let! x = comp = m { return! comp }
return x }
<强>结合性强>
m { let! x = comp = m { let! y = m { let! x = comp
let! y = f x return! f x }
return! g y } return! g y }
法律基本上告诉你,你应该能够在不改变含义的情况下将一个版本的程序重构到另一个版本 - 就像你可以重构普通的F#程序一样。