首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何阅读这段使用"~“和":”的OCaml代码?

如何阅读这段使用"~“和":”的OCaml代码?
EN

Stack Overflow用户
提问于 2021-04-04 01:40:49
回答 1查看 54关注 0票数 0

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

代码语言:javascript
运行
复制
  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??

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-04 03:28:14

带标签的参数与特定函数相关联。这意味着函数有一个带名称的参数。调用函数时,您可以像这样指定名称和值:

代码语言:javascript
运行
复制
 myfun ~name: value

如果这个调用是有效的,那么我们知道myfun有一个名为name的参数。

作为比较,当您调用一个没有带标签的参数的函数时,调用看起来像这样:

代码语言:javascript
运行
复制
myotherfun othervalue

接受命名参数的函数的定义如下所示:

代码语言:javascript
运行
复制
let myfun ~name =
    ... expression involving name ...

例如,此函数将您传递给它的内容创建为一个单例列表:

代码语言:javascript
运行
复制
let myfun ~name = [name]

在OCaml顶层(REPL)中,对此函数的调用如下所示:

代码语言:javascript
运行
复制
# myfun ~name: 44;;
- : int list = [44]

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

只在OCaml文档中使用这些名称是不正确的。手册告诉您的是,命名参数可以很好地说明不同参数的用途。对于具有大量参数的函数尤其如此,尤其是当其中一些参数是同一类型时。使用名称可以避免以错误的顺序指定名称的那种错误。

因此,您正在调用一个具有名为f的带标签参数的函数M.bind。传统上,名为f的参数用于将函数作为参数传递,这里确实发生了这种情况。

所以,你的问题似乎是第二个参数是否被标记。M.bind的第二个参数被标记为yes。但是值可以是任何值。值不受传递给它的函数的标签的影响。此外,您可以查看函数定义function Error ...并看到它没有任何带标签的参数。它只是一个接受result类型的值的函数。

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

代码语言:javascript
运行
复制
function Error -> f e | Ok x -> g x

所以我们知道关于这个函数的所有信息。它绝对没有任何命名参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66934117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档