函数的无限递归列表

时间:2015-02-18 17:18:34

标签: haskell

假设我有两个无限列表ch

我也有一个功能

f :: OLG -> Int -> Double -> Double -> Double -> Double -> Double

其中OLG是我定义的数据类型。

我想构建一个具有以下形式的第三个无限列表

a :: [Double]
a = [     0.0, 
     f m 0 ↑ (c!!0) (h!!0) w_ave,
     f m 1 ↑ (c!!1) (h!!1) w_ave,
     f m 2 ↑ (c!!2) (h!!2) w_ave,
     f m 3 ↑ (c!!3) (h!!3) w_ave,
     f m 4 ↑ (c!!4) (h!!4) w_ave,
     f m 5 ↑ (c!!5) (h!!5) w_ave,
     f m 6 ↑ (c!!6) (h!!6) w_ave,
     ⋮,
     f m i ↑ (c!!i) (h!!i) w_ave,
     ]

其中m :: OLGc :: [Double]h :: [Double]w_ave :: Double。 uparrow()表示一个占位符,表示f的第三个参数应该是我们正在构建的列表的前一个元素。

我想有一种干净/递归的方式可以做到这一点,但对Hasekll来说是新手,我无法想到它。也许我需要以某种方式使用iterate

这个问题让我想起了一些斐波纳契数无限列表的标准实现

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

通过将函数应用于先前的列表元素来计算列表的连续元素。

1 个答案:

答案 0 :(得分:4)

感谢来自@ReidBarton的提示,我能够解决这个问题。以下是我提出的建议:

注意:正如@Jeffrey所指出的,为了简化代码并允许部分应用程序为我们定义g函数,我重新定义了f以便i元素{ {1}}将a(我将f m w_ave i ↑ (c!!i) (h!!i)移动为第二个参数而不是最后一个参数。)

这意味着f的类型现在为w_ave

f :: OLG -> Double -> Int -> Double -> Double -> Double -> Double