2013-11-10 4 views
1

Давайте определим f, функция, которая поддерживает Карринг:Почему умозаключение двигателю нужен явный вид с выделкой

def f(a: Int)(b: Int) = a + b 

Этот код не компилируется

def g= f(1) 
<console>:10: error: missing arguments for method f; 
follow this method with `_' if you want to treat it as a partially applied function 
    def g= f(1) 

Я нашел эти 2 обходных пути:

scala> def h = f(1) _ 
h: Int => Int 

scala> def i : Int => Int = f(1) 
i: Int => Int 

Но я не понимаю, почему движок вывода нуждается в помощи в тривиальном порядке так?

ответ

5

Это потому, что def f(a: Int)(b: Int) не функция, а метод с несколькими списками параметров. Scala не объединяет их обоих в одну концепцию, поэтому вы должны различать их.

Чтобы частично применить метод с несколькими списками параметров (и, следовательно, неявно преобразовать этот метод в функцию), вы должны добавить подчеркивание после метода, как это предлагает сообщение об ошибке. Когда вы четко укажете компилятору, какую подпись вы хотите иметь, он также может неявно преобразовать метод в функцию (как показано в вашем втором обходном пути).

Если вы хотите использовать каррирование в Scala, лучше создать функцию с самого начала:

scala> val f = (a: Int) => (b: Int) => a+b 
f: Int => (Int => Int) = <function1> 

scala> val g = f(1) 
g: Int => Int = <function1> 

 Смежные вопросы

  • Нет связанных вопросов^_^