理解斯卡拉:讨好

时间:2014-09-29 21:09:50

标签: scala currying

我最近开始学习Scala并且遇到了currying。从此post中的答案,此代码段

def sum(a: Int)(b: Int) = a + b

扩展到此

def sum(a: Int): Int => Int = b => a + b

然后我看到scala-lang的一个片段,显示可以写这样的东西来模拟一个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循环的正确方法是什么?

1 个答案:

答案 0 :(得分:6)

棘手的部分是处理无参数函数或" 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),因此您必须依赖此处的类型推断。