ошибка при попытке разобрать целое число - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь запустить интерпретатор, который я сделал в ocaml, а когда i to pu sh в отрицательном значении, т.е. пусть e1 = run [PushI -2; PushI 2; Меньше, чем] []. Я получаю синтаксическую ошибку для моей функции parse_int. Я пытаюсь написать часть функции, которая позволяет вводить отрицательное число

type stackVal = 
    I of int 

type command = PushI of int 

let rec run (commands : command list) (stack: stackVal list) : stackVal list = 
  match (commands , stack)  with
  | (PushI i :: rest, _              ) -> run rest (I i :: stack)

let to_string (s : stackVal) : string = 
  match s with
  | I i -> string_of_int i 

let parse_command (s:string) : command = 
  match take_while is_alpha (String.trim s) with
  | ("PushI"    , p)  -> let Some i = parse_int (String.trim p)    in PushI i

let parse_int (s : string) : int option = 
  match int_of_string s with 
  | String.get n 0  = '-' -> Some -String.sub n 1 len
  | n         -> Some n
  | exception _ -> None

1 Ответ

0 голосов
/ 19 апреля 2020

Существует проблема с сопоставлением с шаблоном вашей функции parse_int.

match int_of_string s with 
| String.get n 0  = '-' -> Some -String.sub n 1 len
| n         -> Some n
| exception _ -> None

Первое предложение здесь недопустимо, поскольку "String.get n 0 = '-'" не является целочисленным конструктором. Вы можете написать 1, который соответствует только целому числу 1 или _, который соответствует любому целому числу или n, который соответствует любому целому числу и связывает его с именем n для остальной части предложения. Вы можете взглянуть на руководство для получения дополнительной информации.

Если вы хотите проверить, является ли первый символ строки - сопоставление с образцом, не является подходящим инструментом для этого , просто используйте if then else.

Однако обратите внимание, что int_of_string прекрасно работает с отрицательными целыми числами, поэтому нет необходимости выполнять эту часть самостоятельно.

Не связано, но я заметил, что вы вызываете parse_int в функции parse_command. В этом случае вы должны определить parse_int до parse_command.

...