6

ほとんどの人が知っているように、scala では 2 つの方法で関数を定義できます。「def」メソッドとラムダ メソッドがあります...

「def」の種類をジェネリックにするのはかなり簡単です

def someFunc[T](a: T) { // insert body here

ここで問題を抱えているのは、次のジェネリックを作成する方法です。

val someFunc = (a: Int) => // insert body here

もちろん、今は a は整数ですが、それを汎用にするために何をする必要がありますか?

val someFunc[T] = (a: T) =>うまくいかない、どちらもうまくいかないval someFunc = [T](a: T) =>

それらをジェネリックにすることさえ可能ですか、それとも「def」バリアントに固執する必要がありますか?

4

4 に答える 4

3

私はそれが可能だとは思わない。詳細については、この以前の投稿を参照してください。

匿名のジェネリック Scala 関数を定義するにはどうすればよいですか?

それを回避する唯一の方法は(回答の1つが言及しているように)FunctionXのようなものを拡張し、クラスレベルでジェネリックを使用してから、それをapply関数のオーバーライドで使用することです。

于 2013-06-28T20:16:18.723 に答える
2

私もそれが可能だとは思いませんが、私は悲観主義者です。

http://www.chuusai.com/2012/04/27/shapeless-polymorphic-function-values-1/

編集:

これがあなたが求めているものではない場合は教えてください。しかし、これが受け入れられた回答があなたが求めていたものではない理由です。リンクを参照してください。

scala> :pa
// Entering paste mode (ctrl-D to finish)

def myId[A] = (a: A) => a

List(1,2,3) map myId
// List(1,2,3)

List("foo") map myId
// List("foo")

// Exiting paste mode, now interpreting.

myId: [A]=> A => A
res0: List[String] = List(foo)

scala> val f1 = myId[Int]
f1: Int => Int = <function1>

scala> val f2 = myId[String]
f2: String => String = <function1>

scala> List(1,2,3) map f2
<console>:10: error: type mismatch;
 found   : String => String
 required: Int => ?
              List(1,2,3) map f2
                              ^

scala> List("foo") map f1
<console>:10: error: type mismatch;
 found   : Int => Int
 required: String => ?
              List("foo") map f1
                              ^

関数の値は多態的ではありません。つまり、汎用的です。

于 2013-06-28T21:02:27.043 に答える
1

最も近いのは、私が信じているポリモーフィック関数です。

https://github.com/milessabin/shapeless#polymorphic-function-values

于 2013-06-28T22:00:27.747 に答える