类似(1,2,3,4...).map(_*2).take(2)这样。常数级别的优化真的可以忽略吗?如果数组很大呢
1
hronro Jul 31, 2020
哪些语言你倒是说出来啊
|
2
hoyixi Jul 31, 2020
只看这一行,感觉是你用的不对,为啥不先 take
|
3
shiroikuma OP @hronro 比如 scala 。haskell 的 fusion 支持好像也很一般。还有 js(不知道算不算函数式
|
4
shiroikuma OP @hoyixi 只是举个很极端的例子,chain 的时候少不了很多分段操作。像 java 只有在碰到终止操作的时候才进行遍历
|
5
yangbonis Jul 31, 2020 via iPhone
你是说 compose 吗? 这应该自己调用。
|
6
mind3x Aug 1, 2020
@shiroikuma Scala 啥时候宣称过是惰性求值了。你要 Lazy 的话自己包个 lazy view:
立即求值 scala> List(1,2,3).map(_*2).take(2) val res18: List[Int] = List(2, 4) Lazy scala> List(1,2,3).view.map(_*2).take(2) val res16: scala.collection.SeqView[Int] = SeqView(<not computed>) Lazy+执行 scala> List(1,2,3).view.map(_*2).take(2).toSeq val res17: Seq[Int] = List(2, 4) |
7
Balthild Aug 1, 2020
语言是否为惰性求值,和组合子是否为惰性求值,两者没有必然联系。比如 Rust 本身是严格求值的,但它的迭代器组合子都是惰性的。
此外,Scala 、JS 都不是惰性求值的语言。 |