0

これが私がこれまでに持っているものです。私が達成したいのは、コンテナーが含まれている型のように動作するようにすることです。

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] のメソッドでなければならず、そうではないため、これは機能しません。

メソッド名を抽出し、基になる型に適用できるその名前の関数がスコープ内にあるかどうかを確認し、暗黙的な定義でそれを持ち上げる必要があります。

または、インスタンス化時に基になる型を何らかの方法でスキャンし、適切なメソッドを定義する型コンストラクターを使用して実行できる場合もあります。

どちらも非常に醜い解決策であり、実行可能かどうかさえ確信が持てません。すべてのメソッドを明示的に記述する必要がない、私が望むものを達成する他の方法はありますか?

4

1 に答える 1

1

ダイナミクスを見たことがありますか?標準の Java リフレクションと組み合わせると、問題が解決する場合があります。IDE のコンテンツ アシストがこれで混乱するかどうかはわかりませんが...

于 2013-05-01T14:59:01.137 に答える