Налоговый калькулятор Ocaml скрытая ошибка - PullRequest
0 голосов
/ 11 мая 2018
let tax income brackets rates =
  let rec calc (income:float) (brackets: float list list) (rates:float list) (x:int) : float =
    if List.nth (List.nth brackets x) (0) > income then
      0.0
    else if List.nth (List.nth brackets x) (1) > income then
      income -. List.nth (List.nth brackets x) (0) *. (List.nth rates x) +. calc (income) (brackets) (rates) (x+1) in calc income brackets rate 0
    else
      List.nth (List.nth brackets x) (1) -. List.nth (List.nth brackets x) (0)*.(List.nth rates x) +. calc (income) (brackets) (rates) (x+1) in calc income brackets rate 0

;;

Редактировал код, все та же ошибка. Я думаю, что я использую "в" неправильно здесь. Как мне обозначить, что я хочу использовать эту реализацию моей функции aux calc в ее рекурсивных вызовах.

1 Ответ

0 голосов
/ 11 мая 2018

Каждый let должен сопровождаться in, за исключением самого внешнего уровня модуля.

Ваше определение вспомогательной функции let rec calc ... не сопровождается in.

Обновление

На внешнем уровне модуля вы можете иметь это:

let name = expression

Это определяет name как один из компонентов модуля.Это относится к вашей функции с именем tax.

В любом другом месте вы можете иметь только это:

let name = expression1 in expression2

Это определяет name как локальную переменную, которая будет использоваться в expression2.Вы определяете локальную переменную с именем calc, но у вас нет выражения, в котором вы ее используете.

Обновление 2

Вот пример, в котором используется вспомогательнаяфункция для возврата перевернутого списка всех нечетных чисел в данном списке.

let revodd list =
    let rec aux sofar auxlist =
        match auxlist with
        | [] -> sofar
        | h :: t ->
            if h mod 2 = 1 then
                aux (h :: sofar) t
            else
                aux sofar t
    in
    aux [] list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...