我正在Scalaz中深入探索Monoid的實現。如果您在Monoid上定義附加操作,我碰到|+|運營商應該來開箱即用。該算子的定義在SemigroupSyntax。該班通過Semigroup獲得Monoid。Scalaz實現使用先進的Scala功能的Semigroup
檢查這三個類之後,我有一個重要的問題 - 究竟是如何從SemigroupSyntax實現/** Wraps a value `self` and provides methods related to `Semigroup` */
有一些魔術implicits,在SemigroupSyntax呼籲.this
對性狀多的評論,我老實說不明白。
如果有人能花時間開導我,我會愛上。
預先感謝您!
編輯:
我渴望瞭解這個類的工作方式:
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)
////
}
而且其調用點半羣:
val semigroupSyntax = new scalaz.syntax.SemigroupSyntax[F] { def F = Semigroup.this }
如果你粘貼你不明白的代碼會更容易幫助你。 – pedrofurla