Für eine Klasse habe ich versucht, einfache Beispiele für strikte und nicht-strikte Funktionen zu finden, mit dem Argument, dass nicht-strikte Funktionen sinnvoll sind. Eines meiner Beispiele war, dass es nützlich sein könnte, 0 * x = x * 0 = 0 für alle x in der Domäne zu definieren. Als ich nach Hause kam, wollte ich natürlich sehen, was die Haskell-Schöpfer darüber denken. Hier kommt meine Verwirrung.strenge oder nicht-strikte Multiplikation in Haskell?
An einer Maschine, GHCI sagt, dass die Multiplikation auf beiden Argumente streng:
GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> 0 * undefined
*** Exception: Prelude.undefined
Prelude> undefined * 0
*** Exception: Prelude.undefined
Bei einer anderen Maschine, sagt GHCI, dass die Multiplikation auf dem ersten Argument nicht streng ist:
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help
Prelude> undefined * 0
0
Prelude> 0 * undefined
*** Exception: Prelude.undefined
Was verursacht den Unterschied im Verhalten?
ich nicht die Antwort auf Ihre Frage nicht kennen, aber für Beispiele, warum Faulheit ist nützlich, die Dir vielleicht gefallen [Non-Trivial Lazy Evaluation] (http://stackoverflow.com/questions/7868507/nicht-trivial-lazy-evaluation). –
Das ist das Ergebnis eines [Bug in GHC 7.10.3] (http://stackoverflow.com/questions/36049689/why-does-multiplication-only-short-circuit-on-one-side), die nicht existiert vor 7.10 und wurde in 8.1 eliminiert. –
OK. Vielen Dank. Weißt du, was der Grund für die Entscheidung ist, die Multiplikation streng zu machen? Aus meiner Sicht ist das nicht offensichtlich, da ich eine Parallele zu der Tatsache mache, dass True || undefiniert = Wahr. – stefk0