質問

2011-01-30 7 views
4

ちょうど我々が質問

scala> def curriedNewSum(x : Int)(y : Int) = x + y 
curriedNewSum: (x: Int)(y: Int)Int 

scala> curriedNewSum(10)(20) 
res5: Int = 30 

scala> var tenPlus = curriedNewSum(10)_ 
tenPlus: (Int) => Int = <function1> 

scala> tenPlus(20) 
res6: Int = 30 

scala> var plusTen = curriedNewSum(_)(20) 
<console>:6: error: missing parameter type for expanded function ((x$1) => curri 
edNewSum(x$1)(20)) 
     var plusTen = curriedNewSum(_)(20) 
           ^

カリー化関数curriedNewSumを定義した場合

をカリー化質問WRTを知りたいと思って、なぜcurriedNewSum(10)_が& curriedNewSum(_)(10)に動作しませんない?

+0

良い質問(最後にあなたの考えを終わらせるべきですが)...これはScalaのローカル型の推論が、非常に明白なようなものを推論するほど強力ではないようです。 –

+0

'_'を頻繁に使用すると、このエラーが発生します。私はまだパターンを検出する必要があります。 – Raphael

答えて

7

私は100%正確に問題があるとは思っていませんが、私はこれがあなたが思っていることをしていないと強く疑っています。

は、あなたはそれがFunction1[Int, Function1[Int, Int]]を返します参照してくださいよ、例えば、

var plusTen = curriedNewSum(_) 

を試してみてください。今すぐ試してみてください:

var plusTen = (curriedNewSum(_))(10) 

関数は型推論を台無しにされて拡大している方法についての

var plusTen = (x) => curriedNewSum(x)(10) 

何かを:他の方法は、に変換しながら

var plusTen = ((x: Int) => curriedNewSum(x))(10) 

:まあ、それはに変換されます。

0

なぜ動作しないのか正確にはわかりません。しかし、これは動作するようです:

curriedNewSum(_:INT)(20)

私はこれ以上考えた後、それは可能性が過負荷にcurriedNewSum方法に

curriedNewSum(x:Double)(y:Int) 
curriedNewSum(x:Float)(y:Int) 

を有するので存在することがあるかもしれませんどちらが選ばれるのですか?タイプを明示的に定義すると、どのメソッドを使用するかが明示されます。

+0

しかし、それは第2パラメータにも当てはまります。 – Amit

0

曖昧さがなく、これがバグであるか意図的に省略されている場合、型を推論する必要があると思われます。