这种一元法律的意义何在?

Mic*_*ael 0 monads functional-programming scala

我正在读一篇关于"monadic law" 的文章.该文提到的第一部法律是:

m map f ? m flatMap {x => unit(f(x))}

对于Scala,Option它意味着:

option map f ? option flatMap {x => Option(f(x))}

现在我想知道法律观点是什么.为什么法律很重要?如果斯卡拉Option不遵守这项法律怎么办?

dre*_*xin 7

如果它不遵守monad法律则不是monad.这实际上是为什么unitOptionSome.apply,不Option.apply.看看这个案例:

scala> val f = (x: Int) => null

scala> (option map f) == (option flatMap {x => Option(f(x))})
res4: Boolean = false
Run Code Online (Sandbox Code Playgroud)

这里的特定法律只是说,这map基本上是flatMap和的组合unit

  • @Michael有一大堆有用的计算涉及**monads一般**而不是特定的monad,例如`Option`.这些计算依赖于monad定律的正确性.如果你使'Option`的运行方式略有不同,以至于它不是monad,那么你仍然得到你的(变体)`Option`.但是你不会得到所有*extra*泛型monad功能(例如编写for-comprehension的能力)不适用. (2认同)
  • 编程中monad的重点很多就是代码重用; 有许多有用的操作系列可以在各种不同的类型上定义,一旦你认识到各种各样的不同类型都是monad的实例,结果只是同一个泛型操作的特殊情况.因此(在使用monad的编程社区中很常见)在您开始编写程序之前,已经为您编写了许多这些操作. (2认同)