2

Так что я немного смущен относительно того, как работают карри в Scala. У меня есть следующий код, который компилируется, но я не уверен, как!Вызов карриных функций в Scala?

def fixedPoint(f: Double => Double, initialGuess: Double) = { 
    //dummy impl, does nothing. 
} 

def averageDamp(f: Double => Double)(x: Double) = (x + f(x))/2 

def sqrt(x: Int) = { 
    fixedPoint(averageDamp(y => x/y))(1) 
} 

Этот код компилируется нормально, но я бы подумал averageDamp потребности также принять еще один параметр? Так должно быть:

fixedPoint(averageDamp(y=> x/y)(1))(1) 

Но это не скомпилировано, и я получаю сообщение о несоответствии типа; найдено: Double требуется: Двойная ⇒ Двойной

Ниже не компилируется, что имеет смысл:

val num = averageDamp(y => x/y) 

Это дает сообщение об ошибке компиляции: «отсутствует список аргументов для метода averageDamp в объекте Foo Непримененные методы только преобразованный в , функционирует, когда ожидается тип функции. "

Так что я не уверен, почему он компилируется при вызове averageDamp с одним параметром внутри вызова fixedPoint, но не скомпилируется, когда я вызываю его самостоятельно.

Любая помощь будет отличной.

+0

извините, фиксированный опечатка. – user1974753

+0

Ваш код, который вы утверждаете, компилируется на самом деле не из-за отсутствия параметра ... –

ответ

4

Это код, который компилирует

def fixedPoint(f: Double => Double, initialGuess: Double) = { 
    //dummy impl, does nothing. 
} 

def averageDamp(f: Double => Double)(x: Double) = (x + f(x))/2 

def sqrt(x: Int) = { 
    fixedPoint(averageDamp(y => x/y), 1) 
} 

На этой линии

fixedPoint(averageDamp(y => x/y), 1) 

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

scala>  val num = averageDamp(y => 5/y)(1) 
num: Double = 3.0 

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

Если вы не проходите второй список параметров можно получить функцию,

val fun = averageDamp(y => 5/y) 

дает вам об ошибке пытается сказать вам, что вы должны сообщить компилятору, что вы хотите fun быть функцией. Вы можете сделать это следующими способами:

scala>  val fun: Double => Double = averageDamp(y => 5/y) 
fun: Double => Double = <function1> 
scala>  val fun = averageDamp(y => 5/y) _ 
fun: Double => Double = <function1> 

Теперь посмотрим на fixedPoint

def fixedPoint(f: Double => Double, initialGuess: Double) 

ожидает функция Double => Double поэтому мы можем передать его

fixedPoint(averageDamp(y => 5/y), 1) 

компилятор знает, что первый параметр должен быть функция и с этим знанием преобразует этот метод в функцию, которая еще не приняла этот параметр x: Double и вернет (x + f(x))/2

+0

", хотя' averageDamp' нуждается в еще одном параметре ** list **, который имеет один параметр ... "Вы можете оставить только список всех параметров. –

+0

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

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

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