2016-12-01 48 views
1

我使用一個版本的斐波那契函數g其中:如何實現功能的無限列表的Haskell

g :: Integer -> Integer -> Integer 
g i n | i==0 = 0 
     | i==1 = n 
     | i>1 = (n*((g (i-1) n) + (g (i-2) n))) 

...這樣杜松子酒是GI(n)和部分定義的值gi是gi

我現在想定義一個無限列表函數:gs :: [ Integer -> Integer ],這樣(gs !! i) is gi。我想要5 $ [ g 3 | g <- gs]給我[0,3,9,36,135]

任何人都可以幫助我定義這個無限列表嗎?

+3

請注意,你的作用是相當低效,建設名單其功能將產生低效功能列表。 (我想知道你爲什麼想要這樣的清單......我擔心這可能是一個XY問題......) – chi

回答

4

您可以使用[0 ..]獲得從0開始的所有數字的列表。一旦你有了這些,這只是一個申請g每個人的問題。

就像你在你的使用例子你可以做到這一點使用列表理解:

gs = [g i | i <- [0 ..]] 

或使用地圖:

gs = map g [0 ..] 
+0

非常感謝。沒有使用列表解析和映射的方法嗎?並過濾此事 – bobjohnson

+0

@bobjohnson當然,有很多方法。例如,您可以定義自己的「地圖」功能並使用它。你甚至可以刪除函數參數並直接使用'g'。你也可以通過用一個你增加的計數器替換列表參數來取消'[0 ..]',而不是使用列表尾部。這真的取決於你,儘管我給出的兩個版本絕對是最簡單的。 – sepp2k

+0

多數民衆贊成在此非常感謝。但是,我如何僅對函數g應用一個參數? – bobjohnson