Investigacion Haskell

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 5

Como es la Evaluación de Expresiones en Haskell.

Podemos separar el cuerpo que define el comportamiento de una función en varias partes, de forma
que el código quede mucho más elegante, limpio y fácil de leer. Podemos usar el ajuste de patrones
con cualquier tipo de dato: números, caracteres, listas, tuplas, etc. Vamos a crear una función muy
trivial que compruebe si el número que le pasamos es un siete o no.

𝑙𝑢𝑐𝑘𝑦 ∶ : (𝐼𝑛𝑡𝑒𝑔𝑟𝑎𝑙 𝑎) => 𝑎 −> 𝑆𝑡𝑟𝑖𝑛𝑔


𝑙𝑢𝑐𝑘𝑦 7 = "¡ 𝐸𝑙 𝑠𝑖𝑒𝑡𝑒 𝑑𝑒 𝑙𝑎 𝑠𝑢𝑒𝑟𝑡𝑒! "
𝑙𝑢𝑐𝑘𝑦 𝑥 = "𝐿𝑜 𝑠𝑖𝑒𝑛𝑡𝑜, ¡ 𝑛𝑜 𝑒𝑠 𝑡𝑢 𝑑í𝑎 𝑑𝑒 𝑠𝑢𝑒𝑟𝑡𝑒! "

Cuando llamamos a lucky, los patrones son verificados de arriba a abajo y cuando un patrón concuerda
con el valor asociado, se utiliza el cuerpo de la función asociado. En este caso, la única forma de que
un número concuerde con el primer patrón es que dicho número sea 7. Si no lo es, se evaluara el
siguiente patrón, el cual coincide con cualquier valor y lo liga a x. También se podría haber
implementado utilizando una sentencia if. Pero, ¿qué pasaría si quisiéramos una función que nombrara
los número del 1 al 5, o "No entre uno 1 y 5" para cualquier otro número? Si no tuviéramos el ajuste
de patrones deberíamos crear un enrevesado árbol if then else. Sin embargo con él:

𝑠𝑎𝑦𝑀𝑒 ∶ : (𝐼𝑛𝑡𝑒𝑔𝑟𝑎𝑙 𝑎) => 𝑎 −> 𝑆𝑡𝑟𝑖𝑛𝑔


𝑠𝑎𝑦𝑀𝑒 1 = "¡ 𝑈𝑛𝑜! "
𝑠𝑎𝑦𝑀𝑒 2 = "¡ 𝐷𝑜𝑠! "
𝑠𝑎𝑦𝑀𝑒 3 = "¡ 𝑇𝑟𝑒𝑠! "
𝑠𝑎𝑦𝑀𝑒 4 = "¡ 𝐶𝑢𝑎𝑡𝑟𝑜! "
𝑠𝑎𝑦𝑀𝑒 5 = "¡ 𝐶𝑖𝑛𝑐𝑜! "
𝑠𝑎𝑦𝑀𝑒 𝑥 = "𝑁𝑜 𝑒𝑛𝑡𝑟𝑒 𝑢𝑛𝑜 1 𝑦 5"

Ten en cuenta que si movemos el último patrón (el más general) al inicio, siempre obtendríamos "No
entre uno 1 y 5" como respuesta, ya que el primer patrón encajaría con cualquier número y no habría
posibilidad de que se comprobaran los demás patrones.

Haskell utiliza evaluación perezosa o mediante paso de parámetros por nombre usando punteros
para compartir valores de expresiones.
𝑐𝑢𝑎𝑑𝑟𝑎𝑑𝑜 𝑥 = 𝑥 ∗ 𝑥
𝑢𝑛𝑜𝑠 = 1: 𝑢𝑛𝑜𝑠

𝑐𝑢𝑎𝑑𝑟𝑎𝑑𝑜 (2 + 1) ==> [𝑑𝑒𝑓. 𝑐𝑢𝑎𝑑𝑟𝑎𝑑𝑜]


