2017-05-11 10 views
1

このようなものが存在するはずですが、それをフレーズする方法はわかりません。任意の種類のパラメータと既知の戻り値の型で関数を定義します。

したがって、任意のタイプの任意の数のパラメータ(ゼロから)を取り、既知の型の値を返すことができる一般化された関数を定義する方法はありますか?我々は

f: <something_here> => Int 

よりも、これを満足しなければならないIntを返す任意の関数を定義するのであれば。

答えて

1

いいえ、型の安全性を失うことなく(あなたの質問を正しく理解していると仮定します)最終的に、タイプの値を使用する唯一の方法は、 はStringapplyメソッドに提供することですが、「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というライブラリがあります。残念なことに、それを使用することは自明ではありません。

1

私は、これはそれを行うだろうと思う:

def f[T](x:T*): Int = ??? 

それはタイプTの任意の数の引数を取り、Intを返します。関数内で変数xにアクセスするとSeq[T]となり、それに応じてパラメータを処理できます。

しかし、あなたがそれらをどうしたいかに応じて、タイプTの上限を定義することができます。

1

Anyをパラメータに、Intを返す型を とすることができます。機能上記

def f(x: Any*) : Int = x.length 

は、任意のタイプの任意の数のパラメータを取り、 渡されたパラメータの数を返しますあなたはとしてそれを実行することができます - これはあなたの疑問を明確に

f(1,2,3) // This will return 3 
f(1,'b') // This will return 2 

願っています!

関連する問題