gpt4 book ai didi

scala - 为什么 scalaz 的 Monoid for Option 实现对 f2 函数求值两次?

转载 作者:行者123 更新时间:2023-12-04 12:33:05 24 4
gpt4 key购买 nike

scalaz 的选项幺半群的定义如下:

implicit def optionMonoid[A: Semigroup]: Monoid[Option[A]] = new Monoid[Option[A]] {
def append(f1: Option[A], f2: => Option[A]) = (f1, f2) match {
case (Some(a1), Some(a2)) => Some(Semigroup[A].append(a1, a2))
case (Some(a1), None) => f1
case (None, Some(a2)) => f2
case (None, None) => None
}

def zero: Option[A] = None
}
f2是一个按名称传递的参数,这意味着每个调用都会评估表达式。刚刚在模式匹配中求值,为什么还要再求值呢?返回 Some(a2)应该是相同的结果和表达式 f2可能非常昂贵。

我错过了什么吗?

Scalaz's Option.scala source

最佳答案

在我看来,它的编写是为了突出问题的对称性,并且是为了清晰,而不是为了速度。自 Semigroup 以来,您不能只是放弃第二个参数的懒惰以这种方式定义它,在其他情况下,第二个参数的懒惰可能是必不可少的。为了保留问题对称性的视觉表示,您可能只想添加

val g2 = f2  // Force evaluation
(f1, g2) match { ...

或诸如此类。

(如果按名称参数可以被称为惰性自动内存它们,那就太好了。)

关于scala - 为什么 scalaz 的 Monoid for Option 实现对 f2 函数求值两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16346154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com