scala - 为什么在 Scala 中定义 Streams 时必须显式强制使用 thunk?

标签 scala lazy-evaluation thunk

我正在阅读一本有关 Streams 的 Scala 教科书

sealed trait Stream[+A]
case object Empty extends Stream[Nothing]
case class Cons[+A](h: () => A, t: () => Stream[A]) extends Stream[A]

课本上写着

"Due to technical limitations, these are thunks that must be explicitly forced, rather than by-name parameters. "

我认为教科书的意思是 h: ()=>A, t: ()=>Stream[A] 不应替换为 h: =>A, t: =>流[A]。但禁止这样做的所谓“技术限制”是什么?

最佳答案

But what are the so-called "technical limitations" that prohibit this?

技术限制是,目前(从 Scala 2.12.x 开始),Scala 不支持 lazy val 参数或 case 类上的名称参数。 p> 为什么?由于案例类获得由编译器派生的自动方法实现,例如 equalshashCode,它们是根据案例类计算出来的< em>值。如何计算 hashCode 值(例如无限流)?

关于为什么案例类不能按名称参数的更完整答案可以在 Scala case class prohibits call-by-name parameters? 找到。

关于scala - 为什么在 Scala 中定义 Streams 时必须显式强制使用 thunk?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48803972/

相关文章:

scala - 类型别名的伴随对象

scala - Scala 代码块的条件编译

c# - 避免闭包中的转义值

scala - Scala 2.10中如何实现惰性val类变量?

Python 生成器,添加两个数字数组 : am I executing this properly?

haskell - Haskell 中的所有内容都存储在 thunk 中吗,甚至是简单的值?

javascript - Redux mapDispatchToProps 作为对象参数不起作用,也没有在开发工具中显示任何预期状态

multithreading - GHC 的 thunk 有多原子?

scala - 泛型函数类型中的通用量化

Scala 集合 CanBuildFrom