Синтаксическая ошибка при попытке определить внутреннюю функцию - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть эта функция

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

Я знаю, что есть проблема, которая не может остановить рекурсию при определенных условиях (компилятор выдаст сообщение об ошибке переполнения стека).Но я получил синтаксическую ошибку при компиляции, я думаю, что типы являются правильными, и я добавляю rec перед именами функций, все еще не работает.в чем дело?

1 Ответ

1 голос
/ 19 сентября 2019

Если вы сделаете отступ для своего кода с помощью какого-либо инструмента автоиндентирования (очень рекомендуется), тогда проблема с вашим кодом станет очевидной, например, так выглядит ваш код после прохождения 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) ) То, что ближе всего к тому, что называется выражение в некоторых других языках

...