𝑥 ∗ 𝑥 𝑠𝑖𝑒𝑛𝑑𝑜 𝑥 = (2 + 1) ==> [𝑑𝑒𝑓. (+)]
𝑥 ∗ 𝑥 𝑠𝑖𝑒𝑛𝑑𝑜 𝑥 = 3 ==> [𝑠𝑢𝑠𝑡𝑖𝑡𝑢𝑐𝑖ó𝑛]
3 ∗ 3 ==> [𝑑𝑒𝑓. (∗)]
9

ℎ𝑒𝑎𝑑 𝑢𝑛𝑜𝑠 ==> [𝑑𝑒𝑓. 𝑢𝑛𝑜𝑠]


ℎ𝑒𝑎𝑑 (1: 𝑢𝑛𝑜𝑠) ==> [𝑑𝑒𝑓. ℎ𝑒𝑎𝑑]
1
1
Investigación Haskell

Como se definen las funciones en Haskell.


Una función es una aplicación que toma uno o mas argumentos y devuelve un valor. Es una
correspondencia en la que cada elemento del dominio está relacionado con un único elemento.

Ejemplo de definición de función en Haskell:


𝑑𝑜𝑏𝑙𝑒 𝑥 = 𝑥 ∗ 𝑥

Notación matemática: 𝑓 (𝑎, 𝑏) + 𝑐𝑑


Notación Haskell: 𝑓 𝑎 𝑏 + 𝑐 ∗ 𝑑

Los paréntesis se utilizan para agrupar expresiones:


Notación matemática: 𝑓 (𝑥, 𝑔(𝑦))
Notación Haskell: 𝑓 𝑥 (𝑔 𝑦)

➢ Las definiciones se incluyen en ficheros de texto. Se acostumbra a identificar dichos ficheros


mediante el sufijo .hs
➢ Los nombres de funciones tienen que empezar por una letra en minúscula.
➢ En Haskell la disposición del texto del programa (el sangrado) delimita las definiciones
mediante la siguiente regla:
➢ Una definición acaba con el primer trozo de código con un margen izquierdo menor o igual
que el del comienzo de la definición actual.
➢ Un comentario simple comienza con -- y se extiende hasta el final de la línea.
➢ Un comentario anidado comienza con f- y termina en -g

Qué tipo de datos existen en Haskell y como se definen.


El tipo bool

Constructores: 𝑇𝑟𝑢𝑒, 𝐹𝑎𝑙𝑠𝑒

Funciones y operadores:
(&&) ∶ : 𝐵𝑜𝑜𝑙 −> 𝐵𝑜𝑜𝑙 −> 𝐵𝑜𝑜𝑙
(||) ∶ : 𝐵𝑜𝑜𝑙 −> 𝐵𝑜𝑜𝑙 −> 𝐵𝑜𝑜𝑙
𝑛𝑜𝑡 ∶ : 𝐵𝑜𝑜𝑙 −> 𝐵𝑜𝑜𝑙
𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒 ∶ : 𝐵𝑜𝑜𝑙

El tipo int

Números enteros de precisión limitada en el intervalo [−229 ; 229 ]


Funciones y operadores:
(+)(−)(∗) ∶ : 𝐼𝑛𝑡 −> 𝐼𝑛𝑡 −> 𝐼𝑛𝑡
(^) ∶ : 𝐼𝑛𝑡 −> 𝐼𝑛𝑡 −> 𝐼𝑛𝑡
2
Investigación Haskell

𝑑𝑖𝑣, 𝑚𝑜𝑑 ∶ : 𝐼𝑛𝑡 −> 𝐼𝑛𝑡 −> 𝐼𝑛𝑡


𝑎𝑏𝑠 ∶ : 𝐼𝑛𝑡 −> 𝐼𝑛𝑡
𝑠𝑖𝑔𝑛𝑢𝑚 ∶ : 𝐼𝑛𝑡 −> 𝐼𝑛𝑡
𝑛𝑒𝑔𝑎𝑡𝑒 ∶ : 𝐼𝑛𝑡 −> 𝐼𝑛𝑡
𝑒𝑣𝑒𝑛, 𝑜𝑑𝑑 ∶ : 𝐼𝑛𝑡 −> 𝐵𝑜𝑜𝑙

El tipo float

Números reales. Disponen de una cantidad fija de memoria.


