だからここでは例を行く:
object CsvEncoder {
// "Summoner" method
def apply[A](implicit enc: CsvEncoder[A]): CsvEncoder[A] =
enc
// "Constructor" method
def instance[A](func: A => List[String]): CsvEncoder[A] =
new CsvEncoder[A] {
def encode(value: A): List[String] =
func(value)
}
// Globally visible type class instances
}
私が理解していないことは、適用メソッドの必要性ですか?上記の文脈で何をしていますか?
その後、ガイドでは、私は型クラスのインスタンスを作成することができます方法について説明します。だから私の質問は今、この作業を行うか、ある
implicit val booleanEncoder: CsvEncoder[Boolean] =
instance(b => if(b) List("yes") else List("no"))
:
implicit val booleanEncoder: CsvEncoder[Boolean] =
new CsvEncoder[Boolean] {
def encode(b: Boolean): List[String] =
if(b) List("yes") else List("no")
}
が実際に短縮されましたか?私が得られないことは、適用メソッドの必要性ですか?
EDIT:
- は型クラスの契約トレイトはFooを定義します。私は以下のように型クラスを作成する手順を説明したブログ記事に出くわしました。
- 暗黙のように機能するヘルパーメソッドapplyと、通常は関数からFooインスタンスを定義する方法で、コンパニオンオブジェクトFooを定義します。
- 単項演算子または二項演算子を定義するFooOpsクラスを定義します。
- FooインスタンスからFooOpsを暗黙的に提供するFooSyntax特性を定義します。
ポイント番号2,3,4の取引とは何ですか? object CsvEncoder
定義した直後のガイドを引用
タイプクラスを作成するこのプラクティスについて詳しく教えてください。私は今質問を編集しました! – sparkr