Во-первых curriedAdd
такое же, как и add2 _
не add2
. add2 - всего лишь метод.
scala> curriedAdd
res52: Int => (Int => Int) = <function1>
scala> add2 _
res53: Int => (Int => Int) = <function1>
О втором вопросе. Я думаю, что это причина. Производство
scala> val i = curriedAdd(23)
i: Int => Int = <function1>
scala> i _
res54:() => Int => Int = <function0>
scala> curriedAdd(23) _
<console>:10: error: _ must follow method; cannot follow Int => Int
curriedAdd(23) _
curriedAdd(23) _
не работает. Давайте посмотрим на лестницу руководства (§6.7) -
Выражение е _ хорошо сформированным, если е имеет тип метода или, если е является вызов по имени параметра. Если e - метод с параметрами, e_ представляет e, преобразованный в тип функции путем расширения eta (§6.26.5). Если e является параметром без параметров или параметром call-by-name типа => T, e_ представляет функцию типа() => T, которая вычисляет e, когда применяется к пустым параметрическому списку().
Помните, что оценивает только если это метод или вызов по имени параметра.В curriedAdd(23) _
он не оценивает curriedAdd (23), но проверяет, является ли это методом или вызовом по имени. Это не метод, а параметр call-by-name.
Это не по имени потому по имени является свойство переменной. Над вами вы получите по-имени после оценки curriedAdd(23)
, но curriedAdd(23)
сам по себе не является по-имени переменной. Следовательно, ошибка (в идеале компилятор должен был ее скрыть). Обратите внимание, что ниже работ:
scala> curriedAdd(23)
res80: Int => Int = <function1>
scala> res80 _
res81:() => Int => Int = <function0>
Вышеприведенные работает, потому что res80 _
, здесь вы подаете _
к вызова по имени параметра и, следовательно, делает преобразование.
Это не отвечает на вопрос. 'curriedAdd (4) _' не работает, но' val i = curriedAdd (4); i _' работает. – Jatin
Вопрос был: «Почему результат функции Functions.curried отличается от карновой версии функции add (от add2)?» Думаю, я указал на различия. –