Funciones y operadores:
(+)(−)(∗)(/)(∗∗) ∶ : 𝐹𝑙𝑜𝑎𝑡 −> 𝐹𝑙𝑜𝑎𝑡 −> 𝐹𝑙𝑜𝑎𝑡
(^) ∶ : 𝐹𝑙𝑜𝑎𝑡 −> 𝐼𝑛𝑡 −> 𝐹𝑙𝑜𝑎𝑡
𝑠𝑖𝑔𝑛𝑢𝑚 ∶ : 𝐹𝑙𝑜𝑎𝑡 −> 𝐹𝑙𝑜𝑎𝑡 (−1.0, 0.0, 1.0)
𝑠𝑖𝑛, 𝑎𝑠𝑖𝑛, 𝑐𝑜𝑠, 𝑎𝑐𝑜𝑠, 𝑡𝑎𝑛, 𝑎𝑡𝑎𝑛 ∶ : 𝐹𝑙𝑜𝑎𝑡 −> 𝐹𝑙𝑜𝑎𝑡
𝑎𝑡𝑎𝑛2 ∶ : 𝐹𝑙𝑜𝑎𝑡 −> 𝐹𝑙𝑜𝑎𝑡 −> 𝐹𝑙𝑜𝑎𝑡
𝑛𝑒𝑔𝑎𝑡𝑒, 𝑎𝑏𝑠, 𝑠𝑞𝑟𝑡, 𝑙𝑜𝑔, 𝑒𝑥𝑝 ∶ : 𝐹𝑙𝑜𝑎𝑡 −> 𝐹𝑙𝑜𝑎𝑡
𝑝𝑖 ∶ : 𝐹𝑙𝑜𝑎𝑡
𝑡𝑟𝑢𝑐𝑎𝑡𝑒, 𝑟𝑜𝑢𝑛𝑑, 𝑓𝑙𝑜𝑜𝑟, 𝑐𝑒𝑖𝑙𝑖𝑛𝑔 ∶ : 𝐹𝑙𝑜𝑎𝑡 −> 𝐹𝑙𝑜𝑎𝑡
𝑓𝑟𝑜𝑚𝐼𝑛𝑡 ∶ : 𝐼𝑛𝑡 −> 𝐹𝑙𝑜𝑎𝑡
𝑓𝑟𝑜𝑚𝐼𝑛𝑡𝑒𝑔𝑒𝑟 ∶ : 𝐼𝑛𝑡𝑒𝑔𝑒𝑟 −> 𝐹𝑙𝑜𝑎𝑡

El tipo integer / double

➢ Enteros/reales de precisión arbitraria


➢ Mismas operaciones que para el tipo 𝐼𝑛𝑡/𝐹𝑙𝑜𝑎𝑡

El tipo char

Caracteres: Se denotan entre comillas simples.


Los caracteres especiales van precedidos por
'\n' Salto de línea
'\t' Tabulador
'\" Comilla simple
'\"' Comilla doble
'\' El carácter n
Funciones
𝑜𝑟𝑑 ∶ : 𝐶ℎ𝑎𝑟 −> 𝐼𝑛𝑡
𝑐ℎ𝑟 ∶ : 𝐼𝑛𝑡 −> 𝐶ℎ𝑎𝑟
𝑖𝑠𝑈𝑝𝑝𝑒𝑟, 𝑖𝑠𝐿𝑜𝑤𝑒𝑟, 𝑖𝑠𝐷𝑖𝑔𝑖𝑡, 𝑖𝑠𝐴𝑙𝑓𝑎 ∶ : 𝐶ℎ𝑎𝑟 −> 𝐵𝑜𝑜𝑙
𝑡𝑜𝑈𝑝𝑝𝑒𝑟, 𝑡𝑜𝐿𝑜𝑤𝑒𝑟 ∶ : 𝐶ℎ𝑎𝑟 −> 𝐶ℎ𝑎𝑟

Declaración de tipos
3
Investigación Haskell

