Scala - 柯里化和默认参数

2023-11-21

我有一个带有两个参数列表的函数,我试图部分应用并与柯里化一起使用。第二个参数列表包含所有具有默认值(但不是隐式的)的参数。像这样的东西:

 def test(a: Int)(b: Int = 2, c: Int = 3) { println(a + ", " + b + ", " + c); }

现在,以下一切都很好:

 test(1)(2, 3);
 test(1)(2);
 test(1)(c=3);
 test(1)();

现在如果我定义:

 def partial = test(1) _;

然后可以执行以下操作:

 partial(2, 3);

有人可以解释为什么我不能省略“部分”中的部分/全部参数,如下所示:

 partial(2);
 partial(c=3);
 partial();

写“partial”的行为不应该与“test(1)”本质上相同吗?有人可以帮我想出一种方法来实现这一目标吗?

请帮忙,我很绝望!

EDIT- 由于我无法在 24 小时内回答我自己的问题,我将在这里发布我自己的答案:

这是迄今为止我能做的最好的事情:

class Test2(val a: Int) {
   def apply(b: Int = 2, c: Int = 3) { println(a + ", " + b + ", " + c); }
}

def test2(a: Int) = new Test2(a);
def partial2 = test2(1); // Note no underscore

test2(1)(2, 3);
test2(1)(2);
test2(1)(c=3);
test2(1)();

partial2(2, 3)
partial2(2);
partial2(c=3);
partial2();

这样就可以工作了...


类型推理引擎给出partial接下来发生的事情的类型;即 eta 展开test(1) _。你可以看到例如在 REPL 中partial有类型(Int, Int) => Unit, 然而test有类型(a: Int)(b: Int,c: Int)Unit。 eta 展开的结果是Function对象,它不带有任何参数名称(因为可以定义Function带有匿名参数)。

要解决这个问题,您必须定义partial如下:

def partial(b: Int = 2, c: Int = 3) = test(1)(b,c)

也许您会想要排除默认值,其中两者test and partial可以联系他们以确保他们保持平等。但我不知道有什么技巧可以避免重复参数名称而不引入额外的开销,例如创建新对象等。

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

Scala - 柯里化和默认参数 的相关文章

