12

Scalaでは、カリー化された関数を他の関数に簡単に直接渡すことができるのはなぜですか?しかし、それをval1つに割り当てるときは、部分的に適用する必要があります_か?たとえば、次の2つの関数があります。

def curried(a: Int)(b: Int) = a + b
def test(a: Int, f: Int => Int) = f(a)

私は簡単に渡すことができcurriedますtest

test(5, curried(5))

そして、すべてが幸せです。ただし、単に電話curried(5)をかけると、エラーが発生します。

scala> curried(5)
<console>:9: error: missing arguments for method curried;
follow this method with `_' if you want to treat it as a partially applied function
              curried(5)

ただし、タイプ情報を含めるように呼び出しを変更すると、機能します。

val 'curried: Int => Int = curried(5)

Int => Int矛盾の背後にある理由を誰かが説明できますか?確かに、Scalaコンパイラーは、関数に元のメソッドの型定義が与えられていると推測できますか?

4

2 に答える 2

8

問題は型を推測することではなく、意図を推測することです。間違えましたか、それとも意図的に関数をカリー化しましたか?

残念ながら、末尾のアンダースコア構文は正式な構文であり、それを省略すると構文糖衣になります。

于 2013-03-08T22:44:13.157 に答える
1

アンダースコアは必ずしも必要ではありません。http://docs.scala-lang.org/cheatsheets/から

val zscore = (mean:R, sd:R) => (x:R) => (x-mean)/sd 

カリー化、明白な構文。

def zscore(mean:R, sd:R) = (x:R) => (x-mean)/sd 

カリー化、明白な構文

def zscore(mean:R, sd:R)(x:R) = (x-mean)/sd 

カリー化、シュガー構文。しかしその後:

val normer = zscore(7, 0.4) _   

シュガーバージョンの場合のみ、部分を取得するには末尾のアンダースコアが必要です。

于 2015-10-29T22:24:23.210 に答える