【发布时间】:2016-03-04 19:33:44
【问题描述】:
我有一个无限列表,dog(不是实际名称),它的元素是由一个有点慢的函数生成的,所以我试图避免多次生成相同的元素。问题是我想要以下新列表,cat:
let cat = zipWith (++) dog $ tail dog
我是否认为cat 是通过两次评估dog 的每个元素(来自dog 和tail dog)然后连接这两个元素而创建的?如果是这样,有没有办法让Haskell“意识到”dog 的元素与tail dog 完全相同,只是向左移动了一个,这样我就可以“传递前一个元素的值” tail dog 到 dog 的当前元素?也就是说,由于我知道dog 的第i 个元素等于tail dog 的第(i - 1) 个元素,我希望我的程序只是重新使用的第(i - 1) 个元素tail dog 而不是重新计算它。
我知道像斐波那契数列的规范创建这样的列表,let fib = 0:1:zipWith (+) fib $ tail fib 只评估元素一次;但这是因为列表是在自身上定义的,而 cat 不是。
如果这是一个愚蠢的问题,我深表歉意,但我的大脑最近并没有全速运转。如果知道有问题的具体列表会有用,那么我将非常乐意提供它。谢谢。
【问题讨论】:
标签: haskell