【发布时间】:2017-11-16 18:48:46
【问题描述】:
我正在阅读一些关于 ScalaZ 的文章,并且有一个关于理解它的问题。在这个article中,我们泛化了sum函数,抽象出要求和的类型。
def sum[T](xs: List[T])(implicit m: Monoid[T]) = //...
在哪里
trait Monoid[A] 定义如下:
trait Monoid[A] {
def mappend(a1: A, a2: A): A
def mzero: A
}
是的,这很清楚。这里的 Monoid 对应于algebraic monoid structure。现在在这个article 中,它对列表进行了抽象。为此,我们定义了以下特征:
trait FoldLeft[F[_]] {
def foldLeft[A, B](xs: F[A], b: B, f: (B, A) => B): B
}
object FoldLeft {
implicit val FoldLeftList: FoldLeft[List] = new FoldLeft[List] {
def foldLeft[A, B](xs: List[A], b: B, f: (B, A) => B) = xs.foldLeft(b)(f)
}
}
所以现在我们可以定义 sum 函数如下:
def sum[M[_]: FoldLeft, A: Monoid](xs: M[A]): A = {
val m = implicitly[Monoid[A]]
val fl = implicitly[FoldLeft[M]]
fl.foldLeft(xs, m.mzero, m.mappend)
}
我不是理论类别专家,但对我来说它看起来像 Applicative functor。那是对的吗?我们能否提供与类别理论的这种相似性。
【问题讨论】:
标签: scala scalaz applicative foldleft foldable