【发布时间】:2015-01-01 04:40:20
【问题描述】:
场景:
我想实现一个无限列表:
abstract class MyList[+T]
case object MyNil extends MyList[Nothing]
case class MyNode[T](h:T,t: => MyList[T]) extends MyList[T]
//error: `val' parameters may not be call-by-name
问题:
错误是call-by-name是不允许的。
我听说这是因为call-by-name 不允许使用val 或var 构造函数参数。例如:
class A(val x: =>Int)
//error: `val' parameters may not be call-by-name
但相比之下,普通的构造函数参数仍然是val,尽管private。例如:
class A(x: =>Int)
// pass
所以问题:
- 问题真的与
val或var有关吗?- 如果是这样,因为
call-by-name的目的是推迟计算。为什么不能推迟val或var计算(或初始化)?
- 如果是这样,因为
- 如何绕过
case class限制来实现无限列表?
【问题讨论】:
-
对于一个无限的数据结构,case类sugar提供了什么值?
equals、hashCode、toString不起作用。我不确定我对unapply有什么期望。
标签: scala functional-programming lazy-evaluation callbyname