[Haskell-fr] Fw: Éclaircissements sur les monades
Gautier DI FOLCO
gautier.difolco at gmail.com
Sun May 18 10:04:07 UTC 2014
2014-03-27 10:11 GMT+01:00 Gautier DI FOLCO <gautier.difolco at gmail.com>:
> 2014-03-27 6:07 GMT+01:00 Dan Popa <popavdan at yahoo.com>:
>
> Hi,
>>
>> Sorry for writing in english, I am not from France.
>> Take a look here, please:
>>
>> http://www.haskell.org/haskellwiki/Modular_Monadic_Compilers_for_Programming_Languages
>>
>> The source at #3) on the above page is a code generator written using
>> the State monad.
>> The state monad is necessary because here it provides a sort of context,
>> like a set of the global variables
>> in imperative programming.
>> And that is why we are using The State Monad, to simulate the
>> use of a set of global (or local) variables, used to store values.
>>
>> Especially in this example, the lenghts of the pieces of generated code
>> are stored in order to compute the length of the biggers codes, when they
>> are catenated, (glued together).
>>
>> Other monads have specific use. Parser monad is used for glueing parsers,
>> the list monad can simulate paralel computations and even backtracking
>> (there is a backtracking monad too), the Maybe monad is used to make
>> computations including Nothing in the set of values, etc.
>>
>> Basically monadic capsules can be seen like Christmas Giftts containing
>> compuations. And monadic operators have two kind of use:
>> - return is a package maker, it creates a capsule, a package, like
>> wrapping a gift
>> - bind is something like: how to combine a function with a package. Open
>> the package, compose functions, take care to produce an other package (or
>> capsule).
>>
>> Hoping it helps,
>> Sincerely yours,
>> Dan Popa
>>
>> ----- Forwarded Message -----
>> *From:* Gautier DI FOLCO <gautier.difolco at gmail.com>
>> *To:* La liste Haskell Francophone <haskell-fr at haskell.org>
>> *Sent:* Wednesday, March 26, 2014 12:10 PM
>> *Subject:* [Haskell-fr] Éclaircissements sur les monades
>>
>> Bonjour,
>>
>> Vaste sujet en perspective : les monades.
>> Je pense avoir compris le principe des monades (être en mesure
>> d'effectuer des actions sur une valeur au sein d'un contexte), en revanche
>> il y a deux choses que je ne comprends pas :
>> * La notion de contexte (ou de cadre de calcul) est un peu floue
>> * Pourquoi est-ce que les monades sont aptes à contenir les effets de
>> bords (j'ai lu effectful computations) et pas d'autres typeclass (comme
>> Applicative).
>>
>> Merci par avance pour vos réponses.
>>
>> _______________________________________________
>> Haskell-fr mailing list
>> Haskell-fr at haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-fr
>>
>>
>>
>> _______________________________________________
>> Haskell-fr mailing list
>> Haskell-fr at haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-fr
>>
>>
> State Monads are clearer to me, thanks.
>
Bonjour à tous,
J'ai fais pas mal de progrès ces derniers temps (de manière globale) du
coup il y a encore une zone d'ombre que j'aimerais éclaircir : comment les
valeurs sont passées à une fonction ?
La question est vague, un exemple est de rigueur, j'ai ce code que je pense
assez classique :
-- Generic
newtype Reader r a = Reader { runReader :: r -> a }
instance Monad (Reader r) where
return a = Reader $ \_ -> a
m >>= k = Reader $ \r -> runReader (k (runReader m r)) r
ask :: Reader a a
ask = Reader id
asks :: (r -> a) -> Reader r a
asks f = Reader f
local :: (r -> b) -> Reader b a -> Reader r a
local f m = Reader $ runReader m . f
-- Specific
data MyState = MyState
{ foo :: String
, bar :: Int
} deriving (Show)
computation :: Reader MyState (Maybe String)
computation = do
n <- asks bar
x <- asks foo
if n > 0
then return (Just x)
else return Nothing
example1 :: Maybe String
example1 = runReader computation $ MyState "hello!" 1
example2 :: Maybe String
example2 = runReader computation $ MyState "example!" 0
En gros j'ai deux soucis : comment runReader et asks fonctionnent ?
Voilà mon raisonnement :
Ça c'est notre but : runReader (asks bar) (MyState "example!" 0) :: Int
runReader (asks bar) :: MyState -> Int
=> ok, on attends un MyState pour évaluer le tout
runReader :: Reader r a -> r -> a
=> pas ok : avec un Reader (qui contient une fonction r -> a) on sort
cette fonction et on l'applique
Question 1 : comment on applique cette fonction encapsulée ?
(asks bar) :: Reader MyState Int
=> pas ok : on attends un MyState pour sortir un Int
Question 2 : comment ce MyState est "passé" et à quoi pour que ça sorte un
Int ?
Jamais deux sans trois (même si je pense que répondre à la première
question répondra mécaniquement aux deux autres).
Question 3 : Pour computation, comment le Mystate est "passé" aux
différents asks ? ou à l'envers, comment les asks savent où et quoi
chercher ? (et comment l'appliquer)
J'ai tenté le code suivant, sans succès :
computation :: Reader MyState (Maybe String)
computation m = do
n <- asks bar m
x <- asks foo m
if n > 0
then return (Just x)
else return Nothing
Merci par avance pour vos réponses et votre patience.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-fr/attachments/20140518/aba9235a/attachment.html>
More information about the Haskell-fr
mailing list