Если вы сделаете отступ для своего кода с помощью какого-либо инструмента автоиндентирования (очень рекомендуется), тогда проблема с вашим кодом станет очевидной, например, так выглядит ваш код после прохождения ocp-indent:
let rec g (a:float) (b:int) : int =
let rec func (x:float*char) (y:int) : float =
let (v,w) = x in
let w' = int_of_char w in
(func (float_of_int y, w) (g v w')) +. 2.1
Итак, как вы можете видеть, выражение let rec func ...
не закончено, оно должно иметь часть in
, но это не так.Вот простой шаблон для написания функций, в которых есть функции,
let <outer-function-name> <outer-args> =
let <inner-function-name> <inner-args> =
<inner-function-body> in
<outer-function-body>
Замените части, разделенные <
и >
, на ваш код, и вы получите все, что работает.
Скорее всего, суть проблемы в том, что вы путаете следующие две синтаксические конструкции:
let <var> = <exp>
и
let <var> = <exp> in <body>
Они обычно путаются,это не удивительно, учитывая, как они похожи.Однако они очень разные.Первый - это определение 1 , а второй - выражение .Первый может встречаться только на верхнем уровне модуля, а последний может происходить в любом месте, где ожидается выражение.Я знаю, что это может сбить с толку, поэтому вам, вероятно, будет полезно прочесть мой другой ответ, где я приведу несколько простых примеров того, как все делается в OCaml.
1) ) То, что ближе всего к тому, что называется выражение в некоторых других языках