首页 > 解决方案 > 为什么我会收到带有类型注释但不是没有的“未使用匹配案例”警告?

问题描述

我发现了有关此警告的另一个问题,但在我的情况下,答案没有意义。

我有这段代码:

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,我的代码将在没有警告的情况下编译。是什么赋予了?

标签: ocaml

解决方案


这只是 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_lwtppx:recognize constrained catch-all case #640


推荐阅读