Вопрос по функции карри - PullRequest
       1

Вопрос по функции карри

4 голосов
/ 31 января 2011

Просто хотел узнать вопрос w.r.t Curry

Если мы определили функцию карри curriedNewSum

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 (10) _ работает, а curriedNewSum (_) (10) нет?

Ответы [ 3 ]

7 голосов
/ 31 января 2011

Я не уверен на 100%, в чем именно проблема, но я сильно подозреваю, что это не делает то, что вы думаете.

Попробуйте, например,

var plusTen = curriedNewSum(_)

Вы увидите, что он вернет Function1[Int, Function1[Int, Int]]. Теперь попробуйте это:

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

И посмотри, как это работает! Ну, это означает:

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

В то время как другой путь переводится в:

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

Что-то в том, как расширяется функция, искажает вывод типа.

0 голосов
/ 31 января 2011

Я подозреваю, что тип должен быть выведен там, где нет двусмысленности и что это ошибка или намеренно пропущен.

0 голосов
/ 31 января 2011

Я не совсем уверен, почему это не работает.Но, похоже, это работает:

curriedNewSum (_: Int) (20)

После того, как я подумал об этом больше, возможно, существует вероятность перегруженных методов curriedNewSum

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

какой из них будет выбран?Определение типа явно говорит, какой метод вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...