col*_*red 7 scala scalaz scalaz7
scalaz选项monoid的定义如下:
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
}
Run Code Online (Sandbox Code Playgroud)
f2
是名称param的传递,这意味着每个调用将评估表达式.为什么要在模式匹配中进行评估时再次进行评估?返回Some(a2)
应该是相同的结果,并且表达式f2
可能非常昂贵.
我错过了什么吗?
在我看来,它是为了强调问题的对称性和清晰度而编写的,而不是为了速度。您不能仅仅放弃第二个参数的惰性,因为Semigroup
它是这样定义的,并且在其他情况下,第二个参数的惰性可能是必不可少的。为了保留问题对称性的视觉表示,您可能只想添加
val g2 = f2 // Force evaluation
(f1, g2) match { ...
Run Code Online (Sandbox Code Playgroud)
或类似的东西。
(如果可以通过名称参数调用“惰性”来自动记忆它们,那就太好了。)
归档时间: |
|
查看次数: |
449 次 |
最近记录: |