这个部分应用的函数尝试有什么问题?

时间:2015-02-13 16:51:18

标签: scala

我正在尝试编写部分应用的函数。我认为下面的内容会起作用,但事实并非如此。感谢任何帮助。

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)
                    ^

谢谢!

2 个答案:

答案 0 :(得分:2)

差异很微妙。 sth是一种方法,所以你可以在没有括号的情况下调用它,这就是这里发生的事情:

doSth(sth)

但是b只是一个函数() => Unit,您必须使用括号来调用它。

doSth(b())

否则您将无法将b分配给另一个标识符。

val c: () => Unit = b

如果我们在此处自动调用了bc将是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)