Ich lade Sie ein, das folgende Problem von Fibonacci aus project Euler zu überprüfen. Die Frage fordert die Benutzer auf, zuerst eine Fibonacci-Sequenz oder -Funktion zu erzeugen, die die n-te Fibonacci-Zahl zurückgeben kann. Ich benutzen die zipWith Lösung eine faule/unendliche Liste der Fibonacci-Zahlen zu erzeugen:ProjectEuler Q2: Haskell Lösung wird nicht bewertet
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Als nächstes stellt die Frage, um die Liste zu beschränken Zahlen/Werte weniger als fibonacci 4E6, und dann die geraden Zahlen summieren. Ich dachte wäre dies ein sehr einfache Liste Verständnis sein:
sum [x | x<-fibs, even x && x < (4*10^6 + 1)]
Dieser Ausdruck wird die Bewertung nicht zu Ende .... Ich dachte, es würde gehen, bis sie die am weitesten rechts stehende Zahl (die erste fib größer als 4E6 finden , das 34. Element in der Liste fibs!!34
) und dann die Liste beenden, eine kleine Anzahl von Ganzzahlen summieren. Was mache ich falsch?
Sie können 'takeWhile' verwenden, um die Verarbeitung der Liste zu beenden, wenn sie kein Prädikat mehr erfüllt. – 4castle
Die Liste ist monoton steigend, aber Haskell weiß das nicht - also wird es nicht aufhören, Elemente daraus zu bewerten, nur weil Sie über einen Schwellenwert gehen, der in ein Prädikat in einem Listenverständnis eingebunden ist. – hnefatl