en:
Infinite Structures
fr: Structures infinies
blogimage("escher_infinite_lizards.jpg","Escher")
en: It is often said that Haskell is _lazy_.
fr: On dit souvent que Haskell est _paresseux_.
en: In fact, if you are a bit pedantic, you should say that [Haskell is _non-strict_](http://www.haskell.org/haskellwiki/Lazy_vs._non-strict).
en: Laziness is just a common implementation for non-strict languages.
fr: En fait, si vous êtes un petit peu pédant, vous devriez dire que [Haskell est _non-strict_](http://www.haskell.org/haskellwiki/Lazy_vs._non-strict) (_NDT: En anglais, pour changer_).
fr: La paresse est juste une implémentation commune aux langages non-stricts.
en: Then what does "not-strict" mean? From the Haskell wiki:
fr: Alors que signifie "non-strict"? D'après le wiki de Haskell :
en: > Reduction (the mathematical term for evaluation) proceeds from the outside in.
en: >
en: > so if you have `(a+(b*c))` then you first reduce `+` first, then you reduce the inner `(b*c)`
fr: > La réduction (terme mathématique pour "évaluation") procède depuis l'extérieur.
fr: >
fr: > Donc si vous avez `(a+(b*c))`, alors vous réduisez `+` d'abord, puis vous réduisez `(b*c)`
en: For example in Haskell you can do:
fr: Par exemple en Haskell vous pouvez faire :
> -- numbers = [1,2,..]
> numbers :: [Integer]
> numbers = 0:map (1+) numbers
>
> take' n [] = []
> take' 0 l = []
> take' n (x:xs) = x:take' (n-1) xs
>
> main = print $ take' 10 numbers
en: And it stops.
fr: Et ça s'arrête.
en: How?
fr: Comment ?
en: Instead of trying to evaluate `numbers` entirely,
en: it evaluates elements only when needed.
fr: Au lieu d'essayer d'évaluer `numbers` entièrement,
fr: Haskell évalue les éléments seulement lorsque c'est nécessaire.
en: Also, note in Haskell there is a notation for infinite lists
fr: Remarquez aussi qu'en Haskell, il y a une notation pour les listes infinies
~~~
[1..] ⇔ [1,2,3,4...]
[1,3..] ⇔ [1,3,5,7,9,11...]
~~~
en: and most functions will work with them.
en: Also, there is a built-in function `take` which is equivalent to our `take'`.
fr: et que la majorité des fonctions fonctionnera avec ces listes.
fr: Il y a aussi une fonction `take` équivalente à notre `take'`.