我是OCaml的新手,在浏览一些代码时,我看到了以下内容:
let catch f m = M.bind m ~f:(
function Error e -> f e
| Ok x -
)据我所知,这是定义了一个try/catch块(我的理解是OCaml不使用单独的catch块)。M.bind是一元绑定操作符,它将m的结果传递给第二次计算。OCaml参考手册说,~用于标记参数,以便于在文档中理解它们的类型签名。然而,这是否意味着第二次计算( "function ..")也被标记为f??
发布于 2021-04-04 03:28:14
带标签的参数与特定函数相关联。这意味着函数有一个带名称的参数。调用函数时,您可以像这样指定名称和值:
myfun ~name: value如果这个调用是有效的,那么我们知道myfun有一个名为name的参数。
作为比较,当您调用一个没有带标签的参数的函数时,调用看起来像这样:
myotherfun othervalue接受命名参数的函数的定义如下所示:
let myfun ~name =
... expression involving name ...例如,此函数将您传递给它的内容创建为一个单例列表:
let myfun ~name = [name]在OCaml顶层(REPL)中,对此函数的调用如下所示:
# myfun ~name: 44;;
- : int list = [44]关键在于,这允许您在调用函数时按名称而不是按位置指定参数。您需要指定函数所需的名称。但是,如果一个函数有多个命名参数,则可以按任意顺序指定它们。
只在OCaml文档中使用这些名称是不正确的。手册告诉您的是,命名参数可以很好地说明不同参数的用途。对于具有大量参数的函数尤其如此,尤其是当其中一些参数是同一类型时。使用名称可以避免以错误的顺序指定名称的那种错误。
因此,您正在调用一个具有名为f的带标签参数的函数M.bind。传统上,名为f的参数用于将函数作为参数传递,这里确实发生了这种情况。
所以,你的问题似乎是第二个参数是否被标记。M.bind的第二个参数被标记为yes。但是值可以是任何值。值不受传递给它的函数的标签的影响。此外,您可以查看函数定义function Error ...并看到它没有任何带标签的参数。它只是一个接受result类型的值的函数。
重复一遍,这是一个函数定义:
function Error -> f e | Ok x -> g x所以我们知道关于这个函数的所有信息。它绝对没有任何命名参数。
https://stackoverflow.com/questions/66934117
复制相似问题