如何安全地丢弃OCAML中的未使用变量

时间:2019-01-29 21:44:16

标签: ocaml

这是我的代码的一部分:

(* 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个数字和一个字符。第三个应该是空格(我将在以后进行验证)并将被丢弃。

我当前的代码发出警告,说最后一行应该是unit

是否有一种安全/优雅/正确的方法来丢弃下一个读取的字符?

2 个答案:

答案 0 :(得分:0)

要忽略表达式的返回值,只需使用ignore函数即可。

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

要解析足够复杂的文件,您可能应该考虑使用OCamllex + Menhir,尤其是如果您曾经使用lex / flex和yacc / bison。

答案 1 :(得分:0)

尽管ignore可以满足您的要求,但在这种情况下,使用通配符模式_似乎更适合您,因为您要另外分配“变量”。

考虑

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

vs

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

使用match时可能遇到的通配符模式会匹配任何内容,然后直接丢弃该值而不将其绑定到名称。您可以在let <pattern> in <expression>构造中使用任何模式。