我最近开始学习 Scala 并遇到了柯里化。从这个答案post https://stackoverflow.com/questions/17768686/currying-example-in-scala,这段代码片段
def sum(a: Int)(b: Int) = a + b
扩展到这个
def sum(a: Int): Int => Int = b => a + b
然后我看到了一个片段scala-lang http://docs.scala-lang.org/tutorials/tour/automatic-closures.html,这表明可以编写类似的内容来模拟 while 循环
def whileLoop (cond : => Boolean) (body : => Unit) : Unit = {
if (cond) {
body
whileLoop (cond) (body)
}
}
出于好奇,我尝试扩展它,并得到了这个
def whileLoop2 (cond : => Boolean) : (Unit => Unit) =
(body : => Unit) =>
if (cond) {
body
whileLoop2 (cond) (body)
}
但似乎缺少一些语法,因为我收到错误
error: identifier expected but '=>' found.
(body : => Unit) =>
^
扩展模拟 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 }
看来你可以用注释返回类型(=> Unit) => Unit
,但你不能注释(body: => Unit)
,所以你必须依赖这里的类型推断。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)