Se puede definir un nuevo nombre para un tipo existente mediante una declaración de tipo.
_ El nombre del tipo tiene que empezar por mayúscula.
𝑡𝑦𝑝𝑒 𝑆𝑡𝑟𝑖𝑛𝑔 = [𝐶ℎ𝑎𝑟]
_ Las declaraciones de tipo pueden tener parámetros.
𝑡𝑦𝑝𝑒 𝑃𝑎𝑟 𝑎 = (𝑎, 𝑎)
_ Las declaraciones de tipo no pueden ser recursivas.

Definiciones de tipos

Pueden definirse nuevos tipos


𝑑𝑎𝑡𝑎 𝐵𝑜𝑜𝑙 = 𝑇𝑟𝑢𝑒 | 𝐹𝑎𝑙𝑠𝑒
_ El primer elemento de los distintos valores se llama
constructor y tiene que empezar por mayúscula.
_ Los constructores pueden tener parámetros y los tipos
definidos también.
𝑑𝑎𝑡𝑎 𝐹𝑖𝑔𝑢𝑟𝑎 = 𝐶𝑖𝑟𝑐𝑢𝑙𝑜 𝐹𝑙𝑜𝑎𝑡 | 𝑅𝑒𝑐𝑡𝑎𝑛𝑔𝑢𝑙𝑜 𝐹𝑙𝑜𝑎𝑡 𝐹𝑙𝑜𝑎𝑡
𝑑𝑎𝑡𝑎 𝑀𝑎𝑦𝑏𝑒 𝑎 = 𝑁𝑜𝑡ℎ𝑖𝑛𝑔 | 𝐽𝑢𝑠𝑡 𝑎
_ Pueden ser recursivos
𝑑𝑎𝑡𝑎 𝑁𝑎𝑡𝑢𝑟𝑎𝑙 = 𝐶𝑒𝑟𝑜 | 𝑆𝑢𝑐𝑒𝑠𝑜𝑟 𝑁𝑎𝑡𝑢𝑟𝑎𝑙

Aplicaciones de Listas y Arboles.


Colección de cero o más elementos todos del mismo tipo.
_ [] lista vacía
_ Si 𝑣1, 𝑣2, . . . , 𝑣𝑛 son valores con tipo 𝑡 entonces
𝑣1: (𝑣2: (. . . : (𝑣𝑛: []). . . )) es una lista con tipo [𝑡]
_ La lista anterior también puede expresarse como:
[𝑣1, 𝑣2, . . . , 𝑣𝑛]
_ El tipo 𝑆𝑡𝑟𝑖𝑛𝑔 es equivalente al tipo [𝐶ℎ𝑎𝑟]
_ La lista de caracteres [′𝑎1′, ′𝑎2′, . . . , ′𝑎𝑚′] también puede
expresarse como: "𝑎1𝑎2. . . 𝑎𝑚"

Técnicas de programación funcional Perezosa.


Tabla donde enliste y describa las técnicas de la programación funcional perezosa y presentar tres
ejemplos con sus códigos, entornos, etc.

Técnicas de la programación funcional perezosa En el no determinismo existen varias técnicas como


son:

Técnica de Backtracking (Prolog): si una alternativa “falla”, el flujo retorna hasta la última decisión e
intenta otra.

Técnica de guardias (guards): simás de una es cierta, se escoge cualquiera de ellas.

Técnicas de aprendizaje reforzado (A-LISP): recordar decisiones exitosas y aumentar su prioridad, así
como considerar las ediciones en el contexto del estado mutable.
4
Investigación Haskell

Búsqueda no determinista

Un algoritmo no determinista Ofrece muchos posibles resultados. Emplean modelos de computación


tales como la Maquina de Turing probabilística, que noson deterministas.

Pueden simularse utilizando la lista de éxitos como, por ejemplo: Soluciones x = x, x candidatos,
validos.

Datos no deterministas

Requiere tipos de datos diferentes como sonDatalista m a = nil (cons (m a) (m (list a))

Puede representar lista perezosa no determinista

Cons [2] [NIL.cons [1]::list [] int

Los argumentos de cons representan computación no determinista, permute yIsSorted se pueden


adaptar a la lista de tipo permute y genera permutaciones perezosamente los rendimientos IsSorted
[true, false] es aplicada por encima de la lista (s).

También podría gustarte