Рекурсивная функция: это выражение должно иметь тип unit.

Эта функция:

let rec foo () =
    try
    let line = input_line stdin in
    (try
        Mparser.tex_expr lexer_token_safe (Lexing.from_string line);
        print_string ("SUCCESS\n")
        with
        Mtexutil.Illegal_tex_function s -> print_string ("$T" ^ s ^ " " ^ line ^ "\n")
          | LexerException s            -> print_string ("$L" ^ line ^ "\n")
          | Parsing.Parse_error         -> print_string ("$P" ^ line ^ "\n")
          | _                           -> print_string ("$S " ^ line ^ "\n"));
    flush stdout;
    foo ();
    with
    End_of_file -> ()
;;

дает ошибку:

Warning 10: this expression should have type unit.

для строки, начинающейся с Mparser.tex.

Как я могу решить это предупреждение?


person osolmaz    schedule 24.12.2012    source источник


Ответы (1)


Кажется, компилятор предупреждает вас, что Mparser.tex_expr возвращает значение, которое вы не используете. Вы можете избавиться от предупреждения, дав понять, что вы намеренно отбрасываете значение. Вот для чего предназначена функция ignore:

ignore (Mparser.tex_expr lexer_token_safe (Lexing.from_string line));

В некоторых случаях я думаю, что let ... in читается лучше, чем точка с запятой:

let _ = Mparser.tex_expr lexer_token_safe (Lexing.from_string line) in
...
person Jeffrey Scofield    schedule 24.12.2012