categorias:sin_monadas
Diferencias
Muestra las diferencias entre dos versiones de la página.
Próxima revisión | Revisión previa | ||
categorias:sin_monadas [2011/11/07 21:08] – creado dfridlender | categorias:sin_monadas [2018/08/10 03:03] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 5: | Línea 5: | ||
| Div Exp Exp | | Div Exp Exp | ||
- | -- Monada | + | {- antes de Div |
- | + | eval :: Exp -> Int | |
- | {- Con la monada identidad, | + | eval (Val i) = i |
- | type T a = a | + | eval (Mas a b) = eval a + eval b |
- | + | eval (Menos a b) = eval a - eval b | |
- | t :: (a -> b) -> T a -> T b | + | eval (Por a b) = eval a * eval b |
- | t f = f | + | eval (Div a b) = eval a `div` eval b |
- | + | ||
- | eta :: a -> T a | + | |
- | eta a = a | + | |
- | + | ||
- | mu :: T (T a) -> T a | + | |
- | mu tta = tta | + | |
- | + | ||
- | eval :: Exp -> T Int | + | |
- | eval (Val i) = eta i | + | |
- | eval (Mas a b) = mu $ t (\x -> mu $ t (\y -> eta (x+y)) (eval b)) (eval a) | + | |
- | eval (Menos a b) = mu $ t (\x -> mu $ t (\y -> eta (x-y)) (eval b)) (eval a) | + | |
- | eval (Por a b) = mu $ t (\x -> mu $ t (\y -> eta (x*y)) (eval b)) (eval a) | + | |
-} | -} | ||
- | type T a = Maybe a | + | eval :: Exp -> Maybe Int |
- | + | eval (Val i) = Just i | |
- | t :: (a -> b) -> T a -> T b | + | eval (Mas a b) = case eval a of |
- | t f = \ta -> case ta of | + | Just x -> case eval b of |
- | | + | |
- | | + | |
- | + | Nothing | |
- | eta :: a -> T a | + | eval (Menos a b) = case eval a of |
- | eta = Just | + | Just x -> case eval b of |
- | + | | |
- | mu :: T (T a) -> T a | + | |
- | mu tta = case tta of | + | |
- | | + | eval (Por a b) = case eval a of |
- | | + | |
- | + | Just y -> Just (x*y) | |
- | div0 :: T a | + | Nothing |
- | div0 = Nothing | + | |
- | + | eval (Div a b) = case eval a of | |
- | eval :: Exp -> T Int | + | |
- | eval (Val i) = eta i | + | |
- | eval (Mas a b) = mu $ t (\x -> mu $ t (\y -> eta (x+y)) (eval b)) (eval a) | + | else Just (x `div` y) |
- | eval (Menos a b) = mu $ t (\x -> mu $ t (\y -> eta (x-y)) (eval b)) (eval a) | + | Nothing -> Nothing |
- | eval (Por a b) = mu $ t (\x -> mu $ t (\y -> eta (x*y)) (eval b)) (eval a) | + | |
- | eval (Div a b) = mu $ t (\x -> mu $ t (\y -> if y == 0 then div0 else eta (x `div` y)) (eval b)) (eval a) | + | |
categorias/sin_monadas.1320700081.txt.gz · Última modificación: 2018/08/10 03:03 (editor externo)