我正在阅读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
不遵守这项法律怎么办?
答案 0 :(得分:7)
如果它不遵守monad法则,那就不是monad。这就是为什么unit
Option
为Some.apply
而非Option.apply
的原因。看看这个案例:
scala> val f = (x: Int) => null
scala> (option map f) == (option flatMap {x => Option(f(x))})
res4: Boolean = false
这里的具体法律只是说,map
基本上是flatMap
和unit
的组合