我最近开始学习Scala并且遇到了currying.从这篇文章中的答案,这段代码片段
def sum(a: Int)(b: Int) = a + b
Run Code Online (Sandbox Code Playgroud)
扩展到这个
def sum(a: Int): Int => Int = b => a + b
Run Code Online (Sandbox Code Playgroud)
然后我看到scala-lang的一个片段,它显示可以写这样的东西来模拟一个while循环
def whileLoop (cond : => Boolean) (body : => Unit) : Unit = {
if (cond) {
body
whileLoop (cond) (body)
}
}
Run Code Online (Sandbox Code Playgroud)
出于好奇,我试图扩展它,并得到了这个
def whileLoop2 (cond : => Boolean) : (Unit => Unit) =
(body : => Unit) =>
if (cond) {
body
whileLoop2 (cond) (body)
}
Run Code Online (Sandbox Code Playgroud)
但是我似乎缺少一些语法,因为我收到错误
error: identifier expected but '=>' found.
(body : => Unit) =>
^
Run Code Online (Sandbox Code Playgroud)
扩展模拟while循环的正确方法是什么?
棘手的部分是处理无参数函数或"thunk"类型=> Unit.这是我的版本:
def whileLoop2 (cond: => Boolean): (=> Unit) => Unit =
body =>
if (cond) {
body
whileLoop2 (cond)(body)
}
var i = 5
val c = whileLoop2(i > 0)
c { println(s"loop $i"); i -= 1 }
Run Code Online (Sandbox Code Playgroud)
看来您可以使用注释返回类型(=> Unit) => Unit,但不能注释(body: => Unit),因此您必须在此处依赖类型推断.