Professional Documents
Culture Documents
Cuando sepas reconocer la cuatrifolia en todas sus sazones, raz, hoja y flor, por la vista y el olfato, y la semilla, podrs aprender el verdadero nombre de la planta, ya que entonces conocers su escencia, que es ms que su utilidad. Un mago de Terramar rsula K. Le Guin
Programacin
Cules son los dos aspectos fundamentales?
transformacin de informacin interaccin con el medio
Ejemplos:
calcular el promedio de notas de examen cargar datos de un paciente en su historia clnica
Preguntas
Cmo saber cundo dos programas son iguales? Ejemplo: Son equivalentes 'f(3)+f(3)' y '2*f(3)'? Siempre? Sera deseable que siempre lo fueran? Por qu?
Ejemplo
Qu imprime este programa?
Program test; var x : integer; function f(y:integer):integer; begin x := x+1; f :=x+y; end; begin x := 0; writeln(2*f(3)); end;
Valores y Expresiones
Valores
entidades (matemticas) abstractas con ciertas propiedades Ejs: el nmero dos, el valor de verdad falso.
Expresiones
cadenas de smbolos utilizadas para denotar (escribir, nombrar, referenciar) valores Ejs: 2, (1+1), False, (True && False)
Transparencia Referencial
El valor de una expresin depende slo de los elementos que la constituyen. Implica:
consideracin slo del comportamiento externo de un programa (abstraccin de detalles de ejecucin). posibilidad de demostrar propiedades usando las propiedades de las subexpresiones y mtodos de deduccin lgica.
Expresiones
Expresiones atmicas
son las expresiones ms simples llamadas tambin formas normales por abuso de lenguaje, les decimos valores
Ejs: 2, False, (3,True)
Expresiones compuestas
se 'arman' combinando subexpresiones por abuso de lenguaje, les decimos expresiones
Ejs: (1+1), (2==1), (4 - 1, True || False)
Expresiones
Puede haber expresiones incorrectas (mal formadas)
por errores sintcticos
*12 (True (2||'a') ('a',) 4 b
Funciones
Valores especiales, que representan transformacin de datos Dos formas de entender las funciones
VISIN DENOTACIONAL
una funcin es un valor matemtico que relaciona cada elemento de un conjunto (de partida) con un nico elemento de otro conjunto (de llegada).
VISIN OPERACIONAL
una funcin es un mecanismo (mtodo, procedimiento, algoritmo, programa) que dado un elemento del conjunto de partida, calcula (devuelve, retorna) el elemento correspondiente del conjunto de llegada.
Funciones
Ejemplo: doble x = x+x Visin denotacional
a cada nmero x, doble le hace corresponder otro nmero, cuyo valor es la suma de x ms x
{ (0,0), (1,2), (2,4), (3,6), ... }
Visin operacional
dado un nmero x, doble retorna ese nmero sumado consigo mismo
doble 0 0 doble 2 4 doble 1 2 doble 3 6 ...
Funciones
Cul es la operacin bsica de una funcin?
la APLICACIN a un elemento de su partida
Regla sintctica:
la aplicacin se escribe por yuxtaposicin
(f x) denota al elemento que se corresponde con x por medio de la funcin f.
Ej: (doble 2) denota al nmero 4
Funciones
Qu expresiones denotan funciones?
Nombres (variables) definidos como funciones
Ej: doble
Ecuaciones Orientadas
Dada una expresin bien formada, cmo determinamos el valor que denota?
Mediante ECUACIONES que establezcan su valor
Ecuaciones Orientadas
Expresin-a-definir = expresin-definida
e1 = e2
Visin denotacional
se define que el valor denotado por e1 (su significado) es el mismo que el valor denotado por la expresin e2
Visin operacional
para calcular el valor de una expresin que contiene a e1, se puede reemplazar e1 por e2
Programas Funcionales
Definicin de programa funcional ( script):
Conjunto de ecuaciones que definen una o ms funciones (valores).
Tipos
Toda expresin vlida denota un valor Todo valor pertenece a un conjunto Los tipos denotan conjuntos Entonces...
TODA EXPRESIN DEBE TENER UN TIPO PARA SER VLIDA
(si una expresin no tiene tipo, es invlida)
Asignacin de Tipos
Notacin:
e :: A
se lee ''la expresin e tiene tipo A'' significa que el valor denotado por e pertenece al conjunto de valores denotado por A
Ejemplos:
2 :: Int 'a' :: Char False :: Bool doble :: Int -> Int
Asignacin de tipos
Se puede deducir el tipo de una expresin a partir de su constitucin Algunas reglas
si e1 :: A y e2 :: B, entonces (e1,e2) :: (A,B) si m, n :: Int, entonces (m+n) :: Int si f :: A->B y e :: A, entonces f e :: B si d = e y e :: A, entonces d :: A
Asignacin de tipos
Ejemplo:
doble x = x+x twice (f,y) = f (f y) x+x :: Int, y entonces slo puede ser que x :: Int doble x :: Int y x :: Int, entonces slo puede ser que doble :: Int -> Int
si y :: A y f :: A -> A, entonces f y :: A, f (f y) :: A como twice (f,y) :: A, y (f,y) :: (A->A, A), slo puede ser que twice :: (A->A, A) -> A
Asignacin de tipos
Propiedades deseables
que sea automtica (que haya un programa) que le d tipo al mayor nmero posible de expresiones con sentido que no le d tipo al mayor nmero posible de expresiones sin sentido que se conserve por reduccin que los tipos sean descriptivos y razonablemente sencillos de leer
Asignacin de tipos
Inferencia de tipos
dada una expresin e, determinar si tiene tipo o no segn las reglas, y cul es ese tipo
Chequeo de tipos
dada una expresin e y un tipo A, determinar si e :: A segn las reglas, o no
Sistema de tipos
Para qu sirven los tipos?
deteccin de errores comunes documentacin especificacin rudimentaria oportunidades de optimizacin en compilacin
Es una buena prctica en programacin empezar dando el tipo del programa que se quiere escribir.
Sistema Hindley-Milner
Tipos bsicos
enteros caracteres booleanos tuplas listas funciones
Int Char Bool (A,B) [A] (A->B)
Tipos compuestos
Polimorfismo
Polimorfismo
Qu tipo tendr la siguiente funcin?
id :: ?? id x = x (id 3) :: Int (id 'a') :: Char (id True) :: Bool (id doble) :: Int -> Int
Polimorfismo paramtrico
Solucin: variables de tipo!
id :: a -> a
se lee: ''id es una funcin que dado un elemento de algn tipo a, retorna un elemento de ese mismo tipo''
Polimorfismo paramtrico
Polimorfismo
Caracterstica del sistema de tipos Dada una expresin que puede ser tipada de infinitas maneras, el sistema puede asignarle un tipo que sea ms general que todos ellos, y tal que en cada uso pueda transformarse en uno particular. Ej: id :: a -> a
particular ms general particulares
id :: Int -> Int id :: [ Int ] -> [ Int ] ... Reemplazando a por Int, por ejemplo, se obtiene un tipo
Polimorfismo paramtrico
Tienen tipo las siguientes expresiones? Cules? (Recordar: twice f = g where g x = f (f x) )
twice :: ?? (id doble) (id 3) :: ?? (id twice) (id doble, id 3) :: ?? (id id) (id doble) :: ?? id id :: ?? twice id :: ??
Qu tipo tienen las funciones? Qu similitudes observa entre suma y suma? Qu diferencias observa entre ellas?
Currificacin
Correspondencia entre cada funcin de mltiples parmetros y una de alto orden que retorna una funcin intermedia que completa el trabajo. Por cada f definida como
f :: (a,b) -> c f (x,y) = e
Currificacin - Sintaxis
Cmo escribimos una funcin currificada y su aplicacin? Considerar las siguientes definiciones
twice :: (Int->Int) -> (Int -> Int) twice1 f = g where g x = f (f x) twice2 f = \x -> f (f x) (twice3 f) x = f (f x)
Currificacin
Cmo podemos evitar usar parntesis? Convenciones de notacin La aplicacin de funciones asocia a izquierda El tipo de las funciones asocia a derecha
suma :: Int ->Int ->Int suma x y = x+y suma :: Int -> (Int ->Int) (suma x) y = x+y
Currificacin
Por abuso de lenguaje
suma :: Int ->Int ->Int suma x y = x+y
suma es una funcin que toma dos enteros y retorna otro entero.
en lugar de
suma :: Int -> (Int -> Int) (suma x) y = x+y
suma es una funcin que toma un entero y devuelve una funcin, la
cual toma un entero y devuelve otro entero.
Currificacin
Ventajas. Mayor expresividad
derive :: (Int -> Int) -> (Int -> Int) derive f x = (f (x+h) - f x) / h where h = 0.0001
Aplicacin parcial derive f ( = \x -> (f (x+h) - f x) / h ) Modularidad para tratamiento de cdigo Al inferir tipos Al transformar programas
Aplicacin Parcial
Definir un funcin que calcule la derivada nsima de una funcin
deriveN :: Int -> (Int -> Int) -> (Int -> Int) deriveN 0 f = f deriveN n f = deriveN (n-1) (derive f)
Currificacin
Decir que algo est currificado es una CUESTIN DE INTERPRETACIN
movePoint :: (Int, Int) -> (Int, Int) movePoint (x,y) = (x+1,y+1) distance :: (Int, Int) -> Int distance (x,y) = sqrt (sqr x + xqr y)
Induccin/Recursin
Para solucionar los tres problemas, usaremos INDUCCIN La induccin es un mecanismo que nos permite:
Definir conjuntos infinitos Probar propiedades sobre sus elementos Definir funciones recursivas sobre ellos, con garanta de terminacin
Induccin estructural
Una definicin inductiva de un conjunto consiste en dar condiciones de dos tipos: reglas base
que afirman que algn elemento simple pertenece a
reglas inductivas
que afirman que un elemento compuesto pertenece a siempre que sus partes pertenezcan a
y pedir que sea el menor conjunto (en sentido de la inclusin) que satisfaga todas las reglas dadas.
Principio de induccin
Sea S un conjunto inductivo, y sea P una propiedad sobre los elementos de S. Si se cumple que: para cada elemento zS tal que z cumple con una regla base, P(z) es verdadero, y para cada elemento yS construdo en una regla inductiva utilizando los elementos y1, ..., yn, si P (y1), ..., P(yn) son verdaderos entonces P( y) lo es, entonces P(x) se cumple para todos los xS.
Funciones recursivas
Sea S un conjunto inductivo, y T uno cualquiera. Una definicin recursiva de una funcin f :: S -> T es una definicin que posee la siguiente forma: por cada elemento base x, el valor de (f x) se da directamente usando valores previamente definidos por cada elemento inductivo y, con partes inductivas y1, ..., yn, el valor de (f y) se da usando valores previamente definidos y los valores (f y1), ..., (f yn).
...de ms est decir que rehusarse a explotar este poder de las matemticas concretas equivale a suicidio intelectual y tecnolgico. La moraleja de la historia es: traten a todos los elementos de un conjunto ignorndolos y trabajando con la definicin del conjunto. On the cruelty of really teaching computing science (EWD 1036) Edsger W. Dijkstra
Definicin de listas
Dado un tipo cualquiera a, definimos inductivamente al conjunto [a] con las siguientes reglas:
[ ] :: [a]
Notacin:
[ x1, x2, x3 ] = (x1 : (x2 : (x3 : [ ])))
'Detrs de cada acontecimiento se esconde un truco de espejos. Nada es, todo parece. Escndase, si quiere. Espe por las ranuras. Alguien estar preparando otra ilusin. Las diferencias entre las personas son las diferencias entre las ilusiones que perciben.' (Consejero, 121:6:33) El Fondo del Pozo Eduardo Abel Gimnez
Esquemas de funciones
Escriba las siguientes funciones sobre listas:
succl :: [ Int ] -> [ Int ] -- suma uno a cada elemento de la lista upperl :: [ Char ] -> [ Char ] -- pasa a maysculas cada caracter de la lista test :: [ Int ] -> [ Bool ] -- cambia cada nmero por un booleano que -- dice si el mismo es cero o no
Esquemas de funciones
Solucin:
succl [ ] = [ ] succl (n:ns) = (n+1) : succl ns upperl [ ] = [ ] upperl (c:cs) = upper c : upperl cs test [ ] = [ ] test (x:xs) = (x==0) : test xs
Slo las partes recuadradas son distintas podremos aprovechar ese hecho?
Esquema de map
La respuesta es s:
map :: ?? map f [ ] = [ ] map f (x:xs) = f x : map f xs
Y entonces
succl' = map (+1) upperl' = map upper test' = map (==0)
Esquemas de funciones
Escriba las siguientes funciones sobre listas:
masQueCero :: [ Int ] -> [ Int ] -- retorna la lista que slo contiene los nmeros -- mayores que cero, en el mismo orden digitos :: [ Char ] -> [ Char ] -- retorna los caracteres que son dgitos noVacias :: [ [ a ] ] -> [ [ a ] ] -- retorna slo las listas no vacas
Esquemas de funciones
Solucin:
digitos [ ] = [ ] digitos (c:cs) = if (isDigit c) then c : digitos cs else digitos cs noVacias [ ] = [ ] noVacias (xs:xss) = if (null xs) then noVacias xss else xs : noVacias xss
Slo las partes recuadradas son distintas podremos aprovechar ese hecho?
Esquema de filter
La respuesta es s:
filter :: ?? filter p [ ] = [ ] filter p (x:xs) = if (p x) then x : filter p xs else filter p xs
Y entonces
masQueCero' = filter (>0) digitos' = filter isDigit noVacias' = filter (not . null)
Esquemas de funciones
Escriba las siguientes funciones sobre listas:
sonCincos :: [ Int ] -> Bool -- dice si todos los elementos son 5 all :: [ Bool ] -> Bool -- dice si no hay ningn False en la lista concat :: [ [ a ] ] -> [ a ] -- hace el append de todas las listas en una
Esquemas de funciones
Todas estn definidas por recursin!
sonCincos [ ] = True sonCincos (n:ns) = n `check` sonCincos ns where check n b = (n==5) && b all [ ] = True all (b:bs) = b && all bs concat [ ] = [ ] concat (xs:xss) = xs ++ concat xss
Y entonces
sonCincos' = foldr check True where check n b = (n==5) && b all' = foldr (&&) True concat' = foldr (++) [ ]
Esquemas de funciones
Qu ventajas tiene trabajar con esquemas? Permite
definiciones ms concisas y modulares reutilizar cdigo demostrar propiedades generales
y entonces
append = foldr (\x h ys -> x : h ys) id = foldr (\x h -> (x:) . h) id = foldr ((.) . (:)) id
y entonces
take :: Int -> [a] -> [a] take = flip take' flip f x y = f y x
data One = One ack :: Int -> Int -> Int ack n m = u2i (ack' (i2u n) (i2u m)) where i2u n = repeat n One u2i = length ack' :: [ One ] -> [ One ] -> [ One ] ack' [] ys = One : ys ack' (x:xs) [] = ack' xs [ One ] ack' (x:xs) (y:ys) = ack' xs (ack' (x:xs) ys)
Con esto podemos ver que la funcin de Ackerman termina para todo par de nmeros naturales.
Los casos de la induccin son cero y el sucesor de un nmero, y por eso los argumentos del foldNat.
Entonces
tail = recr (error Lista vaca) (\_ xs _ -> xs) insert x = recr [x] (\y ys zs -> if x<y then (x:y:ys) else (y:zs))
i
n =1
We claim that advanced data structures and algorithms can be better taught at the functional paradigm than at the imperative one. "A Second Year Course on Data Structures Based on Functional Programming" M. Nez, P. Palao y R. Pea Functional Programming Languages in Education, LNCS 1022
Definicin de Tipos 1
Para definir un tipo de datos podemos:
establecer qu forma tendr cada elemento, y dar un mecanismo nico para inspeccionar cada elemento
Tipos Algebraicos
Cmo damos en Haskell la forma de un elemento de un tipo algebraico?
Mediante constantes llamadas constructores
nombres con maysculas no tienen asociada una regla de reduccin pueden tener argumentos
Ejemplos:
False :: Bool True :: Bool
Tipos Algebraicos
La clusula data
introduce un nuevo tipo algebraico introduce los nombres de los constructores define los tipos de los argumentos de los constructores
Ejemplos:
data Sensacion = Frio | Calor data Shape = Circle Float | Rectangle Float Float
Tipos Algebraicos
data Shape = Circle Float | Rectangle Float Float
Ejemplos de elementos:
c1 = Circle 1.0 c2 = Circle (4.0-3.0) circulo x = Circle (x+1.0) r1 = Rectangle 2.5 3.0 cuadrado x = Rectangle x x
Pattern Matching
Cul es el mecanismo nico de acceso?
Pattern matching (correspondencia de patrones) Pattern: expresin especial slo con constructores y variables sin repetir argumento en el lado izquierdo de una ecuacin Matching: operacin asociada a un pattern inspecciona el valor de una expresin puede fallar o tener xito si tiene xito, liga las variables del pattern
Pattern Matching
Ejemplo:
area :: Shape -> Float area (Circle radio) = pi * radio^2 area (Rectangle base altura) = base * altura Al evaluar (area (circulo 2.0)) primero se reduce (circulo 2.0) a (Circle 3.0)
luego se verifica cada ecuacin, para hacer el matching si lo hace, la variable toma el valor correspondiente
Tuplas
Son tipos algebraicos con sintaxis especial
fst :: (a,b) -> a fst (x,y) = x snd :: (a,b) -> b snd (x,y) = y distance :: (Float, Float) -> Float distance (x,y) = sqrt (x^2 + y^2)
Tipos Algebraicos
Pueden tener argumentos de tipo Ejemplo:
data Maybe a = Nothing | Just a
Tipos Algebraicos
Para qu se usa el tipo Maybe? Ejemplo:
buscar :: clave -> [(clave,valor)] -> valor buscar k [] = error ''La clave no se encontr'' buscar k ((k',v):kvs) = if k==k' then v else buscar k kvs
Tipos Algebraicos
Para qu se usa el tipo Maybe? Ejemplo:
lookup :: clave -> [(clave,valor)] -> Maybe valor lookup k [] = Nothing lookup k ((k',v):kvs) = if k==k' then Just v else lookup k kvs
Tipos Algebraicos
El tipo Maybe
permite expresar la posibilidad de que el resultado sea errneo, sin necesidad de usar 'casos especiales' evita el uso de hasta que el programador decida, permitiendo controlar los errores
sueldo :: Nombre -> [Empleado] -> Int sueldo nombre empleados = case (lookup nombre empleados) of Nothing -> error ''No pertenece a la empresa!'' Just s -> s
Tipos Algebraicos
Otro ejemplo:
data Either a b = Left a | Right b
Tipos Algebraicos
Para qu sirve Either? Para mantener el tipado fuerte y poder devolver elementos de distintos tipos
Ejemplo: [Left 1, Right True] :: [Either Int Bool]
Tipos Algebraicos
Por qu se llaman tipos algebraicos? Por sus caractersticas:
toda combinacin vlida de constructores y valores es elemento de un tipo algebraico (y slo ellas lo son) dos elementos de un tipo algebraico son iguales si y slo si estn construdos utilizando los mismos constructores aplicados a los mismos valores
Tipos Algebraicos
Expresividad: nmeros complejos
Toda combinacin de dos flotantes es un complejo Dos complejos son iguales si tienen las mismas partes real e imaginaria
data Complex = C Float Float realPart, imagePart :: Complex -> Float realPart (C r i) = r imagePart (C r i) = i mkPolar :: Float -> Float -> Complex mkPolar r theta = C (r * cos theta) (r * sin theta)
Tipos Algebraicos
Expresividad: nmeros racionales
No todo par de enteros es un nmero racional ( R 1 0) Hay racionales iguales con distinto numerador y denominador (R 4 2 = R 2 1)
data Racional = R Int Int numerador, denominador :: Racional -> Int numerador (R n d) = n denominador (R n d) = d
Tipos Algebraicos
Podemos clasificarlos en:
Enumerativos (Sensacion, Bool)
Slo constructores sin argumentos
Recursivos (Listas)
Utilizan el tipo definido como argumento
Ejemplos:
data N = Z | S N data BE = TT | FF | AA BE BE | NN BE
El pattern matching
provee anlisis de casos permite acceder a los elementos inductivos que forman a un elemento dado
Listas
Una definicin equivalente a la de listas
data List a = Nil | Cons a (List a)
(x:xs)
Listas
Considerar las definiciones
(++) :: [a] -> [a] -> [a] [ ] ++ ys = ys (x:xs) ++ ys = x : (xs ++ ys) sum :: [Int] -> Int sum [ ] = 0 sum (n:ns) = n + sum ns
Demostrar que para todo par xs, ys de listas finitas, vale que:
sum (xs ++ ys) = sum xs + sum ys
rboles
Un rbol es un tipo algebraico tal que al menos un elemento compuesto tiene dos componentes inductivas Se pueden usar TODAS las tcnicas vistas para tipos algebraicos y recursivos Ejemplo:
data Arbol a = Hoja a | Nodo a (Arbol a) (Arbol a)
rboles
Si representamos elementos de tipo Arbol Int mediante diagramas jerrquicos
aej = Nodo 1 (Hoja 0) (Nodo 3 (Hoja 2) (Hoja 0))
Nodo 1 Hoja 0 Nodo 3 Hoja 0
Hoja 2
rboles
Cuntas hojas tiene un (Arbol a)?
hojas :: Arbol a -> Int hojas (Hoja x) = 1 hojas (Nodo x t1 t2) = hojas t1 + hojas t2 Y cul es la altura de un (Arbol a)? altura :: Arbol a -> Int altura (Hoja x) = 0 altura (Nodo x t1 t2) = 1+ (altura t1 `max` altura t2) Puede mostrar que para todo rbol finito a, hojas a 2^(altura a)? Cmo?
rboles
Cmo reemplazamos una hoja? Ej: Cambiar los 2 en las hojas por 3.
cambiar2 :: Arbol Int -> Arbol Int cambiar2 (Hoja n) = if n==2 then Hoja 3 else Hoja n cambiar2 (Nodo n t1 t2) = Nodo n (cambiar2 t1) (cambiar2 t2)
rboles
Ms funciones sobre rboles
duplA :: Arbol Int -> Arbol Int duplA (Hoja n) = Hoja (n*2) duplA (Nodo n t1 t2) = Nodo (n*2) (duplA t1) (duplA t2) sumA :: Arbol Int -> Int sumA (Hoja n) = n sumA (Nodo n t1 t2) = n + sumA t1 + sumA t2
rboles
Recorridos de rboles
inOrder, preOrder :: Arbol a -> [ a ] inOrder (Hoja n) = [ n ] inOrder (Nodo n t1 t2) = inOrder t1 ++ [ n ] ++ inOrder t2 preOrder (Hoja n) = [ n ] preOrder (Nodo n t1 t2) = n : (preOrder t1 ++ preOrder t2)
Expresiones Aritmticas
Definimos expresiones aritmticas
constantes numricas sumas y productos de otras expresiones
data ExpA = Cte Int | Suma ExpA ExpA | Mult ExpA ExpA
Ejemplos:
2 se representa (Cte 2) (4*4) se representa (Mult (Cte 4) (Cte 4)) ((2*3)+4) se representa Suma (Mult (Cte 2) (Cte 3)) (Cte 4)
Expresiones Aritmticas
Cmo dar el significado de una ExpA?
evalEA :: ExpA -> Int evalEA (Cte n) = n evalEA (Suma e1 e2) = evalEA e1 + evalEA e2 evalEA (Mult e1 e2) = evalEA e1 * evalEA e2
Reduzca:
evalEA (Suma (Mult (Cte 2) (Cte 3)) (Cte 4)) evalEA (Mult (Cte 2) (Suma (Cte 3) (Cte 4)))
'Todo es pasajero. La verdad depende del momento. Baje los ojos. Incline la cabeza. Cuente hasta diez. Descubrir otra verdad.' (Consejero, 74:96:3) El Fondo del Pozo Eduardo Abel Gimnez
Esquemas en rboles
Esquema de map en rboles:
data Arbol a = Hoja a | Nodo a (Arbol a) (Arbol a) mapArbol :: (a -> b) -> Arbol a -> Arbol b mapArbol f (Hoja x) = Hoja (f x) mapArbol f (Nodo x t1 t2) = Nodo (f x) (mapArbol f t1) (mapArbol f t2)
Cmo definira la funcin que multiplica por 2 cada elemento de un rbol? Y la que los eleva al cuadrado?
Esquemas en rboles
Solucin:
dupArbol :: Arbol Int -> Arbol Int dupArbol = mapArbol (*2) cuadArbol :: Arbol Int -> Arbol Int cuadArbol = mapArbol (^2)
Podra definir, usando mapArbol, una funcin que aplique dos veces una funcin dada a cada elemento de un rbol? Cmo?
Esquemas en rboles
La funcin foldr expresa el patrn de recursin estructural sobre listas como funcin de alto orden Todo tipo algebraico recursivo tiene asociado un patrn de recursin estructural Existir una forma de expresar cada uno de esos patrones como una funcin de alto orden? S, pero los argumentos dependen de los casos de la definicin!
Esquemas en rboles
Ejemplo:
foldArbol :: (a->b) -> (a->b->b->b) -> Arbol a -> b foldArbol f g (Hoja x) = f x foldArbol f g (Nodo x t1 t2) = g x (foldArbol f g t1) (foldArbol f g t2)
Esquemas en rboles
Defina una funcin que sume todos los elementos de un rbol
sumArbol :: Arbol Int -> Int sumArbol = foldArbol id (\n n1 n2 -> n1 + n + n2)
Esquemas en rboles
Defina, usando foldArbol una funcin que:
cuente el nmero de elementos de un rbol
sizeArbol = foldArbol (\x->1) (\x s1 s2 -> 1+s1+s2)
Puede identificar los llamados recursivos? Por qu el primer argumento es una funcin?
rboles alfa-beta
Considere la siguiente definicin
data AB a b = Leaf b | Branch a (AB a b) (AB a b)
rboles alfa-beta
Utilizamos el esquema de recursin!
foldAB :: ?? foldAB f g (Leaf x) = f x foldAB f g (Branch y t1 t2) = g y (foldAB f g t1) (foldAB f g t2)
rboles alfa-beta
Ejemplo de uso
type AExp = AB BOp Int data BOp = Suma | Producto
rboles alfa-beta
Ejemplo de uso
type Decision s a = AB (s->Bool) a
Definamos una funcin que dada una situacin, decida qu accin tomar basada en el rbol
decide :: situation -> Decision situation action -> action decide s = foldAB id (\f a1 a2 -> if (f s) then a1 else a2) ej = Branch f1 (Leaf ''Huya'') (Branch f2 (Leaf ''Trabaje'') (Leaf ''Qudese manso'')) where f1 s = (s==Fuego) || (s==AtaqueExtraterrestre) f2 s = (s==VieneElJefe)
rboles Generales
Cmo representar un rbol con un nmero variable de hijos?
1
Ejemplo:
2 3 4
rboles Generales
Ello nos lleva a la siguiente definicin:
data AG a = GNode a [ AG a ]
rboles Generales
Definir una funcin que sume los elementos
sumAG :: AG Int -> Int
Cmo la definimos?
Usando funciones sobre listas!
sumAG (GNode x ts) = x + sum (map sumAG ts)
Y esto, es estructural?
S, pues se basa en la estructura de las listas
rboles Generales
Cmo sera el esquema de recursin?
Hay dos posibilidades
o bien se esperan las partes del esquema de listas
foldAG1 :: (a->c->b) -> (b->c->c) -> c -> AG a -> b foldAG1 g f z (GNode a ts) = g a (foldr f z (map (foldAG1 g f z) ts)))
rboles Generales
Cmo usar los foldAG?
sumAG'1 = foldAG1 (+) (+) 0 sumAG'2 = foldAG2 (+) sum
La tarea de un pensador no consista para Shevek en negar una realidad a expensas de otra, sino en integrar y relacionar. No era una tarea fcil. Los Desposedos rsula K. Le Guin
Enseen a los nios a ser preguntones para que pidiendo el por qu de lo que se les manda, se acostumbren a obedecer a la razn, no a la autoridad como los limitados, ni a la costumbre como los estpidos. Simn Rodrguez, maestro del Libertador, Simn Bolvar.
La persona que toma lo banal y lo ordinario y lo ilumina de una nueva forma, puede aterrorizar. No deseamos que nuestras ideas sean cambiadas. Nos sentimos amenazados por tales demandas. Ya conocemos las cosas importantes!, decimos. Luego aparece el Cambiador y echa a un lado todas nuestras ideas. -El Maestro Zensunni Casa Capitular: Dune Frank Herbert
Un mago slo puede dominar lo que est cerca, lo que puede nombrar con la palabra exacta. Un mago de Terramar rsula K. Le Guin
- Maestro - dijo Ged -, no soy tan vigoroso como para arrancarte el nombre por la fuerza, ni tan sabio como para sacrtelo por la astucia. Me contento pues, con quedarme aqu y aprender o servir, lo que t prefieras; a menos que consintieras, por ventura, a responder a una pregunta ma. - Hazla. - Qu nombre tienes? El Portero sonri, y le dijo el nombre. Un mago de Terramar rsula K. Le Guin