Haskell ( Haskell - ), . ,
2) @Alexey Romanov, apply , implicitly[CsvEncoder[IceCream]] CsvEncoder[IceCream] (aka CsvEncoder.apply[IceCream]()), - .
3) FooOps DSL. , - :
trait Semigroup[A] {
...
def append(a: A, b: A)
}
import implicits._
implicitly[Semigroup[Int]].append(2,2)
append(2,2), :
trait Ops[A] {
def typeClassInstance: Semigroup[A]
def self: A
def |+|(y: A): A = typeClassInstance.append(self, y)
}
trait ToSemigroupOps {
implicit def toSemigroupOps[A](target: A)(implicit tc: Semigroup[A]): Ops[A] = new Ops[A] {
val self = target
val typeClassInstance = tc
}
}
object SemiSyntax extends ToSemigroupOps
4) :
import SemiSyntax._
import implicits._
2 |+| 2
, scala implicit class - , implicit class DSL - - () , ( ) ..
, : https://github.com/mpilquist/simulacrum.
CsvEncoder , instance -, apply () . , ( ), ( , ).