相关疑难解决方法(0)

这个函数发生了什么(haskell)?

我有这个haskell功能,我不太明白.

ns :: [Integer]
ns = 0 : [n+k | (n, k) <- zip ns [1,3..]]
Run Code Online (Sandbox Code Playgroud)

我被要求"需要3 ns".

我认为ns是常量所以它只会用列表的第一个元素压缩,给出(0,1).然后当添加时给出1的答案.然后它说"需要3 ns",所以我用列表的前5个元素压缩0,给出...(0,1),(0,3),(0,5 )然后在添加时,我得到[1,3,5]的最终答案.然而,这不是正确的答案.

ns真正发生了什么?我很难理解......

haskell list-comprehension list

4
推荐指数
1
解决办法
187
查看次数

懒惰评估:为什么它更快,优势与劣势,机制(为什么它使用更少的CPU;示例?)和简单的概念证明示例

懒惰评估被认为是一种延迟流程直到第一次需要的方式.这往往会避免重复评估,这就是为什么我认为这样做的速度要快得多.像Haskell(和JavaScript ..?)这样的函数语言内置了这个功能.

但是,我不明白为什么和为什么其他"正常"方法(即相同的功能但不使用惰性评估)更慢..这些其他方法如何以及为什么重复进行评估?有人可以通过提供简单的例子并解释每种方法的机制来详细说明这一点吗?

另外,根据Wikipedia关于懒惰评估的页面,这些被认为是这种方法的优点:

  1. 通过避免不必要的计算以及评估复合表达式中的错误条件来提高性能
  2. 构建潜在无限数据结构的能力
  3. 将控制流(结构)定义为抽象而不是基元的能力

但是,我们可以控制所需的计算并避免重复相同的计算吗?(1)我们可以使用ie链接列表来创建无限数据结构(2)我们可以做(3)已经.. ??? 我们可以定义类/模板/对象并使用它们而不是原语(即JavaScript).

另外,在我看来(至少从我见过的案例中),懒惰的评估与递归和使用"头部"和"尾部"(以及其他)概念密切相关.当然,有些情况下递归是有用的,但懒惰的评价不仅仅是......?不仅仅是一种解决问题的递归方法..?Streamjs是一个JavaScript库,它使用递归和一些其他简单的操作(头部,尾部等)来执行惰性求值.

看来我无法理解它...

在此先感谢任何贡献.

recursion performance haskell lazy-evaluation lazy-initialization

4
推荐指数
2
解决办法
4216
查看次数

Haskell无限递归

以下函数计算斐波那契数列:

fib = 0 : 1 : (zipWith (+) fib (tail fib))
Run Code Online (Sandbox Code Playgroud)

如果运行它,我们将得到一个无限列表,但是递归如何工作?如果函数不断调用自身,为什么会在屏幕上打印数字?如果您能解释编译器如何管理调用,将不胜感激。

recursion haskell list fibonacci infinite

3
推荐指数
1
解决办法
752
查看次数

在Haskell中使用zipWith输出斐波那契数的优雅方式

我在Haskell中看到了斐波那契数的这种实现方式,但我仍在试图弄清楚为什么它可以正常工作。因此,很显然,可以使用zipWith函数以非常紧凑的方式编写斐波那契数。该实现如下所示

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)

为了更好地了解此处发生的情况,我查看了zipWith函数的文档。此函数使用给定的函数(a-> b-> c)将两个列表[a],[b]一起添加。在我们的例子中,该功能是一个简单的添加。如果两个列表[a]和[b]的长度不同(在我们的例子中,列表[b]总是比列表[a]短一个元素),则zipWith只是从两个列表的开头开始并将它们相加。如果到达一个列表的末尾,则无论已到达另一个列表的末尾,它都会停止。

在递归的第一步中,使用[0,1]和tail [0,1] = [1]调用zipWith。这导致另一个1 => [0,1,1]。在递归的第二步中,使用[0,1,1]和[1,1]调用zipWith,导致[0 + 1,1 + 1] = [1,2]。因此,对我来说,很明显,递归创建了正确的斐波那契数字,但是我不完全理解为什么仅将zipWith步骤之后的最后一个数字添加到结果中,而不是整个列表中。也许有人可以向我解释。那会很有帮助。非常感谢你。

haskell fibonacci zipwith

1
推荐指数
1
解决办法
79
查看次数