Difference between revisions of "Monada parserelor"

From HaskellWiki
Jump to navigation Jump to search
Line 1: Line 1:
 
Realizarea unui parser modular din parsere mai mici, fie ca ele sunt din biblioteca ParseLib sau din biblioteca Parsec nu se poate face daca nu exista o structura algebrica a combinarii lor. E la fel ca la operatiile cu numere. Acolo calculele cu numere n-ar decurge asa cum stim daca n-ar exista proprietatile algebrice ale structurilor formate de numere (grup, corp, inel - structuri formate cu numerele Reale, de exemplu).
 
Realizarea unui parser modular din parsere mai mici, fie ca ele sunt din biblioteca ParseLib sau din biblioteca Parsec nu se poate face daca nu exista o structura algebrica a combinarii lor. E la fel ca la operatiile cu numere. Acolo calculele cu numere n-ar decurge asa cum stim daca n-ar exista proprietatile algebrice ale structurilor formate de numere (grup, corp, inel - structuri formate cu numerele Reale, de exemplu).
   
Pentru a descrie monada parsererlor trebuie definiti cei doi operatori:>>= si return. Ceea ce se face ca mai jos: <br>
+
Pentru a descrie monada parsererlor trebuie definiti cei doi operatori:>>= si return. Ceea ce se face ca mai jos:
  +
<haskell>
 
 
instance Monad Parser where
<nowiki>
 
  +
return a = Parser (\cs -> [(a,cs)])
instance Monad Parser where </nowiki> <br> <nowiki>
 
return a = Parser (\cs -> [(a,cs)]) </nowiki> <br> <nowiki>
+
p >>= f = Parser (\cs -> concat [ parse (f a) cs' | (a,cs') <- parse p cs])
  +
</haskell>
p >>= f = Parser (\cs -> concat [ parse (f a) cs' | (a,cs') <- parse p cs]) </nowiki> <br>
 
 
dar nu uitati sa indentati ultimele doua randuri. Iar functia parse e definita:
 
  +
<haskell>
dar nu uitati sa indentati ultimele doua randuri. Iar functia parse e definita: <br>
 
 
parse :: Parser a -> String -> [(a,String)]
 
 
parse (parser p) = p
parse :: Parser a -> String -> [(a,String)] <br>
 
  +
</haskell>
parse (parser p) = p <br>
 
 
 
Monada este folosita la realizarea front-end-urilor de interpretoare.
 
Monada este folosita la realizarea front-end-urilor de interpretoare.
   
Aici mai sunt multe de adaugat. Pagina mai trebuie dezvoltata.
+
Aici mai sunt multe de adaugat.
  +
(ultima actualizare 31.ian.2007)
   
 
[http://www.haskell.org/haskellwiki/Ro/Haskell <= Inapoi la pagina principala Ro/Haskell ]
 
[http://www.haskell.org/haskellwiki/Ro/Haskell <= Inapoi la pagina principala Ro/Haskell ]

Revision as of 19:41, 31 January 2007

Realizarea unui parser modular din parsere mai mici, fie ca ele sunt din biblioteca ParseLib sau din biblioteca Parsec nu se poate face daca nu exista o structura algebrica a combinarii lor. E la fel ca la operatiile cu numere. Acolo calculele cu numere n-ar decurge asa cum stim daca n-ar exista proprietatile algebrice ale structurilor formate de numere (grup, corp, inel - structuri formate cu numerele Reale, de exemplu).

Pentru a descrie monada parsererlor trebuie definiti cei doi operatori:>>= si return. Ceea ce se face ca mai jos:

instance Monad Parser where  
  return a = Parser (\cs -> [(a,cs)]) 
  p >>= f  = Parser (\cs -> concat [ parse (f a) cs' | (a,cs') <- parse p cs])

dar nu uitati sa indentati ultimele doua randuri. Iar functia parse e definita:

parse :: Parser a -> String -> [(a,String)] 
parse (parser p) = p

Monada este folosita la realizarea front-end-urilor de interpretoare.

Aici mai sunt multe de adaugat. (ultima actualizare 31.ian.2007)

<= Inapoi la pagina principala Ro/Haskell