Функция, возвращающая функцию и не плавающая в f # - PullRequest
2 голосов
/ 26 февраля 2012

Извините за действительно плохое название, но я не смог придумать лучшего ...

Я следую Структуре и интерпретации компьютерных программ и пытаюсь сделать пример из раздела 1.1.7 о методе последовательной аппроксимации Netwon для нахождения квадратных корней.

Я пытаюсь реализовать его в F #, и я верю, что я довольно близок к этому, но, вероятно, существует какая-то синтаксическая проблема.

Вот мой код (я использовал linqpad, следовательно, Dump ()), ниже следует вопрос

let square a = a * a

let average a b = (a + b)/2.0

let a = average 2.0 1.0
a.Dump()

let improve guess x = average guess x

let i = improve 2.0 1.0
i.Dump()

let goodEnough guess x = abs (x - square(guess)) < 0.001

let g = goodEnough 3.0 4.0
g.Dump()

let g2 = goodEnough 2.0 4.0
g2.Dump()

let rec sqrtIterator guess x =
  if goodEnough guess x then guess
  else sqrtIterator(improve(guess x) x)

let sqrt x = sqrtIterator 1.0 x

Я получаю сообщение об ошибке при рекурсивном вызове sqrtIterator, говорящее: ожидалось, что это выражение будет иметьтип float, но здесь имеет тип float -> float.

Так что, похоже, мне не хватает параметра, заставляющего его возвращать функцию, принимающую один параметр, но я не вижу, что не так?

Ответы [ 3 ]

5 голосов
/ 26 февраля 2012

Изменение sqrtIterator(improve(guess x) x) на sqrtIterator (improve guess x) x решит проблему.

Из первой части выражения в sqrtIterator:

if goodEnough guess x then guess

средство проверки типов знает, что guess является float, поскольку goodEnough уже имеет тип float -> float.

Ожидается, что ветвь else также будет иметь тип float. Следовательно, sqrtIterator имеет тип float -> float -> float.

Однако вы указали sqrtIterator(improve(guess x) x) в ветке else. Внешние скобки указывают, что improve(guess x) x - это единственный параметр, который предполагается равным float.

Теперь sqrtIterator(improve(guess x) x) возвращает float -> float, следовательно, приведенное выше сообщение об ошибке.

4 голосов
/ 26 февраля 2012

Ваш брекетинг в sqrtIterator немного выключен - вам нужно

  else sqrtIterator (improve guess x) x
4 голосов
/ 26 февраля 2012

Вот исправленная проблема:

let rec sqrtIterator guess x =
  if goodEnough guess x then guess
  else sqrtIterator (improve guess x) x

Ваши парни были не правы.

...