首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shiroikuma
V2EX  ›  程序员

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

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

    此外,Scala 、JS 都不是惰性求值的语言。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1139 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:24 · PVG 06:24 · LAX 15:24 · JFK 18:24
    ♥ Do have faith in what you're doing.