2014-09-03 11 views
6

Ich fange gerade an, funktionelle Programmierung zu lernen, Meine Wahl ist haskell. Es ist schon ein paar Tage ok bis bizzare etwas in der Konsole passierenHaskell spuckt falsche Zahlen zufällig aus

Zuerst dachte ich, das Tutorial (http://learnyouahaskell.com/starting-out) ist falsch

Prelude> [ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2] 
[(1,1,1)] 

Es (3,4,5) und (4,6,8) sein sollte. Ich versuchte 3^2+5^2, es spuckt diese Masse von Zahlen aus (etwas wie 60 Reihen von Zahlen, ungefähr 3000 Ziffern); 4^2+3^2 scheint die gleichen Zahlen zu produzieren.

keine Zahlen addieren Der Versuch wird das Ergebnis 100 sein

Prelude> 100 + 200 
100 
Prelude> 300 + 500 
100 

ich das Fenster zu schließen und wieder öffnen und das Problem ist gelöst.

Tritt diese Fehlkalkulation häufig in Haskell auf? oder vielleicht ist meine Version von Haskell beim Herunterladen beschädigt? oder Ist das ein seltener Fehler?

+6

Sind Sie sicher, dass Sie nicht wie etwas zu tun haben 'lassen ein + b = 100' vor dem Start dieser Linie? Ich kann deine Ergebnisse nicht replizieren, und 'Let'' Definitionen in Ghci sind irgendwie Stateful. – BluePeppers

+0

Auch die korrekte Ausgabe sollte wahrscheinlich '[(3,4,5), (6,8,10)]' sein, was ich bekomme (und passt sowohl zur Wikipedia-Seite als auch zu meiner Mathematikausbildung als die ersten 2 Pythagoreische Tripel) – BluePeppers

+0

@BluePeppers Ich denke du hast es, denn nach 'let a + b = 100', ergibt das Listenverständnis * * [(1,1,1)] '. –

Antwort

11

Was geschieht, wie @BluePeppers vorgeschlagen, ist, dass man irgendwie das Äquivalent von let a+b = 100 in GHCI getan haben, wonach sie diese Definition verwendet statt der üblichen + in allen Ausdrücken.

Sie könnten immer noch fragen, warum das so enorme Zahlen gibt, und so habe ich, bis ich den zweiten Punkt realisiert: Die Neudefinition (+) definiert auch seine Vorrang, auf die Standardeinstellung von 9 (höchste). So werden Sie Ihr Beispiele interpretiert als:

[ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2] 

wird

[ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^100^2 == c^2] 

und

3^2+5^2 

wird

3^100^2 
+0

Oh, das ist sogar besser als ich erwartet hatte. Wie schön – BluePeppers

+0

aah, ich wusste nicht, Haskell kann einen Operator überschreiben. – Rmxhaha

+0

Ich dachte, dass Haskell das Problem lösen kann, dann habe ich das versucht, bevor ich das Tutorial ausprobiert habe, – Rmxhaha

Verwandte Themen