假设我有两个无限列表c
和h
。
我也有一个功能
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 :: OLG
,c :: [Double]
,h :: [Double]
和w_ave :: Double
。 uparrow(↑
)表示一个占位符,表示f
的第三个参数应该是我们正在构建的列表的前一个元素。
我想有一种干净/递归的方式可以做到这一点,但对Hasekll来说是新手,我无法想到它。也许我需要以某种方式使用iterate
?
这个问题让我想起了一些斐波纳契数无限列表的标准实现
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
通过将函数应用于先前的列表元素来计算列表的连续元素。
答案 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