【发布时间】:2014-07-17 19:54:36
【问题描述】:
在以下语句中,val f 被定义为引用自身的 lambda(它是递归的):
val f: Int => Int = (a: Int) =>
if (a > 10) 3 else f(a + 1) + 1 // just some simple function
我已经在 REPL 中尝试过了,它可以正确编译和执行。
根据规范,这似乎是非法前向引用的一个实例:
在一个语句序列
s[1]...s[n]组成一个块,如果一个简单的s[i]中的名称指的是由s[j]定义的实体,其中j >= i, 那么对于介于s[i]和s[j]之间的所有s[k],
s[k]不能是变量定义。- 如果
s[k]是一个值定义,它必须是lazy。
该赋值是单个语句,因此它满足 j >= i 条件,并且它包含在两条规则适用的语句间隔中(在 s[i] 和 s[j] 之间并包括在内)。
但是,它似乎违反了第二条规则,因为f并不懒惰。
这是一个法律声明(在 Scala 2.9.2 中尝试过)?
【问题讨论】:
标签: scala recursion lambda definition specifications