2017-09-08 21 views
3

私は、関数リテラルの戻り値の型を指定できるかどうか疑問に思っていました。例えば、私はScalaは戻り値の型を見つけるために、型推論を行いますことを知っているScala関数リテラルの戻り値の型を指定する方法はありますか?

(x:Int) => x * 2 // scala infers the type Int => Int 
((x:Int) => Double) => x * 2 // does NOT compile 

を持っているが、私は、コンパイラは、以前のエラーをキャッチするように明示的に型を指定したいと思います。もちろん

私は

val a: Int => Int = (x: Int) => x * 2 

によってチェックを強制することができます。しかし、それは直接関数リテラルに指定することは可能でしょうか?

+4

'(x:Int)=> x * 2.0'? '(x:Int)=>(x * 2):Double' – Dima

+5

中括弧内のブロックに型ascriptionを使用することもできます:'(x:Int)=> {... tons of code ...}:Double ' –

+1

完璧、ありがとう、それは私が探していたものです、私はそれを把握することができませんでした。それを答えて、私はそれを受け入れます! – ecerulm

答えて

0

「タイプを指定する」は、type ascriptionと呼ばれます。関数リテラルの型Int => Doubleでなければなりませんのであれば、あなたはこのようにそれを指定することができます(1つのIntパラメータを取り、ダブルを返す):

(x: Int) => { x * 2.0 }:Double 

としては、Scalaは型帰属が本当に必要ないように推論を入力しない言及し、意図したタイプについてタイプチェッカーを "ヒント"したい場合は、それを行うことができます。しかし、ドキュメンテーションタイプで言及されているように、帰納法は一般的には使用されません。

関連する問題