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) 也许你想要考虑测试和部分可以访问它们的默认值,以确保它们保持平等.但是我知道没有任何技巧避免重复参数的名称,而不会引入额外的开销,如创建新的对象等. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |