Pour une classe, j'essayais de trouver des exemples simples de fonctions strictes et non-strictes, soutenant que les fonctions non-strictes avaient du sens. Un de mes exemples était qu'il pourrait être utile de définir 0 * x = x * 0 = 0 pour tout x dans le domaine. Quand je suis rentré chez moi, je voulais naturellement voir ce que les créateurs Haskell pensent de ça. Voici ma confusion.multiplication stricte ou non stricte dans haskell?
à une machine, ghci dit que la multiplication est stricte sur les deux arguments:
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
à une autre machine, ghci dit que la multiplication est non stricte sur le premier argument:
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help
Prelude> undefined * 0
0
Prelude> 0 * undefined
*** Exception: Prelude.undefined
Qu'est-ce que provoque la différence de comportement?
Je ne connais pas la réponse à votre question, mais des exemples de pourquoi la paresse est utile que vous pourriez aimer [non-Trivial évaluation Lazy] (http://stackoverflow.com/questions/7868507/évaluation non-triviale-paresseuse). –
C'est le résultat d'un [bug dans GHC 7.10.3] (http://stackoverflow.com/questions/36049689/why-dul-multiplication-only-short-circuit-on-one-side) qui n'a pas exister avant 7.10 et a été éliminé en 8.1. –
OK. Merci. Savez-vous quel est le raisonnement derrière la décision de rendre la multiplication stricte? De mon point de vue, ce n'est pas évident, parce que je fais un parallèle avec le fait que True || undefined = Vrai. – stefk0