我无法理解 this Scala 中 Book FP 中的代码。这是代码:
trait Monoid[A] {
def op(a1: A, a2: A): A
def zero: A
}
def endoMonoid[A]: Monoid[A => A] = new Monoid[A => A] {
def op(f: A => A, g: A => A) = f compose g
val zero = (a: A) => a
}
def foldMap[A, B](as: List[A], m: Monoid[B])(f: A => B): B =
as.foldLeft(m.zero)((b, a) => m.op(b, f(a)))
// The function type `(A, B) => B`, when curried, is `A => (B => B)`.
// And of course, `B => B` is a monoid for any `B` (via function composition).
def foldRight[A, B](as: List[A])(z: B)(f: (A, B) => B): B =
foldMap(as, endoMonoid[B])(f.curried)(z)
foldMap
期待一个函数 f: A => B
.在
foldRight
, 当 f
curry 你有A => (B => B)
,所以我想f.curried
正在工作,因为它与 (A => B => B)
相同, 所以 foldRight
正在传递给 foldMap
它期望什么(类型为 A => B
的函数),然后,接下来发生的是 foldMap
被调用并返回一个函数 B => B
, 那就是 z
在 (f.curried)(z)
中发挥作用你调用函数B => B
带有参数 z
获得最终 B
.我对吗?对我来说,推理这段代码有点复杂。
注意:这里是 scalafiddle如果你想玩它。
最佳答案
好吧,你对我来说似乎很全面。不过,我要澄清几点:
f.curried
正在工作,因为 A => (B => B)
与 (A => B => B)
相同”( 它 在这里模棱两可你说的是 f.curried
结果类型基本上,而不是 z
) foldMap
期待一个函数 f: A => B 。在 foldRight, ... ”以及几乎所有其他地方。更短的短语,更清晰的解释。 (f.curried)(z)
不能单独工作,也不会在 foldMap(as, endoMonoid[B])
之后调用.这是第一个foldMap(as, endoMonoid[B])(f.curried)
这被称为然后(z)
.第一个返回 B => B
并调用第二个返回 B
. 关于scala - 了解传入折叠的 curry 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55828508/