, пожалуйста, найдите фрагмент кода из онлайн-курса Coursera (лекция 2.3) по функциональному программированию в Scala.Оценка функциональных параметров в Scala (функциональное программирование)
package week2
import math.abs
object lecture2_3_next {
def fixedPoint(f: Double => Double)(firstGuess: Double): Double = {
val tolerance = 0.0001
def isCloseEnough(x: Double, y: Double): Boolean = abs((x - y)/x)/x < tolerance
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): Double = (x + f(x))/2
def sqrt(x: Double): Double = fixedPoint(averageDamp(y => x/y))(1)
sqrt(2)
}
Несколько пунктов заблокировали меня, когда я пытаюсь понять этот фрагмент кода.
Хотелось бы вам помочь в понимании этого кода.
2 очка, что раздражает меня являются: - когда вы звоните averageDamp, есть 2 параметра «х» и «у» в функции передается (например averageDamp(y => x/y)
.), Но вы никогда не указать «у» параметра в определение усредненной функции (например, def averageDamp(f: Double => Double)(x: Double): Double = (x + f(x))/2
). Где и как компилятор scala оценивает параметр «y». - второй момент может быть связан с первым, я не знаю, на самом деле. Когда я вызываю функцию averageDamp, я передаю только параметр функции f (например, y => x/y
), но я не передаю второй параметр функции, который является «x» (например, (x: Double)
второй параметр). Как компилятор scala оценивает параметр «x» в этом случае, чтобы отобразить результат вызова averageDamp.
Я думаю, что я что-то пропустил для оценки или замены модели scala и функционального программирования.
Спасибо за помощь и новый год!
Эрве
ок, спасибо, я думаю, что это делает мой разум ясным. Если я переформулирую ваш ответ с помощью Грегора Раймана.Я бы сказал, что моя функция averageDamp передается вызывающей функции fixedPoint и используется линией 'val next = f (guess)'. guess - параметр y, который я искал в 'y => x/y', а x - параметр, переданный функции sqrt. –