このようなものが存在するはずですが、それをフレーズする方法はわかりません。任意の種類のパラメータと既知の戻り値の型で関数を定義します。
したがって、任意のタイプの任意の数のパラメータ(ゼロから)を取り、既知の型の値を返すことができる一般化された関数を定義する方法はありますか?我々は
f: <something_here> => Int
よりも、これを満足しなければならないInt
を返す任意の関数を定義するのであれば。
このようなものが存在するはずですが、それをフレーズする方法はわかりません。任意の種類のパラメータと既知の戻り値の型で関数を定義します。
したがって、任意のタイプの任意の数のパラメータ(ゼロから)を取り、既知の型の値を返すことができる一般化された関数を定義する方法はありますか?我々は
f: <something_here> => Int
よりも、これを満足しなければならないInt
を返す任意の関数を定義するのであれば。
いいえ、型の安全性を失うことなく(あなたの質問を正しく理解していると仮定します)最終的に、タイプの値を使用する唯一の方法は、 はString
をapply
メソッドに提供することですが、「Int
を返すすべての関数」にどのような引数を指定すればよいでしょうか?あなたは(あなたがいけない)型の安全性を失うことを喜んでいる場合
、あなたは
class UnsafeFunction[A] {
def apply(xs: Any*): A
}
object UnsafeFunction {
implicit def fromF1[A, B](f: A => B): UnsafeFunction[B] = new UnsafeFunction[B] {
def apply(xs: Any*) = f(xs(0).asInstanceOf[A])
}
implicit def fromF2[A, B, C](f: (A, B) => C): UnsafeFunction[C] = new UnsafeFunction[C] {
def apply(xs: Any*) = f(xs(0).asInstanceOf[A], xs(1).asInstanceOf[B])
}
...
}
これはタイプUnsafeFunction[Int]
の値にInt
を返す任意の機能を割り当てることができます、またはのようなもので、それを達成することができますそのような引数を取るメソッドに渡します。ここでも、私は実際にこれを使用することを提案していません。あなたは有効何ができるか
は、このようなA
があなたのタイプやメソッドの型パラメータでありA => Int
と(A, B) => Int
、などの一般的なタイプを使用しています。 Scala自体では、異なる番号ののパラメータを統一することはできませんが、Shapelessというライブラリがあります。残念なことに、それを使用することは自明ではありません。
私は、これはそれを行うだろうと思う:
def f[T](x:T*): Int = ???
それはタイプT
の任意の数の引数を取り、Int
を返します。関数内で変数x
にアクセスするとSeq[T]
となり、それに応じてパラメータを処理できます。
しかし、あなたがそれらをどうしたいかに応じて、タイプT
の上限を定義することができます。
Any
をパラメータに、Intを返す型を とすることができます。機能上記
def f(x: Any*) : Int = x.length
は、任意のタイプの任意の数のパラメータを取り、 渡されたパラメータの数を返しますあなたはとしてそれを実行することができます - これはあなたの疑問を明確に
f(1,2,3) // This will return 3
f(1,'b') // This will return 2
願っています!