如何使匿名函数中的多个参数隐式?

2023-11-27

如果我们有一个接受匿名函数的方法A => B作为参数,我们可以使A隐含在我们的调用中。

def impl(a: Int)(f: Int => Int): Int = f(a)

impl(a) { implicit z =>
    ...
}

但是我们可以使用具有多个参数的匿名函数来做到这一点吗?

def impl(a: Int, b: Int)(f: (Int, Int) => Int): Int = f(a, b)

理想情况下,这会像这样工作:

impl(1, 2) { implicit (a, b) => // wrong
    ...
}

Or

impl(1, 2) { (implicit a, implicit b) => // also wrong
    ...
}

我可以使用解决这个问题A => B => C, 反而:

def impl(a: Int, b: Int)(f: Int => Int => Int): Int = f(a)(b)

impl(1, 2) { implicit a => implicit b =>
    ...
}

但是有没有办法在不柯里化函数的情况下做到这一点呢?

这应该是显而易见的,但是Int这里只是一个虚拟占位符。


不,这是不可能的。来自部分6.23 匿名函数根据规范,匿名函数语法为:

Expr            ::=  (Bindings | ['implicit'] id | '_') '=>' Expr
ResultExpr      ::=  (Bindings | (['implicit'] id | '_') ':' CompoundType) '=>' Block
Bindings        ::=  '(' Binding {',' Binding} ')'
Binding         ::=  (id | '_') [':' Type]

如您所见,implicitcase 是特殊情况,只有 1 个标识符,而重复的 caseBindings(它使用重复语法{...} of EBNF) 排除使用implicit.

唯一添加的细节implicit本节中的内容是:

匿名函数的命名参数前面可以选择隐式修饰符。在这种情况下,参数被标记为隐式的;然而,参数部分本身并不算是定义意义上的隐式参数部分here。因此,匿名函数的参数始终必须显式给出。

我认为本文还应该澄清这仅适用于单个参数(例如“具有 1 个参数的匿名函数的命名参数......”)

当然,最简单的解决方法是避开语法糖并将匿名函数参数重新绑定到新的隐式变量:

impl(a) { (b, c) =>
    implicit val (impB, imbC) = (b, c)
    ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使匿名函数中的多个参数隐式? 的相关文章

随机推荐

  • 获取所有程序的、用户定义的函数

    如何通过以下方式获取所有用户定义函数的列表SQL query 我找到这段代码here SELECT p proname p pronargs t typname FROM pg proc p pg language l pg type t
  • 在 iPad 上使用 Swift UI 禁用分割视图

    有没有办法在 iPad 上的导航视图中使用 SwiftUI 禁用 SplitView 通过设置NavigationViewStyle import SwiftUI struct NavView View var body some View
  • 使用标记模板文字传递更多参数

    我正在与样式组件并使用其标记模板文字语法生成组件 例如 const Button styled button background color papayawhip border radius 3px color palevioletred
  • 遍历 DOM 树

    由于大多数 全部 执行 HTML 清理的 PHP 库 例如 HTML Purifier 严重依赖于正则表达式 因此我认为尝试编写一个使用 DOMDocument 和相关类的 HTML 清理程序将是一个值得尝试的实验 虽然我还处于这个项目的早
  • 使用 GCDAsyncSocket 通过套接字进行 Telnet

    我正在尝试从目标 c 通过 telnet 连接到 Cisco C40 编解码器 在我的计算机上使用终端时 我得到 密码 然而 在进行套接字连接时 需要进行 telnet 协商 我就是这样 但由于某种原因我无法到达上面的 密码 提示 void
  • MySQL会自动优化子查询吗?

    我想运行以下查询 Main Query SELECT COUNT FROM table name WHERE device id IN SELECT DISTINCT device id FROM table name WHERE NAME
  • 覆盖默认的 Android 主题

    我已经能够覆盖任何名称前面带有 android 的主题 但 Android theme xml 还定义了似乎无法覆盖的属性 例如
  • 成员名称不能与分部类的封闭类型相同

    我定义了一个具有如下属性的分部类 public partial class Item public string this string key get if Fields null return null if Fields Contai
  • 在 sagemaker 中进行预测之前如何预处理输入数据?

    我正在使用 java Sagemaker SDK 调用 Sagemaker 端点 我发送的数据在模型可以使用它进行预测之前几乎不需要清理 我怎样才能在 Sagemaker 中做到这一点 我在 Jupyter 笔记本实例中有一个预处理功能 它
  • 相邻兄弟姐妹的边际崩溃

    我正在阅读有关保证金崩溃的文章 我发现了这一点 margin 相邻兄弟姐妹 相邻兄弟姐妹的边距折叠 除非后一个兄弟需要清除过去的浮动 我不明白最后一句话 除非后一个兄弟需要清除过去的浮动 有人可以举个例子吗 谢谢 首先 下面的示例仅适用于基
  • 输出两个单词之间的文本

    我想使用 PHP 输入某个文本 输出应该是两个单词之间的文本 澄清 Input Lorem ipsum dolor sit amet Output dolor sit str Lorem ipsum dolor sit amet word1
  • 调用仅在运行时已知的函数

    我想通过输入验证服务器来首次尝试 Rust 应用程序 该服务器可以验证 AJAX 请求中的值 这意味着我需要一种方法来使用 JSON 配置文件来根据输入值的名称以及可能在运行时在 HTTP 请求中传入的表单名称来指定使用哪些验证函数 我怎样
  • 无法在 Chrome 扩展程序中使用 jQuery 触发点击

    我试图用一行 jQuery 代码创建一个 Chrome 扩展 但它不起作用 我正在尝试触发对某个元素的点击 chrome的控制台根本没有显示任何错误 当我只将 jQuery 代码放入控制台时 它工作正常 My code 内容 js docu
  • Hibernate 5 更改为不使用仅获取第一行

    我正在使用带有 oracle 11 的 Hibernate 5 2 它不支持仅获取第一行 我需要回到旧样式的 hibernate 有没有休眠配置可以做到这一点 您可以强制 Hibernate 使用 Oracle 10g 方言 这样您将使用
  • 为什么更改总和顺序会返回不同的结果?

    为什么更改总和顺序会返回不同的结果 23 53 5 88 17 64 47 05 23 53 17 64 5 88 47 050000000000004 Both Java and JavaScript返回相同的结果 据我了解 由于浮点数以
  • eclipse中Android插件安装问题

    我正在尝试安装 ADT 插件 我转到 Help install new software in eclipse 然后选择开发工具后出现此错误 Cannot complete the install because one or more r
  • Django:通过外键字段的id进行查询的正确方法是什么?

    我有两个models class Organization models Model title models CharField max length 100 class Folder models Model organization
  • 有没有办法同时使用 GET 和 POST?

    我需要使用这两种方法一起传递一些数据 GET 和 POST 我写了这个方法 但不知道是否安全
  • firebase2.default.firestore 不是一个函数 - React Firebase

    我正在尝试使用火库在我的 Reactjs 应用程序中 当我从 firebase 配置对象调用 firestore 时 It says firebase2 default firestore 不是一个函数 这是代码 import fireba
  • 如何使匿名函数中的多个参数隐式?

    如果我们有一个接受匿名函数的方法A gt B作为参数 我们可以使A隐含在我们的调用中 def impl a Int f Int gt Int Int f a impl a implicit z gt 但是我们可以使用具有多个参数的匿名函数来