gpt4 book ai didi

ocaml - 优雅地忽略 OCaml 中的函数

转载 作者:行者123 更新时间:2023-12-05 00:50:21 27 4
gpt4 key购买 nike

我在 OCaml 4.04 版的 utop 中定义了一个函数 f。

utop # let f = function x -> x + 1;;

val f : int -> int = <fun>

当我尝试忽略 f 时,我遇到了警告。
utop # let a = ignore (f : int -> int); f 2;;

Characters 15-19:
Warning 5: this function application is partial,
maybe some arguments are missing
val a : int = 3

警告 5 被触发,因为 ignore 之后的表达式有函数接口(interface) int -> int .
ignore (f 0)if false then (ignore f 0)工作,但他们并不优雅。我不想为 f 提供缺失的参数。 ignore 有什么替代方法吗? ?
ignore的动机|在这个虚拟示例中不是很清楚,但我确实需要使用它来避免在我的实际项目中出现其他警告。

谢谢你的时间。

最佳答案

非常粗略地说,e1; e2 形式的表达由 OCaml 类型检查器处理如下:

  • 如果 e1有一个函数类型 t -> t' ,发出警告 5。
  • 否则,如果 e1没有类型 unit ,发出警告 10。

  • 例如,
    let f x = 
    prerr_endline "some side effect you may want";
    (* but you may not want the returned function sometimes *)
    fun y -> x + y

    let a = f 1 2; f 1 2;; (* Warning 10 *)
    let a = f 1; f 1 2;; (* Warning 5 *)
    ignore e1; e2的类型检查与 e1; e2 中的一个相同除了一点:它跳过第二次检查:即使 e1 也不会发出警告 10的类型不是 unit .仍然执行警告 5 的第一次检查:
    let a = ignore (f 1 2); f 1 2;;  (* No warning *)
    let a = ignore (f 1); f 1 2;; (* Warning 5 *)

    所以 ignore旨在删除警告 10,而不是 5。这种对 ignore 的特殊处理编码为 is_ignore typing/typecore.ml的功能定义在 OCaml 源代码中。

    如果您想真正忽略警告5,我想到了两种方法:
    let a = let _ = f 1 in f 1 2;;   (* No warning *)

    let ignore' _ = ()
    let a = ignore' (f 1); f 1 2;; (* No warning *)

    第一个是使用与通配符匹配的模式。另一种是定义自己的忽略函数 ignore' .这是一个常用的 OCaml 函数,因此对 ignore 的参数进行特殊类型检查不会执行上面发出警告 5 的操作。

    关于ocaml - 优雅地忽略 OCaml 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45672922/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com