为什么我会收到带有类型注释的“未使用区分大小写”警告,但并非没有?

时间:2018-11-26 22:10:11

标签: ocaml

我发现another question与此警告有关,但在我的情况下答案无济于事。

我有这段代码:

let someFun (arg: string) : unit Lwt.t =
  try%lwt
    do_something arg in
    Lwt.return ()
  with (error: exn) ->
    Format.printf "Error with '%s': %s" arg (Printexc.to_string error);
    Lwt.return ()

我收到此错误:

  

警告11:此比赛用例尚未使用。

如果我删除exn上的error类型注释,我的代码将编译而不会发出警告。有什么作用?

1 个答案:

答案 0 :(得分:3)

这仅仅是lwt的ppx的一个缺陷,无法将(error:exn)检测为万能的情况。要了解注释的问题,您需要知道try...with的情况已翻译为:

function
| (error : exn) ->
     Format.printf "Error with '%s': %s" arg (Printexc.to_string error);
     Lwt.return ()
| exn -> Lwt.fail exn 

在这里,第二种情况是多余的,由ppx本身添加。没有类型注释,lwt_ppx足够聪明,可以检测到这种情况不是必需的,因此只能生成:

       function
        | error ->
          Format.printf "Error with '%s': %s" arg (Printexc.to_string error);
          Lwt.return ()

编辑:此问题应在下一版ppx_lwt中修复:ppx: recognize constrained catch-all cases #640