Каждый 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