【发布时间】:2017-12-29 09:18:23
【问题描述】:
我正在研究 Scalaz 中 Monoids 的实现。我遇到了|+| 运算符,如果您在 Monoid 上定义 append 操作,它应该是开箱即用的。该运算符的定义在 SemigroupSyntax 中。该类通过Semigroup 进入 Monoid。
在检查了这三个类之后,我有一个主要问题 - SemigroupSyntax 的评论究竟是如何达到/** Wraps a value `self` and provides methods related to `Semigroup` */
有一些隐含的魔力,在 trait 上调用 .this 等等,我真的不明白 SemigroupSyntax。
如果有人能花时间启发我,我会很高兴。
提前谢谢你!
编辑:
我很想了解这个类的工作原理:
package scalaz
package syntax
/** Wraps a value `self` and provides methods related to `Semigroup` */
final class SemigroupOps[F] private[syntax](val self: F)(implicit val F: Semigroup[F]) extends Ops[F] {
////
final def |+|(other: => F): F = F.append(self, other)
final def mappend(other: => F): F = F.append(self, other)
final def ⊹(other: => F): F = F.append(self, other)
////
}
trait ToSemigroupOps {
implicit def ToSemigroupOps[F](v: F)(implicit F0: Semigroup[F]) =
new SemigroupOps[F](v)
////
////
}
trait SemigroupSyntax[F] {
implicit def ToSemigroupOps(v: F): SemigroupOps[F] = new SemigroupOps[F](v)(SemigroupSyntax.this.F)
def F: Semigroup[F]
////
def mappend(f1: F, f2: => F)(implicit F: Semigroup[F]): F = F.append(f1, f2)
////
}
以及它在 Semigroup 中的调用点:
val semigroupSyntax = new scalaz.syntax.SemigroupSyntax[F] { def F = Semigroup.this }
【问题讨论】:
-
如果您粘贴您不理解的代码,它会更容易帮助您。
标签: scala traits implicits monoids semigroup