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

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

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

    此外,Scala 、JS 都不是惰性求值的语言。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1093 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:20 · PVG 07:20 · LAX 15:20 · JFK 18:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.