Function1 または PartialFunction で widen 関数を定義したいと思います。
次のようなユースケースがあるため、これを行いたいと思います。
class A
class B extends A
def foo(fun: Function[B, A]) = {
bar(fun.widen[A])
}
def bar(pf: PartialFunction[A, A]) = ???
上記のように、これを達成するために、次のような widen 関数を定義することを考えました。
implicit class AugmentedFunction[T, U](fun: T => U) {
def widen[T1 >: T]: PartialFunction[T1, U] = { case t: T => fun(t) }
}
残念ながら、これは消去のために機能しません。TypeTags の使用を検討してみましたが、これをコンパイラが満足する方法で表現できなかったようです。
明確化: 動作しないと言うときは、ScalaKata のコード スニペットの特定のケースで、実際には例外をスローして「定義されていません」と出力すべきではないのに、使用すると例外がスローされることを意味します (ScalaKata コード スニペットを参照)。
私の質問:
この問題を正しく解決するにはどうすればよいですか? Scalaz や Shapeless には、私が気付いていない機能が既に存在するのでしょうか? そもそもこんなことして意味あるの?
すべてのコードを含むスニペットを次に示します: http://www.scalakata.com/527bb729e4b0b1a1c4db1a73