gpt4 book ai didi

haskell - 这个haskell代码是如何工作的?

转载 作者:行者123 更新时间:2023-12-05 00:24:19 25 4
gpt4 key购买 nike

我是一名新生,我正在学习计算机科学。我们正在处理 Haskell,虽然我理解 Haskell 的想法,但我似乎无法弄清楚我们应该查看的这段代码究竟是如何工作的:

module U1 where

double x = x + x
doubles (d:ds) = (double d):(doubles ds)
ds = doubles [1..]

我承认,对于知道发生了什么的人来说这似乎很简单,但我无法理解它。如果我写“take 5 ds”,它显然会返回 [2,4,6,8,10]。我不明白的是为什么。

这是我的思路:我调用 ds,然后查找 double 。因为我还提交了值 [1..],doubles (d:ds) 应该意味着 d = 1 和 ds = [2..],对吗?然后我将 d 加倍,它返回 2 并将其放在列表(数组?)的开头。然后它调用自己,将 ds = [2..] 转换为 d = 2 和 ds = [3..],然后将 d 加倍一次又一次调用自身,依此类推,直到它可以返回 5 个值, [2,4,6,8,10]。

那么首先,我的理解对吗?我的思路是否有任何严重错误?
其次,由于它似乎将所有双倍 d 保存到一个列表中以供以后调用,该列表的名称是什么?我在哪里确切定义它?

在此先感谢,希望您能帮助学生理解这一点 x)

最佳答案

我认为您对递归/循环部分的看法是正确的 doubles遍历无限列表的每个元素。

现在关于

it seems to save all doubled d into a list to call for later, whats the name of that list? Where did I exactly define it?



这与 Haskell 中称为 Lazy Evaluation 的功能有关。该列表未预先计算并存储在任何位置。相反,您可以想象列表是 C++ 中的函数对象,可以在需要时生成元素。 (您可能看到的正常语言是表达式是按需求值的)。所以当你做
take 5 [1..]
[1..]可以看作是一个函数对象,与 head 一起使用时生成数字, take等等 所以,
take 5 [1..] == (1 :  take 4 [2..])

这里 [2..]也是一个给你数字的“函数对象”。同样,你可以有
take 5 [1..] == (1 : 2 : take 3 [3..]) == ... (1 : 2 : 3 : 4 : 5 : take 0 [6..])

现在,我们不需要关心 [6..] , 因为 take 0 xs对于任何 xs[] .因此,我们可以有
take 5 [1..] == (1 : 2 : 3 : 4 : 5 : [])

无需存储任何“无限”列表,如 [2..] .如果您想了解延迟计算实际上是如何发生的,它们可以被视为函数对象/生成器。

关于haskell - 这个haskell代码是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26453394/

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