gpt4 book ai didi

haskell - Haskell 中斐波那契数列的无限列表

转载 作者:行者123 更新时间:2023-12-05 01:51:45 24 4
gpt4 key购买 nike

很抱歉提出这样的问题。我是一个非常初级的程序员,我才刚刚开始学习 Haskell。我最近遇到了一个练习,要在 Haskell 中实现一个返回无限斐波那契数列的函数。以下代码是练习的答案:

fibs :: [Int]
fibs = fibs2 0
where
fibs2 :: Int -> [Int]
fibs2 x = (fib2) x : (fibs2 (x+1))

有人可以向我解释为什么我们应该在这里声明另一个函数 (fibs2) 以及“where”在这种情况下的作用吗?

最佳答案

Can someone explain to me why we should declare another function (fibs2) here?

您当然没有义务声明另一个函数。但是,这种特殊模式非常普遍。把它想象成其他语言中的循环初始化。如果您想迭代某个过程,最简单的方法是编写一个函数,该函数获取一些描述您在迭代中所处位置的信息,执行“循环”的一个步骤,然后使用适当修改的描述调用自身。例如,如果你想对从 0 到 n 的所有数字求和,你可以这样写:

sumTo :: Int -> Int
sumTo 0 = 0
sumTo n = n + foo (n-1)

但通常您想要的函数或值实际上是从特定值开始的函数或值。强制循环的所有调用者指定起始值是很烦人的;并且您已经将循环实现为带参数的递归函数这一事实是他们无论如何都不应该担心的实现细节。那么该怎么办?好吧,您定义了一些调用具有正确起始值的循环的东西。

gauss :: Int
gauss = sumTo 100

这样,用户只需使用 gauss 而不必知道 100 是您内部函数的正确起始值。

Can someone explain to me what "where" does in this case?

好吧,关于我们之前的 sumTo/gauss 值,还有一点有点不幸:我们对 sumTo 并不真正感兴趣本身,仅在 gauss 中,并且它在 gauss 之外可见的事实违反了抽象障碍!如果很容易调用,则可能是其他人试图使用它;然后,如果我们需要更改它以改进 gauss 的功能,我们正在改进 gauss 但可能会破坏其他用户使用 sumTo 的功能.所以我们想隐藏它的存在。

这就是此处 where 的目的:它允许您定义只能在本地访问的新事物。所以:

gauss :: Int
gauss = sumTo 100 where
sumTo 0 = 0
sumTo n = n + sumTo (n-1)

在这个变体中,可以调用gauss,但是在gauss的实现之外,不可能调用sumTo,保持良好的抽象边界。

关于haskell - Haskell 中斐波那契数列的无限列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72028347/

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