加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala – Currying和默认参数

发布时间:2020-12-16 19:02:36 所属栏目:安全 来源:网络整理
导读:我有一个功能与两个参数列表,我试图部分应用和使用currying.第二个参数列表包含所有默认值(但不是隐式)的参数.这样的事情 def test(a: Int)(b: Int = 2,c: Int = 3) { println(a + "," + b + "," + c); } 现在,以下是好的: test(1)(2,3); test(1)(2); test(
我有一个功能与两个参数列表,我试图部分应用和使用currying.第二个参数列表包含所有默认值(但不是隐式)的参数.这样的事情

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”中的一些/所有参数,如下所示:

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

不应该写“partial”的行为基本上和“test(1)”一样吗?有人可以帮我找出一个实现这个的方法吗?

请帮忙,我绝望!

编辑 – 由于我无法在24小时内回答我自己的问题,我会在这里发表自己的答案:

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

class Test2(val a: Int) {
   def apply(b: Int = 2," + 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();

这样它的工作原理

解决方法

类型推理机给出了下一步的类型;即eta扩展试验(1)_.你可以看到例如在REPL中,部分具有类型(Int,Int)=>单位,而测试类型(a:Int)(b:Int,c:Int)单位. eta扩展的结果是一个Function对象,它不带有任何参数名称(因为可以使用匿名参数定义Function).

要解决这个问题,你必须定义如下部分:

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

也许你想要考虑测试和部分可以访问它们的默认值,以确保它们保持平等.但是我知道没有任何技巧避免重复参数的名称,而不会引入额外的开销,如创建新的对象等.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读