これが私がこれまでに持っているものです。私が達成したいのは、コンテナーが含まれている型のように動作するようにすることです。
implicit def transformer[T, A](f: T => A)
: List[T] => List[A] =
t => t map f
implicit def combiner[T, U, A](f: (T, U) => A)
: (List[T], List[U]) => List[A] =
(t , u ) => t zip u map { x => f(x._1, x._2) }
val x = List(1, 2, 3)
val f: Int => Int = (_ + 1)
val fx = f(x) // fx = List(2,3,4)
val g: (Int, Int) => Int = (_ + _)
val gxx = g(x, x) // gxx = List(2,4,6)
今、これは私が関数に望むように機能します。しかし、私は方法に問題があります。たとえば、これは明らかに機能しません。
val double = x + x
+ は List[Int] のメソッドでなければならず、そうではないため、これは機能しません。
メソッド名を抽出し、基になる型に適用できるその名前の関数がスコープ内にあるかどうかを確認し、暗黙的な定義でそれを持ち上げる必要があります。
または、インスタンス化時に基になる型を何らかの方法でスキャンし、適切なメソッドを定義する型コンストラクターを使用して実行できる場合もあります。
どちらも非常に醜い解決策であり、実行可能かどうかさえ確信が持てません。すべてのメソッドを明示的に記述する必要がない、私が望むものを達成する他の方法はありますか?