Python 单子的bind()函数和>>运算符,PyMonad库的名称来自单子的函数式编程概念,即一个函数按严格的顺序求值。许多函数式编程背后都有一个基本假设:求值顺序是任意的,可以按需优化或重新排列。单子则是例外,它强制从左到右严格按顺序求值。
如前所述,Python的执行顺序是严格的,因此它不需要单子,但我们仍然可以应用此概念将复杂算法清晰化。
强制严格按顺序求值的技术是单子和返回单子的函数之间的一个纽带。一个扁平的表达式会变成优化编译器无法重新排序的嵌套绑定。函数bind()
映射为>>
运算符,因此可以编写如下表达式:
Just(some file) >> read header >> read next >> read next
上述表达式会转换为以下形式:
bind(
bind(
bind(Just(some file), read header),
read next),
read next)
这些bind()
函数确保了表达式从左到右严格按顺序求值。此外,上述表达式是函数式复合的一个示例。当使用>>
运算符创建单子时,创建的是一个复杂对象,它会在最终使用getValue()
方法时被求值。
子类Just()
用于创建一个兼容单子的简单对象,该对象封装了一个简单的Python对象。
对于高度优化且语法宽松的语言来说,通过单子的概念表达严格求值顺序至关重要。Python不需要单子是因为它遵循从左到右的严格求值顺序。由于单子并没有为Python环境带来一些全新的东西,因此很难展示其特性。的确,单子声明Python所遵循的典型严格求值规则的方式有点冗长。
在Haskell等语言中,单子对于文件读写等有严格顺序要求的情况来说至关重要。Python的命令式模式非常类似于Haskell的do
语句块,它有一个隐式的Haskell>>=
运算符用于强制语句的执行顺序。(类似于Haskell的>>=
运算,Python使用的是bind()
函数和>>
运算符。)