fr:
Les monades
en: Monads
blogimage("dali_reve.jpg","Dali, reve. It represents a weapon out of the mouth of a tiger, itself out of the mouth of another tiger, itself out of the mouth of a fish itself out of a grenade. I could have choosen a picture of the Human centipede as it is a very good representation of what a monad really is. But just to think about it, I find this disgusting and that wasn't the purpose of this document.")
fr: Maintenant le secret peut être dévoilé : `IO` est une _monade_.
en: Now the secret can be revealed: `IO` is a _monad_.
fr: Être une monade signifie que vous avez accès à du sucre syntaxique avec la notation `do`.
en: Being a monad means you have access to some syntactical sugar with the `do` notation.
fr: Mais principalement, vous avez accès à un motif de codage qui tempérera le flux de votre code.
en: But mainly, you have access to a coding pattern which will ease the flow of your code.
fr: > **Remarques importantes** :
en: > **Important remarks**:
>
fr: > - Le monades n'ont pas forcément quoi que ce soit à voir avec les effets de bord !
en: > - Monad are not necessarily about effects!
fr: > Il y a beaucoup de monades _pures_.
en: > There are a lot of _pure_ monads.
fr: > - Les monades concernent plus le séquençage.
en: > - Monad are more about sequencing
fr: En Haskell, `Monad` est une classe de type.
en: In Haskell, `Monad` is a type class.
fr: Pour être une instance d'une classe de type, vous devez fournir les fonctions `(>>=)` et `return`.
en: To be an instance of this type class, you must provide the functions `(>>=)` and `return`.
fr: La fonction `(>>)` est dérivée de `(>>=)`.
en: The function `(>>)` is derived from `(>>=)`.
fr: Voici commment la classe de type `Monad` est déclarée (grosso modo) :
en: Here is how the type class `Monad` is declared (basically):
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
return :: a -> m a
(>>) :: m a -> m b -> m b
f >> g = f >>= \_ -> g
fr: -- Vous pouvez ignorer cette fonction généralement,
en: -- You should generally safely ignore this function
fr: -- je crois qu'elle existe pour des raisons historiques
en: -- which I believe exists for historical reasons
fail :: String -> m a
fail = error
fr: > Remarques :
en: > Remarks:
>
fr: > - le mot-clé `class` n'est pas votre ami.
en: > - the keyword `class` is not your friend.
fr: > Une classe en Haskell _n'est pas_ du même genre que celle des langages orientés-objet.
en: > A Haskell class is _not_ a class of the kind you will find in object-oriented programming.
fr: > Elles ont beaucoup de similarités avec les interfaces de Java.
en: > A Haskell class has a lot of similarities with Java interfaces.
fr: > Un meilleur mot aurait été `typeClass`, ce qui signifierait un ensemble de types.
en: > A better word would have been `typeclass`, since that means a set of types.
fr: > Pour qu'un type appartienne à une classe, toutes les fonctions de cette classe doivent être fournies pour ce type.
en: > For a type to belong to a class, all functions of the class must be provided for this type.
fr: > - Dans cet exemple particulier de classe de type, le type `m` doit être un type qui prend un argument.
en: > - In this particular example of type class, the type `m` must be a type that takes an argument.
fr: > par exemple `IO a`, mais aussi `Maybe a`, `[a]`, etc...
en: > for example `IO a`, but also `Maybe a`, `[a]`, etc...
fr: > - Pour être une monade utile, votre fonction doit obéir à quelques règles.
en: > - To be a useful monad, your function must obey some rules.
fr: > Si votre construction n'obéit pas à ces règles, des choses étranges pourraient se produire :
en: > If your construction does not obey these rules strange things might happens:
> ~~~
> return a >>= k == k a
> m >>= return == m
> m >>= (\x -> k x >>= h) == (m >>= k) >>= h
> ~~~
fr: Maybe est une monade
en: Maybe is a monad
fr: Il y a beaucoup de types différents qui sont des instances de `Monad`.
en: There are a lot of different types that are instances of `Monad`.
fr: L'un des plus faciles à décrire est `Maybe`.
en: One of the easiest to describe is `Maybe`.
fr: Si vous avez une séquence de valeurs `Maybe`, vous pouvez utiliser les monades pour les manipuler.
en: If you have a sequence of `Maybe` values, you can use monads to manipulate them.
fr: C'est particulièrement utile pour enlever des constructions `if..then..else..` trop nombreuses.
en: It is particularly useful to remove very deep `if..then..else..` constructions.
fr: Imaginez une opération bancaire complexe. Vous êtes éligible pour gagner 700€ seulement si
en: Imagine a complex bank operation. You are eligible to gain about 700€ only
fr: vous pouvez effectuer une liste d'opérations sans tomber en dessous de zéro.
en: if you can afford to follow a list of operations without your balance dipping below zero.
> deposit value account = account + value
> withdraw value account = account - value
>
> eligible :: (Num a,Ord a) => a -> Bool
> eligible account =
> let account1 = deposit 100 account in
> if (account1 < 0)
> then False
> else
> let account2 = withdraw 200 account1 in
> if (account2 < 0)
> then False
> else
> let account3 = deposit 100 account2 in
> if (account3 < 0)
> then False
> else
> let account4 = withdraw 300 account3 in
> if (account4 < 0)
> then False
> else
> let account5 = deposit 1000 account4 in
> if (account5 < 0)
> then False
> else
> True
>
> main = do
> print $ eligible 300 -- True
> print $ eligible 299 -- False