gpt4 book ai didi

haskell - 当参数是列表时,惰性求值如何工作?

转载 作者:行者123 更新时间:2023-12-02 11:21:17 28 4
gpt4 key购买 nike

根据我的理解,惰性求值是指参数在传递给函数之前不求值,而是仅在实际使用它们的值时才求值。

但是在 Haskell 教程中,我看到了一个示例。

xs = [1,2,3,4,5,6,7,8] 

doubleMe(doubleMe(doubleMe(xs)))

作者说命令式语言可能会遍历列表一次并制作一个副本,然后返回它。然后它会再遍历该列表两次并返回结果。

但是在惰性语言中,它会首先计算

doubleMe(doubleMe(doubleMe(1)))

这将返回一个 doubleMe(1),即 2。然后是 4,最后是 8

因此,只有当您真正需要它时,它才会遍历列表。

这让我很困惑。为什么惰性语言不把列表作为一个整体,而是将其拆分?我的意思是我们可以在使用列表或表达式之前忽略它。但我们在使用它的时候需要评估整个东西,不是吗?

最佳答案

[1,2,3,4,5,6,7,8] 这样的列表只是语法糖:1:2:3:4:5: 6:7:8:[].

在这种情况下,列表中的所有值都是数字常量,但我们可以定义另一个更小的列表,如下所示:

1:1+1:[]

所有 Haskell 列表都是链表,这意味着它们有一个和一个。在上面的例子中,头部是1,尾部是1+1:[]

如果您只想要列表的头部,则没有理由评估列表的其余部分:

(h:_) = 1:1+1:[]

这里,h指的是1。如果 h 就是您所需要的,则没有理由评估列表的其余部分 (1+1:[])。

这就是列表的延迟评估方式。 1+1 仍然是一个 thunk(未计算的表达式),直到需要该值为止。

关于haskell - 当参数是列表时,惰性求值如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50907117/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com