2016-04-18 6 views
0

に型引数を取り除くことは、私は次のように定義された関数があるとします。スカラ:機能

def fun[T](somevar: SomeType[T]) = { 
    // some action 
} 

は、型パラメータ[T]のRIDはgitとちょうど

としてそれを使用する方法はあります
def fun(somevar: SomeType[T]) = { 
    // some action 
} 

つまり、タイプ情報は既にsomeVarの中にあるはずですか?何とか使ってみませんか?

+0

これは、関数を定義するときに余分な文字を入力しないようにするだけですか?あるいは何かを得ることを望んでいますか? –

+0

さて、プログラマーとしては問題ではありません。 Scalaベースの言語(Scalaプログラマーではないユーザー)が使用するためのScalaベースの言語を作成しているということです。そのため、Scala以外のユーザーにとっては、できるだけシンプルにしようとしています。 – Daniel

+0

私が意図したことは、関数名が定義されたときに書かれた方法以外に、この変更で改善したいと思っている状況が他にありますか?おそらく、それが呼び出されたときのコード、または何か他のコード? –

答えて

1

Tを特定のタイプにしない限り、そうでない場合はありません。メソッドシグネチャは、それがなければ有効ではありません。 somevarが知っているものは無関係です。

0

これはできません。コンパイラはタイプTを知る必要があります。何を削除しているが、実際に冗長なことはなかったので、これは問題となる

def fun(somevar: SomeType[_]) = { 
    // some action 
} 
2

:あなたはおよそSomeType型パラメータを気にしない場合は、このフォームを使用することができます。関数がdef fun[T](...)と定義されている場合、Tは新しい型変数として定義されます。それ以外の場合は、他の場所で定義された型または型変数を参照します。あなたは

def fun(somevar: SomeType[T]) { ... } 

Tは、新しいタイプの変数であることを意味するべきであると考えているようです。それはいつものケースですか?このコードではありません:

trait T { ... } 
def fun(somevar: SomeType[T]) { ... } 

だからどこから行くのですか?前に定義されていない型名が参照されるたびに、新しい型変数を定義しますか?それは本当に奇妙な次のコンパイル時のエラーになります。スカラ座のコンパイル時の型チェック哲学のために(または、より悪い、時にはそれらをコンパイルすることができます?)

def fun(somevar: SomeType[Integr]) { ... } 

class C[Thing] { 
    def g(x: List[Think]) = ... 
} 

、その方法は、狂気に位置しています。

3

あなたの質問の目的は不明です。

関数のユーザー(クライアントコード)は、型パラメーターについて心配する必要はありません。彼らはfun(myvar)に電話することができます。

タイプTは、それをドロップすることができfun()の体にとって重要ではない場合:SomeType[_]

をしかしTは、機能の働きに意味があるならば、コンパイラは型パラメータであることを告げなければならず。ちょうどこれを見て、SomeType[T]、コンパイラは、今すぐTが型パラメータであると推測することはできません。代わりに、fun()以外のTという定義を探し、それが見つからないとエラーをスローします。