как безопасно отбросить неподдерживаемую переменную в OCAML - PullRequest
0 голосов
/ 30 января 2019

Вот часть моего кода:

(* Read the input file *)
let a = input_char inc in
(* Check if a is a number *)
if char_is_number a then
    (* Read the second letter *)
    let b = input_char inc in
    (* Discard the space *)
    input_char inc;

Где inc это input_channel.Он читает из файла .map (кстати, если у вас есть хорошие библиотеки, о которых я не знаю, которые могут обрабатывать файл .map, я бы с радостью принял его) input_char прочитает следующий символ.

В основномЯ читаю 1 номер и персонаж.3-й должен быть пробелом (я буду делать эту проверку позже) и будет отброшен.

Мой текущий код вызывает предупреждение, говоря, что последняя строка должна быть unit

Есть либезопасный / элегантный / правильный способ отбросить чтение следующего символа?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Хотя ignore будет делать то, что вы хотите, похоже, что использование шаблона подстановки, _, может подойти вам лучше в этом случае, так как в противном случае вы присваиваете «переменные».

Рассмотрим

let b = input_char inc in
let _ = input_char inc in
let c = input_char inc in
...

против

let b = input_char inc in
ignore (input_char inc);
let c = input_char inc in
...

Шаблон подстановки, с которым вы могли столкнуться при использовании match, сопоставляет что-либо, а затем просто отбрасывает значение, не привязывая его к имени,Вы можете использовать любой шаблон с конструкцией let <pattern> in <expression>.

0 голосов
/ 30 января 2019

Чтобы игнорировать возвращаемое значение выражения, вам просто нужно использовать функцию ignore, которая служит именно для этой цели.

let b = input_char inc in
    ignore(input_char inc);

Для анализа достаточно сложных файлов, вы, вероятно,следует рассмотреть OCamllex + Менгир , особенно если вы когда-либо использовали lex / flex & yacc / bison.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...