我正在尝试编写部分应用的函数。我认为下面的内容会起作用,但事实并非如此。感谢任何帮助。
scala> def doSth(f: => Unit) { f }
doSth: (f: => Unit)Unit
scala> def sth() = { println ("Hi there") }
sth: ()Unit
scala> doSth(sth)
Hi there
scala> val b = sth _
b: () => Unit = <function0>
scala> doSth(b)
<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
doSth(b)
^
谢谢!
答案 0 :(得分:2)
差异很微妙。 sth
是一种方法,所以你可以在没有括号的情况下调用它,这就是这里发生的事情:
doSth(sth)
但是b
只是一个函数() => Unit
,您必须使用括号来调用它。
doSth(b())
否则您将无法将b
分配给另一个标识符。
val c: () => Unit = b
如果我们在此处自动调用了b
,c
将是Unit
而不是() => Unit
。必须消除歧义。
我还要澄清doSth
不是只接受函数的方法。 f: => Unit
表示它接受评估为Unit
的任何内容,包含在调用时返回Unit
的方法。 {{1是不将消息doSth(sth)
传递给sth
,它正在调用doSth
而没有括号并传递结果。
答案 1 :(得分:0)
我认为不同之处在于b
的类型为() => Unit
,而doSth
需要一个返回Unit
的表达式(次要差异)。如果您想将sth
存储为没有副作用的变量,您可以执行以下操作:
lazy val b = sth
doSth(b)
另一种选择是让doSth
接收() => Unit
:
def doSth(f: () => Unit) { f() }
def sth() = { println ("Hi there") }
doSth(sth)
val b = sth _
doSth(b)