Ocaml 如何阅读这段使用~&引用;及&引用;?

Ocaml 如何阅读这段使用~&引用;及&引用;?,ocaml,Ocaml,我是OCaml新手,在浏览一些代码时,我看到了以下内容: let catch f m = M.bind m ~f:( function Error e -> f e | Ok x - ) 据我所知,这是定义一个try/catch块(我的理解是OCaml不使用单独的catch块)M.bind是将M的结果传递给第二次计算的一元绑定运算符。OCaml参考手册说~用于标记参数,以便于理解文档中的类型签名。然而,这是否意味着第二次计算(“函数..”

我是OCaml新手,在浏览一些代码时,我看到了以下内容:

  let catch f m = M.bind m ~f:(
      function Error e -> f e
             | Ok x -
    )

据我所知,这是定义一个try/catch块(我的理解是OCaml不使用单独的catch块)
M.bind
是将M的结果传递给第二次计算的一元绑定运算符。OCaml参考手册说~用于标记参数,以便于理解文档中的类型签名。然而,这是否意味着第二次计算(“
函数..
”)也标记为f???

标记的参数与特定函数相关联。这意味着函数有一个带名称的参数。调用该函数时,请按如下方式指定名称和值:

 myfun ~name: value
myotherfun othervalue
let myfun ~name =
    ... expression involving name ...
如果这个调用有效,那么我们知道
myfun
有一个名为
name
的参数

为了进行比较,当您在没有带标签参数的情况下调用函数时,调用如下所示:

 myfun ~name: value
myotherfun othervalue
let myfun ~name =
    ... expression involving name ...
采用命名参数的函数的定义如下所示:

 myfun ~name: value
myotherfun othervalue
let myfun ~name =
    ... expression involving name ...
例如,此函数从您传递的任何内容中生成一个单例列表:

let myfun ~name = [name]
对该函数的调用在OCaml顶级(REPL)中如下所示:

关键是,这允许您在调用函数时按名称而不是按位置指定参数。您需要指定函数所需的名称。但如果一个函数有多个命名参数,则可以按任意顺序指定它们

这些名称仅在OCaml文档中使用,这不是真的。手册告诉您的是,命名参数可以作为不同参数用途的良好文档。对于包含大量参数的函数尤其如此,尤其是当其中一些参数是相同类型时。使用名称可以避免以错误顺序指定名称的错误

因此,您正在调用一个函数
M.bind
,该函数有一个名为
f
的标记参数。按照惯例,名为
f
的参数用于将函数作为参数传递,这确实是这里发生的事情

所以,;你的问题似乎是第二个论点是否有标签。
M.bind
的第二个参数标记为yes。但价值可以是任何东西。值不受传递给它的函数的标签影响。此外,您可以查看函数定义
函数错误…
,并看到它没有任何带标签的参数。它只是一个接受
result
type值的函数

重复,这是一个函数定义:

function Error -> f e | Ok x -> g x

所以我们知道关于这个函数的一切。它肯定没有任何命名参数。

代码不完整。它甚至在语法上都是无效的。但即使是这样,不知道
M
M
是什么也很难解释。假设
M.bind
和你一样是一元绑定是合理的,而且
M.bind
通过
f
a
结果
,但很难说得更多。我也不知道第二次计算被“标记”意味着什么。但是它里面的
f
引用了
catch
的参数,而不是
M.bind
@glennsl定义的任何东西:代码是一个更大的文件的一部分,它可以编译。我只是没有提供额外的上下文。您应该始终提供。因此,如果我理解正确,bind的第二个参数(必须是给定bind类型的函数)在本例中被标记为f?我的语言也太草率了-我应该说“形式参数”而不是“参数”-所以我想你说的不仅仅是可以命名的形式参数,还有参数。因此,这让事情变得更清楚了,尽管重用“f”似乎仍然可能引起混淆。函数要么有命名参数,要么没有。如果它有命名参数,那么当您调用函数时,您将提供名称。调用函数时提供的名称必须与函数定义要接受的名称相同。就我所知,没有真正可能的混淆。在我看来,你似乎没有理解这个想法的本质:如果函数是用命名参数定义的,调用方在进行调用时需要提供这些确切的名称。但是参数可以以任何顺序出现。(事实上有一些复杂性,我们可以在后面讨论。)好的,你最后的评论最终澄清了我的困惑,谢谢,但我认为造成一些困惑的原因是,当你在第一次评论中说“参数”时,我认为实际上你指的是“参数”。也就是说“一个函数要么有命名参数,要么没有…”那么当你调用该函数时,你提供的参数也必须有与其对应的参数相同的标签(如果有的话)。我希望我现在就有。