120 likes | 219 Views
Learn to interpret and define functions for algebraic and polymorphic types, recursive data structures, and abstract syntax in Haskell practice. Develop evaluation functions for expressions like addition and subtraction recursively.
E N D
Um Interpretador para Exp1 Haskell Prática 2
Tipos algébricos recursivos • Tipos de dados recursivos data Expr = Lit Int | Add Expr Expr | Sub Expr Expr • Funções definidas recursivamente eval :: Expr -> Inteval (Lit n) = neval (Add e1 e2) = (eval e1) + (eval e2)eval (Sub e1 e2) = (eval e1) - (eval e2)
Tipos algébricos polimórficos • Tipos de dados polimórficos: data Pairs t = Pair t t Pair 6 8 :: Pairs Int Pair True True :: Pairs Bool Pair [] [1,3] :: Pair [Int] • Listas data List t = Nil | Cons t (List t) • Árvores binárias data Tree t = NilT | Node t (Tree t) (Tree t)
Derivando instâncias de classes data List t = Nil | Cons t (List t) deriving (Eq,Ord,Show) data Tree t = NilT | Node t (Tree t) (Tree t) deriving (Eq,Ord,Show)
Exercícios • Defina as seguintes funções: showExpr :: Expr -> String toList :: List t -> [t] fromList :: [t] -> List t depth :: Tree t -> Int collapse :: Tree t -> [t] mapTree :: (t -> u) -> Tree t -> Tree u
Linguagem Exp1 • Inclui apenas valores constantes (literais) e operações sobre valores • Valores e operações sobre inteiros, booleanos e string são admitidos • Um programa é uma expressão • Agrupa valores em tipos e uma verificação de tipos pode ser implementada
Sintaxe Abstrata da Linguagem Exp1 Programa ::= Expressao Expressao ::= Valor | ExpUnaria | ExpBinaria Valor ::= ValorConcreto ValorConcreto ::= ValorInteiro | ValorBooleano | ValorString ExpUnaria ::= "-" Expressao | "not" Expressao | "length" Expressao ExpBinaria ::= Expressao "+" Expressao | Expressao "-" Expressao | Expressao "and" Expressao | Expressao "or" Expressao | Expressao "==" Expressao | Expressao "++" Expressao
Programas de Exp1 • Programa 1 4 • Programa 2 4 + 5
Sintaxe Abstrata de Exp1 data Programa = PROG Expressao data Expressao = LITI Int | LITB Bool | LITS String -- ExpUnaria | MINUS Expressao | NOT Expressao | LENGTH Expressao -- ExpBinaria | SOMA Expressao Expressao | SUBTRACAO Expressao Expressao | AND Expressao Expressao | OR Expressao Expressao | IGUAL Expressao Expressao | CONCATENA Expressao Expressao
Exemplos de programas Exp1 p1 = PROG (LITI 4) p2 = PROG (SOMA (LITI 4) (LITI 5))
Entidades Semânticas -- Valores -- data Valor = V1 Int | V2 Bool | V3 String -- showValor :: Valor -> String -- showValor (V1 i) = show i -- showValor (V2 b) = show b -- showValor (V3 s) = show s
Função de Interpretação interprete :: Programa -> String interprete (PROG e) = show (eval e) -- Funcao de Avaliacao de Expressoes eval :: Expressao -> Valor eval (LITI i) = i eval (LITB b) = b eval (LITS s) = s eval (NOT e) = not (eval e) eval (SOMA e1 e2) = (eval e1) + (eval e2)