[#126] | project: compiler | priority: low | category: bug | |
---|---|---|---|---|
submitter | assigned to | status | date submitted | |
Erik | Martin | fixed | 2003-09-10 17:10:06.0 | |
subject | Wrapping a value in an object makes a definition recursive | |||
code |
class O { val Bar:Any => Any = ((x:Any) => Bar(x)); val Tuple1(foo:(Any => Any)) = Tuple1((x:Any) => foo(x)); } |
|||
what happened | ~/scala/bin/scalac O.scala O.scala:3: recursive value foo$ needs type val Tuple1(foo:(Any => Any)) = Tuple1((x:Any) => foo(x)); ^ one error found |
|||
what expected | Why is it OK to define Bar as a recursive funtion, but not foo, just because foo is passed inside a tuple? | |||
[back to overview] |
Martin edited on 2003-09-10 17:38:28.0 |
Because the second definition is a pattern definition, which is taken to be equivalent to the following code:
val foo = Tuple1(((x: Any) => foo(x))).match({ case Tuple1((foo) : (Any)=>Any) => foo })Note that even if we added a type to foo, the definition would still be recurive, and therefore illegal. The error message is, admittedly, not very helpful here. |
Burak edited on 2003-09-23 18:26:29.0 |
change priority |
Lex edited on 2006-03-28 13:43:46.0 |
At the least the error message here is confusing. But, what should this code do?
If you do If, in A third possibility is that exp cannot refer to x and furthermore any attempt to do so should signal an error. In that case, the error message should be cleaned up.... |
Martin edited on 2006-05-28 15:05:40.0 |