Подтвердить что ты не робот

Почему Scala требует частичного применения точных функций при назначении значения val?

В Scala, почему он может быть легко передан непосредственно в другие функции, но при назначении ему val нужно также частично применить его с помощью _? Например, учитывая две функции:

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)

Может ли кто-нибудь объяснить рациональность непоследовательности, конечно, компилятор Scala может сделать вывод о том, что функция Int => Int задана определением типа в исходном методе?

4b9b3361

Ответ 1

Проблема заключается не в том, чтобы вывести этот тип, проблема заключается в том, чтобы выследить свое намерение. Вы допустили ошибку или намеренно выполняли функцию?

Увы, конечный синтаксис подчеркивания - это формальный синтаксис, и его отсутствие - синтаксический сахар.

Ответ 2

Подчеркивание не всегда необходимо. Из http://docs.scala-lang.org/cheatsheets/

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

currying, очевидный синтаксис.

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

currying, очевидный синтаксис

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

каррирование, синтаксис сахара. но затем:

val normer = zscore(7, 0.4) _   

нужно затянуть подчеркивание, чтобы получить частичное, только для версии с сахаром.