随机推荐

  • Helm 3:连接到本地 Kubernetes 时出现 x509 错误

    我是一个完美的noob与 K8 一起 我安装了microk8s and Helm using snap在本地进行实验 我想知道我当前的问题是否来自于使用snap 据我了解 其目的是封装 环境 Ubuntu 20 04LTS helm ver
  • 将 ISO 8601 时间格式转换为正常持续时间

    我有一个持续时间字符串 PT1M33S 我想得到以下格式的结果 gt 01 33 谁能告诉我如何使用js或jquery做到这一点 这似乎不是时间格式 只是视频的持续时间 33 Seconds PT1M33S 1 Minute H 小时M 分
  • 如何从字符串中删除换行符?

    我有一个以下格式的字符串 string s This is a Test String n This is a next line t This is a tab n 我想删除所有出现的 n and r从上面的字符串 我努力了string
  • stl::multimap - 如何获取数据组?

    Multimap 本质上具有按键排序的数据组 我想要一种方法来访问这些单独的组并获取它们的聚合值 例如 在一个std multimap lt string int gt 我存储 Group1 1 Group1 2 Group1 3 Grou
  • 类型引用>() { }

    从几天前开始 我开始从事一个网络服务项目 该项目正在使用Jackson编组和解组JSON 对象 所以我的问题是 为什么我总是必须把 当我创建一个实例时TypeReference 我知道构造函数是protected 但为什么是protecte
  • 如果使用 bash 以外的任何东西,我怎样才能拥有 term.el (ansi-term) 跟踪目录

    使用 eshell 或 ansi term 和 bash 时 emacs 会根据您所在的目录更改默认目录变量 所以如果我搬到 home user code project然后使用 ido find file 打开一个文件 它以 CWD 启动
  • 当参数是重载函数时,重载解析如何工作?

    Preamble C 中的重载解析可能是一个过于复杂的过程 理解控制重载解析的所有 C 规则需要付出相当多的脑力劳动 最近我想到参数列表中重载函数名称的存在会增加重载解析的复杂性 由于它恰好是一个广泛使用的案例 所以我发布了一个问题并收到了
  • 如何使用缩进作为 bison 和 flex 的块分隔符

    我很想知道如何在 bison flex 中实现缩进作为块分隔符 就像在 python 中一样 我正在编写自己的编程语言 主要是为了好玩 但我打算将其与游戏引擎一起使用 我将尝试想出一些特殊的东西来最小化样板文件并最大化开发速度 我已经写了一
  • 批量消费消息-RabbitMQ

    我能够使用上面的代码使用多个生产者发送到具有不同路由键的同一交换的多条消息 并且能够将每条消息插入到数据库中 但这会消耗太多资源 因为消息将被一个接一个地插入到数据库中 所以我决定进行批量插入 我发现我可以设置BasicQos 在 Basi
  • 以编程方式渲染 Laravel 7 组件

    我有一个 Laravel 7 组件 如下所示 class Input extends Component public name public title public value public type text Create a new
  • LESS:在 :before 中使用 font-awesome

    我想要一个带有自定义字体 颜色和左侧项目符号的标题的 CSS 选择器 所以我希望我的标题使用我的自定义字体 它是 before伪元素使用 font awesome 所以我想要我的 before拥有 fa类 而整个元素没有这个类 我有这个ht
  • 使用 nginx 和 Gunicorn 运行多个 django 项目

    我在用Ubuntu 18 服务器并使用nginx with gunicorn我跟随数码海洋服务器设置教程 我成功完成了一个项目 但现在我需要在服务器下运行多个项目 这是我的枪鸟设置 command sudo nano etc systemd
  • WCF中的WS是什么意思?

    在wcf中 什么是WS 在WCF中是什么意思 有什么理由将其分组吗 它们是 Web 服务 WS 标准 这篇博文解释一下 WCF 实现的那些 将它们分组是因为它们共同构成了 WS 架构
  • 从 int 到 shared_ptr 的隐式转换

    考虑下面的代码 include
  • 如何拆分分隔字符串以便可以访问单个项目?

    使用 SQL Server 如何拆分字符串以便可以访问项目 x 取一个字符串 Hello John Smith 如何按空格分割字符串并访问索引 1 处应返回 John 的项目 我不相信 SQL Server 有内置的 split 函数 所以
  • 具有交互项的固定效应回归会导致错误

    我正在尝试使用表示路线的地理区域 LoadArea DischargeArea 的交互项来估计面板数据集 使用固定效应规范 它不喜欢交互项 LoadArea DischargeArea 并且在汇总回归时会产生以下错误 mult fe lt
  • 为什么浏览器允许关闭 Javascript? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我很好奇为什么现代浏览器允许关闭 Javascript 现在很清楚 要做任何实质性的现代 Web 应用程序 您都需要集成一些高级别的 Javascript 为什么 javascript 不
  • Windows Phone 创建像 Facebook 一样的侧边菜单栏

    我是 Windows Phone 7 开发新手 我正在尝试创建类似于 Facebook 上使用的侧菜单栏 我创造了usercontrol并添加了不同屏幕的按钮 我还创建了PhoneApplicationPage并添加了一个按钮 当我单击该按
  • MATLAB:设置要并行应用的线条的颜色和样式顺序

    当你设置DefaultAxesColorOrder and DefaultAxesLineStyleOrderMATLAB 将首先循环使用第一种样式的所有颜色 然后再次使用第二种样式循环使用所有颜色 依此类推 看到这个文档 or 相关问题
  • Scala - 柯里化和默认参数

    我有一个带有两个参数列表的函数 我试图部分应用并与柯里化一起使用 第二个参数列表包含所有具有默认值 但不是隐式的 的参数 像这样的东西 def test a Int b Int 2 c Int 3 println a b c 现在 以下一切