Частичное применение OCaml для квадратичного корня - PullRequest
2 голосов
/ 14 июня 2019

Я читаю "Введение в OCaml" Джейсона Хикки , и я застрял в упражнении.Exercise

Мне кажется, я понимаю пример, но я не понимаю, как написать функцию r a b c, которая могла бы предварительно вычислять вещи для фиксированных значений bи c с определением r, например:

let r b c a = 
(*...*)

Во-вторых, я не вижу, какие вещи можно предварительно вычислить только с b и c ... Здесь самое сложноечасть принимает квадратный корень из b *. b -. 4. *. a *. c, который я не могу вычислить без a.

1 Ответ

2 голосов
/ 14 июня 2019

Этот вопрос двоякий, частично он касается математики, частично - частичного применения (каламбур).

Есть одно значение, для которого формула дискриминанта становится тривиальной, это когда c равно нулю.Таким образом, мы можем обеспечить эффективную реализацию для этого,

let discriminant_for_c = function
  | 0 -> fun b a _ -> a *. b /. 2.
  | n -> general_discriminant

let r b c a = (discriminant_for_c c) b c a

Однако, после второй мысли, я считаю, что это опечатка в упражнении, и это переменная b, которая исправлена,И действительно, с фиксированной b у нас есть еще много интересных решений.И пусть это будет для вас как упражнение:)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...