2016-12-01 3 views
1

Ich verwende eine Version der Fibonacci-Funktion g implementieren, wo:Wie eine unendliche Liste von Funktionen in 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))) 

... so dass Gin den Wert gi (n) und die partiellen Definition ist gi ist gi

Ich möchte jetzt eine unendliche Liste von Funktionen definieren: gs :: [ Integer -> Integer ], so dass (gs !! i) is gi.

Ich möchte 5 $ [ g 3 | g <- gs] nehmen, um mir [0,3,9,36,135] geben.

Kann mir jemand helfen, diese unendliche Liste zu definieren?

+3

Beachten Sie, dass Ihre Funktion ziemlich ineffizient ist, und den Aufbau einer Liste von Funktionen daraus ergeben eine Liste ineffizienter Funktionen. (Ich frage mich, warum Sie so eine Liste wollen ... Ich fürchte, das könnte ein XY-Problem sein ...) – chi

Antwort

4

Sie können eine Liste aller Nummern erhalten, die bei 0 beginnen und [0 ..] verwenden. Sobald Sie das haben, ist es nur eine Frage der Anwendung g zu jedem von ihnen.

Sie können dies tun, um eine Liste Verständnis mit, wie Sie in Ihrem Beispiel Nutzung tat

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

oder mit Karte:

gs = map g [0 ..] 
+0

Vielen Dank. Gibt es eine Möglichkeit, dies ohne die Verwendung von Listen-Comprehensions und Map zu tun? und Filter für die Angelegenheit – bobjohnson

+0

@bobjohnson Sicher, viele Möglichkeiten. Zum Beispiel könnten Sie einfach Ihre eigene 'map'-Funktion definieren und diese verwenden. Sie könnten sogar den Funktionsparameter entfernen und direkt 'g' verwenden. Und Sie könnten auch "[0 ..]" loswerden, indem Sie das Listenargument durch einen Zähler ersetzen, den Sie erhöhen, anstatt den Endteil der Liste zu übernehmen. Es liegt wirklich an dir, obwohl die zwei Versionen, die ich gebe, definitiv die einfachsten sind. – sepp2k

+0

das ist super danke. Wie verwende ich nur ein Argument für meine Funktion g obwohl? – bobjohnson

Verwandte Themen