Listable
がケース クラスのコンパニオン オブジェクトに混在することを意図しているこの例を考えてみましょう。したがって、 を呼び出すには、 が定義されたを拡張Writer.grid
するコンパニオン オブジェクトが必要です。(たとえば、任意のリストをCSV 形式に変換するとします。)A
Listable[A]
implicit Writer[A]
Listable
trait Listable[A] {
def list: List[A]
}
object Writer {
def grid[A <: Listable[A]](listable: A)(implicit w: Writer[A]): String = {
listable.list.map(w.write(_).mkString(",")).mkString("\n")
}
}
trait Writer[A] {
def write(a: A): List[String]
}
そして、ここに素朴な実装があります:
case class Test(id: Int, text: String)
object Test extends Listable[Test] {
def list = List(Test(1, "test"))
implicit val wrt = new Writer[Test] {
def write(t: Test) = List(t.id.toString, t.text)
}
}
これはコンパイルされますが、listable: A
実際にはオブジェクトTest
を参照し、ケースではクラスを参照しているA
ため、機能しません。w: Writer[A]
Test
Writer.grid(Test)
の署名を捨てListable
て要求することで、この問題をある程度回避できます。implicit List[A]
grid
def grid[A](implicit w: Writer[A], list: List[A]): String = ...
しかし、私は次のことを好みます:
- 予期しない結果を生成する可能性があるような暗黙的な関数は必要ありません。
list
他の場所でも使用されるため、wrap に特別なタイプを使用しないでください。grid
メソッドの定義を の外部に保持しますListable
。
これを機能させるために の署名を作り直すことは可能Writer.grid
ですか? (またはその他の構造変更)