这是Haskell中对 Monad 定律的解释。
如何解释 F# 中的 Monad 定律?
bind (M, return) 等价于 M。
bind ((return x), f) 等价于 f x。
bind (bind (m, f),g) 等价于 bind(m, (fun x -> bind (fx, g)))。
这是Haskell中对 Monad 定律的解释。
如何解释 F# 中的 Monad 定律?
bind (M, return) 等价于 M。
bind ((return x), f) 等价于 f x。
bind (bind (m, f),g) 等价于 bind(m, (fun x -> bind (fx, g)))。
我认为在 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# 程序一样。