In einer Programmierübung wurde zuerst gebeten, die faktorielle Funktion zu programmieren und dann die Summe zu berechnen: 1! + 2! + 3! +... n!
in O(n)
Multiplikationen (so können wir die Fakultät nicht direkt verwenden). Ich suche nicht nach der Lösung für dieses spezielle (triviale) Problem, ich versuche Haskell Fähigkeiten zu erforschen und dieses Problem ist ein Spielzeug, mit dem ich gerne spielen würde.Ist Haskells Faulheit eine elegante Alternative zu Pythons Generatoren?
Ich dachte, Pythons Generatoren könnten eine gute Lösung für dieses Problem sein. Zum Beispiel:
from itertools import islice
def ifact():
i , f = 1, 1
yield 1
while True:
f *= i
i += 1
yield f
def sum_fact(n):
return sum(islice(ifact(),5))
Dann habe ich versucht, um herauszufinden, ob es etwas in Haskell war ein ähnliches Verhalten als dieser Generator mit und ich dachte, dass Faulheit zu tun alle Mitarbeiter ohne zusätzliches Konzept.
Zum Beispiel könnten wir meinen Python ifact mit
fact = scan1 (*) [1..]
ersetzen und dann die Übung mit dem folgenden lösen:
sum n = foldl1 (+) (take n fact)
Ich frage mich, ob diese Lösung wirklich „gleichwertig“ ist zu Pythons eines hinsichtlich zeitlicher Komplexität und Speicherauslastung. Ich würde sagen, dass die Lösung von Haskell niemals alle Fakten der Liste speichert, da ihre Elemente nur einmal verwendet werden.
Bin ich richtig oder total falsch?
EDIT: Ich sollte genauer prüfen lassen:
Prelude> foldl1 (+) (take 4 fact)
33
Prelude> :sprint fact
fact = 1 : 2 : 6 : 24 : _
So (meine Implementierung) Haskell das Ergebnis speichern, auch wenn es nicht mehr benutzt, um.
Es gibt einige Ähnlichkeiten, aber auch einige Unterschiede: Python-Generatoren gewähren Ihnen keinen Zugriff auf zuvor besuchte Elemente, es sei denn, Sie speichern sie explizit in einem anderen Objekt. – pyon
Der Analogon zu Python-ähnlichen Generatoren am ähnlichsten (C#: 'IEnumerator', Rust:' Iterator', usw.) Ich kann mir vorstellen, dass der Begriff 'Producer's, in Gabriel Gonzalez 'ausgezeichnet [Pipes] (http://hackage.haskell.org/package/pipes) Bibliothek. – pyon
Ich würde sagen, dass sie in mancher Hinsicht eher eine Verallgemeinerung von ihnen sind, aber Pythons Generatoren können auch als Koroutinen fungieren, die unter bestimmten Umständen ziemlich nett sind. – bheklilr