Я новичок в scala и проходил курс coursera для функционального развития scala. Ниже приведен фрагмент кода объясняет о выделкеПример scara currying
import math.abs
object exercise{
val tolerance = 0.0001
def isCloseEnough(x: Double, y: Double) = abs((x -y)/x)/x < tolerance
def fixedPoint(f: Double => Double)(firstGuess: Double) = {
def iterate(guess: Double):Double = {
val next = f(guess)
if (isCloseEnough(guess, next)) next
else iterate(next)
}
iterate(firstGuess)
}
def averageDamp(f: Double => Double)(x: Double) = (x + f(x))/2
def sqrt(x: Double) = fixedPoint(averageDamp(y => x/y))(1)
}
Я не могу понять следующую часть кода
fixedPoint(averageDamp(y => x/y))(1)
Я знаю, что функция averageDamp принимает 2 аргумента (одна функция и other - значение для x), но когда он вызывается из fixedPoint, мы не передаем значение x. Поэтому я предположил, что он создает частичную функцию, которая отправляется обратно в sqrt, где значение x передается из sqrt (x: Double) agrument. Так что я сделал следующую функцию, которая не может скомпилировать
def noIdea(x: Double) = averageDamp(y => x/y)
Может кто-нибудь объяснить мне это?
Спасибо за ответ. Он работает с подчеркиванием, но если вы заметили, что я не поставил знак подчеркивания для > def sqrt (x: Double) = fixedPoint (averageDamp (y => x/y)) (1) Все еще работает, какая магия это??? –
Потому что в этом случае ожидается функция, то же самое было бы, если бы вы дали 'noIdea' тип' Double => Double'. Когда Scala знает, что значение должно быть функцией ('A => B'), оно автоматически запускает то, что известно как расширение eta, подробнее [здесь] (http://blog.jaceklaskowski.pl/2013/11 /23/how-much-one-ought-to-know-eta-expansion.html). Предоставление подчеркивания вызывает это автоматически. –
@RockwellSydney см. Мой обновленный ответ –