Je recherchais l'implémentation de Monoid dans Scalaz. Je suis tombé sur l'opérateur |+| qui est censé venir hors de la boîte si vous définissez l'opération append sur Monoid. La définition de cet opérateur est SemigroupSyntax. Cette classe obtient à Monoid par Semigroup.Implémentation Scalaz de Semigroup à l'aide des fonctionnalités avancées de Scala
Après avoir examiné ces trois classes, j'ai une grande question - Comment est exactement le commentaire de SemigroupSyntax réalisé /** Wraps a value `self` and provides methods related to `Semigroup` */
Il y a un peu de magie avec implicits, appelant .this
sur trait et plus dans le SemigroupSyntax que je Honnêtement, ne comprends pas.
J'aimerais que quelqu'un prenne le temps de m'éclairer.
Merci d'avance!
EDIT:
Je suis désireux de comprendre le fonctionnement de cette classe:
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)
////
}
et son site d'appel à Semigroup:
val semigroupSyntax = new scalaz.syntax.SemigroupSyntax[F] { def F = Semigroup.this }
Si vous collez le code que vous ne comprenez pas, il serait beaucoup plus facile de vous aider. – pedrofurla