SCALA部分関数はいつ部分関数ではありませんか?
質問
部分関数に文字列のマップを作成している間、私は予期しない動作に遭遇しました。マップ要素として部分関数を作成すると、正常に機能します。 Valに割り当てると、代わりに呼び出します。チェックを呼び出そうとすると、エラーが生成されます。これは期待されていますか?私は愚かなことをしていますか?コメントします check()
呼び出しを見るために。 Scala 2.7.7を使用しています
def PartialFunctionProblem() = {
def dream()() = {
println("~Dream~");
new Exception().printStackTrace()
}
val map = scala.collection.mutable.HashMap[String,()=>Unit]()
map("dream") = dream() // partial function
map("dream")() // invokes as expected
val check = dream() // unexpected invocation
check() // error: check of type Unit does not take parameters
}
解決
便利なため、Scalaはメソッドを呼び出すときに空のパレンを省略できますが、最初のケースで予想されるタイプがあることを確認するのは十分に賢いです ()=>Unit
, 、したがって、それはあなたのためのすべてのパレンズを削除するわけではありません。代わりに、メソッドをあなたのための関数に変換します。
の中に val check
ただし、場合、ファンクションコールの結果が変数に割り当てられるように見えます。実際、これら3つすべてがまったく同じことをします。
val check = dream
val check = dream()
val check = dream()()
メソッドを関数に変えたい場合は、配置します _
メソッドの後 引数リストの代わりに. 。したがって、
val check = dream() _
あなたが望むことをします。
他のヒント
まあ、問題はあなたがそれをすべて間違えたということです。 :-)
ここにいくつかの概念的な間違いがあります:
def dream()() = {
println("~Dream~");
new Exception().printStackTrace()
}
これは部分的な機能ではありません。これは、2つの空のパラメーターリストを備えたカレーメソッドです。 Unit
.
val map = scala.collection.mutable.HashMap[String,()=>Unit]()
このマップの値のタイプは、部分的な関数ではなく、関数です。具体的には、 Function0[Unit]
. 。部分関数にはタイプがあります PartialFunction[T, R]
.
map("dream") = dream() // partial function
ここで起こるのは、そのスカラです 変換 部分的に適用されたメソッドは関数に。これは単純な割り当てではありません。 Scalaは、タイプの推測者が正しいタイプを推測できるため、変換を行います。
val check = dream() // unexpected invocation
ここでは、タイプの推測者を支援する予想タイプはありません。ただし、空のパラメーターリストはemmittedすることができるため、これは単なるメソッド呼び出しです。