Scala 这个一元法则的意义是什么?

Scala 这个一元法则的意义是什么?,scala,functional-programming,monads,Scala,Functional Programming,Monads,我正在读一本关于“一元法则”的书。文章提到的第一条法律是: m map f ≡ m flatMap {x => unit(f(x))} 现在我想知道法律要点是什么。为什么法律很重要?如果Scala选项不遵守这条定律怎么办?如果它不遵守单子定律,它就不是单子。这就是为什么选项的单元是部分。应用而不是选项。应用。看看这个案例: scala> val f = (x: Int) => null scala> (option map f) == (option flatMap {x =

我正在读一本关于“一元法则”的书。文章提到的第一条法律是:

m map f ≡ m flatMap {x => unit(f(x))}
现在我想知道法律要点是什么。为什么法律很重要?如果Scala
选项
不遵守这条定律怎么办?

如果它不遵守单子定律,它就不是单子。这就是为什么
选项
单元
部分。应用
而不是
选项。应用
。看看这个案例:

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

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

这里的特殊法则只是说,
map
基本上是由
flatMap
unit

组成的,谢谢!我仍然想知道为什么选择单子很重要。非一元选择有什么不对?它只是意味着它有某种行为。例如,作为一个单子是在一个用于理解的语言中使用的先决条件。然而,scala不执行法律。这就是为什么
Try
(不是单子)仍然可以用于理解的原因。@Michael有很多有用的计算涉及单子,而不是特定的单子,例如
选项
。这些计算依赖于单子定律的正确性。如果您使
选项
的操作稍有不同,因此它不是monad,那么您仍然拥有
选项的(变体)
。但是你不会得到所有不适用的额外通用monad功能(比如为理解而编写的能力);有许多有用的操作可以在各种各样的不同类型上定义,一旦你认识到各种各样的不同类型都是单子的实例,它们就变成了同一个泛型操作的特例。因此(在编程社区中,单子的使用非常普遍),在你坐下来开始编写程序之前,这些操作中的许多已经为你编写好了。看到下面的例子会很酷:让
A[T]
defines
flatMap(f:T=>A[T]):A[T]={…}
。让
flatMap
违反某些一元法则。现在,让我们用
A[T]
进行写作以获得理解。虽然Scala确实允许这样的理解,但它在这方面和那方面都被打破了。
scala> val f = (x: Int) => null

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