-- producto cartesiano pairs :: [a] -> [b] -> [(a,b)] pairs xs ys = do x <- xs y <- ys return (x,y) -- producto de todos los pares de valores de dos listas sumnd :: Num a => [a] -> [a] -> [a] sumnd xs ys = do x <- xs y <- ys return (x + y) andTable :: [Bool] andTable = do x <- [True,False] y <- [True,False] return (x && y) -- arbol de sintaxis abstracta de las expresiones data Exp = Num Int | Add Exp Exp | Div Exp Exp -- Evaluador con falla usando la monada lista en lugar de Maybe. -- Retorna la lista vacia cuando encuentra una division por cero; -- en el caso ok retorna el valor de la expresion en un lista. eval :: Exp -> [Int] eval (Num n) = return n eval (Add x y) = do a <- eval x b <- eval y return (a + b) eval (Div x y) = do a <- eval x b <- eval y a `divL` b divL :: Int -> Int -> [Int] divL a b | b == 0 = [] | otherwise = [a `div` b]