Paradigma
El joven conoce las reglas
pero el viejo las excepciones..!!
(Wilucha)
Lenguaje HASKELL Haskell Curry |
![]() |
Haskell opera:
|
El entorno HUGS:
funciona como calculadora interactiva entre el ordenador y usuario. Donde
- Al inicio el sistema muestra un prompt " Prelude>" y
espera que el usuario introduzca una expresión (Expresión inicial y presione la tecla < R E T U R N >.
- Luego, el sistema evalúa la expresión e imprime su valor.
Antes de volver a mostrar el prompt para esperar la siguiente expresión. Ejemplo:
Prelude> (2+3)*8 40Expresión evaluada por el sistema imprimiendo como resultado el valor "40".
Prelude> sum[1..10] 55Expresión de la lista de enteros que van de 1 hasta 10,
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55Se usó funciones estándar, incluidas un fichero denominado "estándar prelude", cargado al arrancar el sistema.
cuadrado (3+4) = { usa la suma } cuadrado 7 = { usa cuadrado x = x * x } 7 * 7 = { evalua multiplicación } 49Se evaluó expresiones internas antes de la aplicación de la función.
Otra posibilidad es usar la definición de función antes de evaluar argumentos.
cuadrado (3+4) = { usa cuadrado x = x * x } (3+4) * (3+4) = { evalua parte izquierda de la multiplicación } 7 * (3+4) = { evalua parte derecha de la multiplicación } 7 * 7 = { evalua la multiplicación } 49
Con :set -s deja de hacerlo. Con :set +s da otra vez esta información.
Las opciones son: s, t, g en i:
- s: Información estadística (reducciones y memoria).
- t: Tipo de cada resultado de una computación.
- g: Informe sobre Garbage collection.
- i: Constantes de enteros se manejan de forma especial.
Case, class, data, else, if, in, infix, infixl, infixr, instance, let, of, primitive, tden, type, wherePara definir una función se antepone ‘:edit’.
Se usa
- Notación para ‘lista de números entre dos valores’ y la función estándar product.
- Se guarda como nuevo.hs y se puede salir del procesador de textos.
- Para usar la nueva función, se usa el comando: Prelude> : load nuevo
- En el fichero prelude están las definiciones de las funciones estándar.
- Lo primero que hace el interprete es analizar estas funciones estándar.
- ‘Prelude’ significa ‘preludio’: este archivo se examina antes de que se puedan definir nuevas funciones.
- Finalmente, el interprete comunica que se puede teclear .
Type :? for help Prelude>
Prelude> 5+2*3 11 (5 reductions, 9 cells) Prelude>Interprete:
Nombres de funciones y parámetros empiezan en minúscula.
(minúsculas y mayúsculas son diferentes para el interprete).
Luego pueden seguir minúsculas o mayúsculas, números, el símbolo ’ y el símbolo _.
Ejemplos:
f sum x3 g’ tot_de_macht nombreLargoSímbolos que se pueden usar para formar operadores:
: # $ % & * + - = . / / < > ? ! @ ^ | + ++ && || <= == /= . // @@ -*- / / / / ... <+> :->Si a y b son tipos: a->b es función con argumento tipo a y devuelve un valor de tipo b.
La función Haskell es objeto de 1ra clase
Puede ser argumento de otra función o ser componente de estructuras de datos.
La función suma tiene el tipo:
- (+) :: Int->(Int->Int) ó Se podría escribir simplemente
- (+)::Int->Int->Int, puesto que el operador -> es asociativo a la derecha.
- (+) Función de argumento tipo Int que devuelve una función tipo: Int->Int.
sqrt la función raíz cuadrada sin la función seno log la función logaritmo natural exp la función exponente (e-elevado-a)
Funciones que convierten enteros en números reales y viceversa:
fromInteger entero a numero real round redondear un numero real a un entero
< (menor que), > (mayor que), <= (menor o igual que), >= (mayor o igual que), == (igual a) y /= (distinto de).El operador < comprueba si un numero es menor que otro numero.
Ej.1: Prelude>1<2 True Ej.2: Prelude> 2<1 False
Cada tipo tiene asociadas un conjunto de operaciones que no tienen significado para otros tipos,
Ejemplo, se puede aplicar la función (+) entre enteros pero no entre caracteres o funciones.
Una propiedad de Haskell: Es posible asociar un único tipo a toda expresión bien formada.
Esta propiedad hace que el Haskell sea un lenguaje fuertemente tipado.
Cualquier expresión que no se asociarse a un tipo es rechazada como incorrecta antes de la evaluación.
El análisis tiene dos fases:
- Análisis sintáctico: Verifica la corrección sintáctica de expresiones.
- Análisis de tipo: Verifica que las expresiones tienen un tipo correcto.
Información de tipo
Además se puede incluir información de tipo con una expresión:
A : : B
para indicar al sistema que A es de tipo B.
Por Ej.: cuadrado:: Int -> Int
Dice que la función cuadrado es del tipo "función que toma un entero y devuelve un entero".
cuadrado x = x * x
TIPOS PREDEFINIDOS
Los tipos predefinidos de Haskell son:
I - Tipos básicos, cuyos valores se toman como primitivos.
II - Tipos compuestos.
I.- TIPOS BÁSICOS DE DATOS
Deben escribirse con mayúsculas:
- Int [Int]
- Float [Float]
- Bool [Bool]
- Char [Char]
I.a - ENTEROS
Tipo "Int": Incluyen enteros positivos y negativos, como: -273, el 0 ó el 383.
El rango de los enteros utilizables está restringido.
Puede usar el tipo Integer: Enteros sin límites superior ni inferior.
prelude Incluye operadores y funciones que manipulan enteros:
- (+): Suma,
- (*): Multiplicación,
- (-): Substracción,
- (^): Potenciación, etc.
I.b - FLOTANTES
Float: Representa fraccionarios o cantidades muy largas o muy pequeñas.
Un valor numérico es un flotante si:
- Incluye un punto en su representación
- Cuando es demasiado grande para ser representado por un entero.
Notación científica: Ejemplo 1.0e3 equivale a 1000.0, mientras que 5.0e-2 equivale a 0.05.
Prelude: Incluye para flotantes: pi, exp, log, sqrt, sin, cos, tan, asin, acos, atan, etc.
I.c - CARACTERES
Char: Representa caracteres individuales. Ejemplo: 'a', '0', '.' y 'Z'.
Algunos caracteres especiales deben ser introducidos utilizando un código de escape;
cada uno de éstos comienza con el caracter de barra invertida (/) ,
seguido de uno o más caracteres que seleccionan el caracter requerido.
Ejemplo:
'//' barra invertida '/'' comilla simple '/"' comilla doble '/n' salto de línea etc.
II.- TIPOS COMPUESTOS:
Se construyen utilizando otros tipos, por ejemplo, listas, funciones y tuplas.
Puede escribirse como, Lista:
-| Vacía: mediante [].
-| No vacías:
- - Enunciando explícitamente sus elementos (por ejemplo, [1,3,10]) o
- - Poniendo un elemento al principio de otra lista con el operador (:).
Son equivalentes: [1,3,10] = 1:[3,10] = 1:(3:[10]) = 1:(3:(10:[]))
(:) Es asociativo a la derecha, así: 1:3:10:[] equivale a (1:(3:(10:[])))
Una lista cuyo primer elemento es 1, el segundo 3 y el último 10.
Prelude incluye un amplio conjunto de funciones de manejo de listas.
Por Ej.: lengtd xs devuelve el número de elementos de xs
Prelude>lengtd [1,3,10] 3
Notar que todos los elementos de una lista deben ser del mismo tipo.
La expresión ['a',2,False] no está permitida en Haskell
Los códigos de escape pueden utilizarse para cadenas. Ejemplo:
Prelude>"hola" hola
Prelude para listas pueden utilizarse con cadenas.
Ejemplo:
Prelude> lengtd "Hola" 4 Prelude> "Hola, " ++ "amigo" Hola, amigo
Ej: Si t1, t2, ..., tn son tipos y n >= 2, entonces hay un tipo de n-tuplas escrito: (t1, t2, ..., tn) Cuyos elementos pueden ser escritos como: (x1, x2, ..., xn)
donde cada x1, x2, ..., xn tiene tipos t1,t2, ..., tn respectivamente.
Ejemplo:
(1, [2], 3) :: (Int, [Int], Int) ('a', False) :: (Char, Bool) ((1,2),(3,4)) :: ((Int, Int), (Int, Int))
Existe una tupla especial con 0 elementos denominada tipo unidad y se escribe como ().
La funciones recursiva tienen sentido si:
1 - El parámetro de la llamada recursiva es mas simple.
2 - Existe una definición no recursiva para un caso base.
Una definición recursiva de la función factorial es:
fac n | n==0 = 1 | n>0 = n * fac (n-1)
Si n==0 se puede calcular el resultado directamente (sin recursión).
En el caso n > 0 existe una llamada recursiva, es decir fac (n-1).
El parámetro de esta llamada (n-1) es menor que n.
Otra manera es usando patrones:
fac 0 = 1 fac (n+1) = (n+1) * fac n
Usar patrones tiene relación con la tradición matemática del usar inducción.
Ejemplo:
Definición matemática de función potencia es usada directamente como función
x ^ 0 = 1 x ^ (n+1) = x * x^n
Las funciones sobre listas también pueden ser recursivas.
Una lista es ‘menor’ que otra si tiene menos elementos. Ejemplo:
función suma, puede ser definida de diferentes maneras.
Una definición recursiva con expresiones booleanas es:
suma lista | lista==[] = 0 (Sume lista; si esta vacía de por resultado igual a cero) | otderwise = head lista + suma (tail lista) (sino suma la cabeza de lista más la suma de la cola)También es posible obtener una version inductiva (usando patrones):
suma [] = 0 suma (cabeza:cola) = cabeza + suma cola
La versión recursiva de suma necesita funciones head y tail para distinguir las diferentes partes en lista.
x e y en f x y = x * y
En una llamada a la función se dan parámetros actuales a la función. Ejemplo:
f 17 (1+g 6)
-| 17 es el parámetro actual que corresponde a x,
-| (1+g 6) es el parámetro actual que corresponde a y.
-| Los parámetros actuales se sustituyen en lugares de parámetros formales cuando se llama a una función.
-| El resultado del anterior ejemplo es por tanto 17*(1+g 6).
Por tanto, los parámetros actuales son expresiones. Los parámetros formales eran hasta ahora solamente nombres.
Si f fuese un operador sería:
< pat1> f < pat2> = < expresion>
Donde cada una de las expresiones < pat1> < pat2> . . . < patn> es un argumento de función, denominado patrón.
El número n de argumentos se denomina paridad.
Si la función se define con más de una ecuación, se evaluan una o más argumentos de la función para determinar cuál ecuacion aplicar.
Este proceso se denomina encaje de patrones. En los ejemplos anteriores se utilizó el patrón más simple: una variable.
Ej: En la definición de factorial: fact n = product [1..n]
Si se desea evaluar la expresión "fact 6" es necesario:
- Encajar la expresión "6" con el patrón "n" y
- Luego evaluar la expresión obtenida a partir de "product [1..n]" substituyendo la "n" con el "6".
cabeza (x:_) = x cola (_:xs) = xs
Para poder referirnos al valor que está encajando, por ejemplo, en lugar de definir f como:
f (x:xs) = x:x:xs
Podría darse un nombre a x:xs mediante un patrón con nombre: f p@(x:xs) = x:p
Encajan con un valor entero mayor o igual que k.
El valor referido por la variable n es el valor encajado menos k. Ejemplo
x ^ 0 = 1 x ^ (n+1) = x * (x ^ n)
a) map
:Ejemplo: Prelude>map (1+) [1..10] [2,3,4,5,6,7,8,9,10,11]
b) filter
Devuelve los elementos de una lista que cumplen alguna condición.
Esta condición se da a la función filter en forma de una función booleana. Ejemplo:
xs = [ 1 , 2 , 3 , 4 , 5 ]
Ejemplo: Prelude> filter even [1..10] [2, 4, 6, 8, 10]
c) foldr
‘pliega’ la lista al valor colocando un operador, entre los elementos de la lista.
La función empieza por la derecha con el valor inicial (el otro parámetro).
Existe también una función foldl, que empieza por la izquierda.
foldr inserta un operador entre todos los elementos de una lista, empezando a la derecha con un valor dado:
xs = [ 1 , 2 , 3 , 4 , 5 ]
Paradigma
Hay hombres que de su ciencia
tienen la cabeza llena
Hay sabios de todas mentas
Mas digo sin ser muy ducho
Que es mejor que aprender mucho
El aprender cosas buenas..!!
José Hernández
![]() |
|
|||
![]() |
![]() |
![]() |
![]() |
|
![]() |
![]() |
![]() |
![]() |
Te espero en: wilocarpio@gmail.com
Esta page está en: www.wilocarpio.com
11/11/2018