2016-08-13 6 views
1

Я искал видеоролики о функциональном программировании в Scala, преподаваемом в coursera. Я наткнулся на этот кодТребуется пояснение scala fixedpoint from coursera

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

и его реализацию в качестве

def sqrt(x: Double): Double = fixedPoint(averageDamp(y => y/x))(1) 

, но не могу использовать его в виде

averageDamp(x => x) 

Он говорит, что аргумент отсутствует. Это не аргумент, отсутствующий в приведенном выше случае. Кто-нибудь помогите. Спасибо заранее

+0

Частичное применение нескольких методов списка параметров возможна только (а) в явном виде (например, 'averageDamp (х => х) _') или (б) неявно в функциональном контексте (например,' val f: Double => Double = averageDamp (x => x) '). Я предполагаю, что 'fixedPoint' требует' Double => Double', поэтому у нас есть опция (b) –

ответ

0

Ключевое слово для этого - currying. Когда averageDamp, как указано выше, averageDamp ожидает два параметра. Когда вы пишете его только с первым параметром, он вернет функционал (замыкание), который принимает другой аргумент. Вот почему он говорит argument is missing, когда вы это называете averageDamp(x => x). Вы просто вызываете функцию без параметра, который ее ожидает. Чтобы действительно оценить значение, вы должны называть его averageDamp(some_function)(double_value).

заказ это: http://www.codecommit.com/blog/scala/function-currying-in-scala

+0

'Когда вы вызываете его с первым параметром, он возвращает функцию (закрытие)' эта часть неверна. Вы не можете называть его только с первым параметром (технически первым ** списком параметров ** здесь), если только вы не находитесь в функциональном контексте, а Scala знает, что вы ожидаете функцию, а отсутствующий - полный список параметров. –

+0

Вы правы, это не правильный глагол здесь. – alpert

+0

Я вычислял квадратный корень. Все еще не может использоваться как: averageDamp (y => x/y) (1) – ramzavil