Функция абсолютного значения Ocaml - PullRequest
0 голосов
/ 20 июня 2020

Я смотрю на этот язык программирования "Ocaml", и у меня есть некоторые проблемы, потому что я прочитал официальную документацию по ocaml, но не понимаю, как использовать:

";" и ";;" и "in" специально внутри определения функций.

Это мой код:

let abs_val value : int -> int =
  let abs_ret = ref 0 ;
  if value >= 0
  then abs_ret := value
  else abs_ret := -value ;
  let return : int = abs_ret
;;
print_int abs_val -12

Скомпилировано с помощью «ocaml c», в нем сказано:

File "first_program.ml", line 7, characters 2-4:
7 |   ;;
      ^^
Error: Syntax error

И это звучит так странно для меня, потому что официальный ocaml do c говорит, что по окончании определения функции я должен использовать ";;".

Я заметил, что после определения abs_val VisualStudio Code, когда я go в новой строке, автоматически поместите курсор на 2 пробела справа, а не в начале строки.

Я новичок в ocaml, поэтому не знаю, распространено это или нет но для меня это звучит так, будто чего-то не хватает, и, вероятно, это так :)

PS: Я знаю, что функция abs уже существует, но я делаю это, чтобы узнать.

Обновление:

let abs_val value =
let abs_ret = ref 0 in
if value >= 0
then  abs_ret := value 
else  abs_ret := -value in
let return : int = abs_ret;
;;
print_int abs_val -12

Я ближе прав?

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

Ваша синтаксическая ошибка является результатом наличия let без соответствия in.

Это очень распространенная ошибка при изучении синтаксиса OCaml. В OCaml есть два разных использования let. На верхнем уровне модуля вы используете let для определения символа (функции или значения), который является одним из элементов модуля. Итак, в следующем:

 module M = struct
     let f x = x * 2
 end

let определяет функцию с именем M.f.

Точно так же ваш код использует let таким образом для определения abs_val.

В других случаях (не на верхнем уровне модуля) let используется только как часть выражения let ... in, которое выглядит следующим образом:

 let v = exp1 in exp2

Это по существу определяет локальный переменная v со значением exp1, которая может использоваться в теле exp2.

Все другие ваши использования let (кроме начального определения abs_val) относятся к этой секунде Добрый. Однако ни у одного из них нет in, поэтому все они синтаксически неверны.

Вам необходимо исправить эти проблемы, прежде чем вы сможете продолжить работу с этой функцией. Вы можете исправить первый, например, изменив первую точку с запятой (;) на in.

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

2 голосов
/ 20 июня 2020

Иногда бывает, что синтаксическая ошибка не здесь, а выше. Вы закрыли предыдущую функцию с помощью ;; ? Кроме того, что это за возврат? Используйте функциональную парадигму языка. Вы используете переменные и ссылки и принудительно проверяете тип. Я не уверен, как вы хотите использовать этот код, но в целом попробуйте позволить OCaml определять тип ваших функций, а не сообщать компилятору, какова подпись. Кроме того, в вашем коде не должно использоваться столько ссылок. Например, следующее:

let abs_val value = 
  if value < 0 then
    -value
  else
    value

Работает отлично и не портит ссылки. Если вы хотите sh использовать ссылки, я предлагаю вам узнать больше о функциональной парадигме OCaml, прежде чем углубляться в его императивные возможности.

...