使用高级Scala功能的Scalaz实现Semigroup

时间:2017-07-23 20:19:46

标签: scala traits implicits monoids semigroup

我正在挖掘Scalaz中Monoid的实现。如果你在Monoid上定义了追加操作,我遇到了|+|运算符,该运算符应该是开箱即用。此运算符的定义位于 SemigroupSyntax 中。该课程通过Semigroup获得Monoid。

在检查了这三个课程之后,我有一个主要问题 - SemigroupSyntax 的评论究竟是如何实现的/** Wraps a value `self` and provides methods related to `Semigroup` */

有一些神奇的含义,在特质上调用.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 }

0 个答案:

没有答案
相关问题