2012-11-06 33 views
11

在斯卡拉(2.9.2)我想创建访问斯卡拉按名称参数有多个参数列表和柯里

() => Any 

的时候我还以为是通过成功地这样做,它提供了一些其他值的函数按名称/柯里化的解决方案:

def byName(theValue : => Any)() : Any = theValue 
val myHolder = byName(myValue)_ 

所以我的持有人是正确的类型。但是我发现在创建这个curried函数的过程中,通过名称参数进行评估。如果我做了以下,而不是它的工作原理像预期一样:

def byName(theValue : => Any) : Any =() => theValue 
val myHolder = byName(myValue) 

我总结出钻营过程的某些部分所引用的第一个参数列表,并触发其评价。任何人都可以确认和/或解释为什么或者是否有任何有关使用多参数列表的名称参数的指导原则?

回答

3

这对我来说似乎是一个错误。我可以在scala 2.9.1中触发这个奇怪的行为,但不能在scala 2.10 RC1中触发这个奇怪的行为,所以我想这在某些时候是固定的。

Scala的2.9.1:

Welcome to Scala version 2.9.1.final (Java HotSpot(TM) Client VM, Java 1.6.0_27). 
Type in expressions to have them evaluated. 
Type :help for more information. 
scala> def byName(theValue : => Any)() : Any = theValue 
byName: (theValue: => Any)()Any 
scala> def myValue: String = { println("Computing myValue"); "hello" } 
myValue: String 
scala> val myHolder = byName(myValue)_ 
Computing myValue 
myHolder:() => Any = <function0> 
scala> myHolder() 
res0: Any = hello 

在斯卡拉2.10-RC1:

Welcome to Scala version 2.10.0-RC1 (Java HotSpot(TM) Client VM, Java 1.6.0_27). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> def byName(theValue : => Any)() : Any = theValue 
byName: (theValue: => Any)()Any 
scala> def myValue: String = { println("Computing myValue"); "hello" } 
myValue: String 
scala> val myHolder = byName(myValue)_ 
myHolder:() => Any = <function0> 
scala> myHolder() 
Computing myValue 
res0: Any = hello 
+0

我相信这个错误是:https://issues.scala-lang.org/browse/SI-302 – Steve

+0

好吧,发现了。从评论看来,它是固定在斯卡拉2.10-M4。 –

+0

完美 - 谢谢澄清。 –

2

的问题是 https://issues.scala-lang.org/browse/SI-302https://issues.scala-lang.org/browse/SI-5610

就个人而言,我觉得现在是什么“旧”行为更直观:部分应用意味着应用某些东西。

或者像Odersky的了吧:

不,那是ETA扩张是如何定义的。你不只是围绕表达式包装一个lambda ,你首先评估你可以做什么。

但是相反,强制执行评估比设计挂起它的语法更容易。

+0

是的,但是在名称参数的上下文中,“apply”是什么意思?如果你想通过一个Function0作为参数,那么“应用”意味着该功能必须被热切地评估?自然的答案是否定的,我认为对于名称参数有相同的结论是明智的。总之,我个人倾向于赞同Matt Hellige的反驳论点:https://issues.scala-lang.org/browse/SI-302?focusedCommentId=39676&page=com.atlassian.jira.plugin.system.issuetabpanels: comment-tabpanel#comment-39676 –

+0

关于名称的规定称它为“使用”。对我而言,无论expr的结果如何,f(myValue)看起来像是myValue的用法。如果f作为f(v:V)和f(v:=> V)超负荷,那么通过查看名称myValue被评估并传递给第一个f,就不能说明问题。 (但我并不强烈反对语义的变化;但对我而言,旧规格并不​​像其他益智游戏那样疯狂和违反直觉。) –

+0

嗯 - 双方都有道理。感谢您的意见。 –