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

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

  •  
  •   shiroikuma · 5 天前 via Android · 762 次点击
    类似(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   ·   大发龙虎大发龙虎我 们 的愿景   ·   广告投放   ·   感谢   ·   实用小大发龙虎工具   ·   4078 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 07:27 · PVG 15:27 · LAX 00:27 · JFK 03:27
    ♥ Do have faith in what you're doing.