很奇怪为什么很多宣称惰性求值的语言反而没有在链式处理数据的时候只遍历一次

2020-07-31 20:37:05 +08:00
 shiroikuma
类似(1,2,3,4...).map(_*2).take(2)这样。常数级别的优化真的可以忽略吗?如果数组很大呢
1833 次点击
所在节点    程序员
7 条回复
hronro
2020-07-31 21:06:48 +08:00
哪些语言你倒是说出来啊
hoyixi
2020-07-31 21:18:54 +08:00
只看这一行,感觉是你用的不对,为啥不先 take
shiroikuma
2020-07-31 21:24:16 +08:00
@hronro 比如 scala 。haskell 的 fusion 支持好像也很一般。还有 js(不知道算不算函数式
shiroikuma
2020-07-31 21:26:47 +08:00
@hoyixi 只是举个很极端的例子,chain 的时候少不了很多分段操作。像 java 只有在碰到终止操作的时候才进行遍历
yangbonis
2020-07-31 21:39:19 +08:00
你是说 compose 吗? 这应该自己调用。
mind3x
2020-08-01 05:39:25 +08:00
@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)
Balthild
2020-08-01 20:55:31 +08:00
语言是否为惰性求值,和组合子是否为惰性求值,两者没有必然联系。比如 Rust 本身是严格求值的,但它的迭代器组合子都是惰性的。

此外,Scala 、JS 都不是惰性求值的语言。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/694729

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX