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

时间:2013-11-21 15:59:14

标签: scala functional-programming monads

我正在阅读article关于“monadic law”的内容。该文提到的第一项法律是:

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

对于Scala Option,它意味着:

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

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

1 个答案:

答案 0 :(得分:7)

如果它不遵守monad法则,那就不是monad。这就是为什么unit OptionSome.apply而非Option.apply的原因。看看这个案例:

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

scala> (option map f) == (option flatMap {x => Option(f(x))})
res4: Boolean = false

这里的具体法律只是说,map基本上是flatMapunit的组合