Haskell

Tutorial Haskell #6: Funciones de lista II

En "Funciones de Lista I" intencionalmente incluí solamente las funciones que no toman otra función como argumento. De las que usan otra funciòn hay dos casos muy importantes, que son el bloque de construcciòn básico de muchas funciones más complicadas.

La primera es el mapa, del que existe la forma más general fmap pero normalmente se usa simplemente map, que es la que opera sobre listas. La diferencia está en la declaración de tipo:

Prelude> :t fmap
fmap :: (Functor f) => (a -> b) -> f a -> f b
   [[Seguir leyendo]]

Tutorial Haskell #5: Funciones de Lista I

Importante: muchos de los ejemplos a continuación no finalizan nunca (intentan mostrar una lista infinita o su último elemento). Para regresar al intérprete hace falta interrumpir la ejecución presionando ^C (las teclas Ctrl y c al mismo tiempo).

Las siguientes operaciones están definidas en la biblioteca estándar de Haskell para trabajar con listas:

(++) concatena dos listas:

Prelude> [1..10]
[1,2,3,4,5,6,7,8,9,10]
Prelude> [100..110]
[100,101,102,103,104,105,106,107,108,109,110]
Prelude> [1..10] ++ [100..110]
   [[Seguir leyendo]]

Tutorial Haskell #4: Listas y enumeraciones

Cuando se quiere aplicar la misma operación a más de un valor se puede utilizar una lista para almacenar los diferentes argumentos, y también el resultado.

La forma inmediata de construir una lista es por medio de otra lista, que puede ser la lista vacía [], y el operador (:):

Prelude> :t []
[] :: [a]
Prelude> :t (:)
(:) :: a -> [a] -> [a]
Prelude> 7:[]
[7]
Prelude> 3:it
[3,7]

Una vez más, it representa al resultado inmediatamente anterior.    [[Seguir leyendo]]

Tutorial Haskell #3: Funciones lógicas

Las funciones lógicas son las que toman cualquier tipo o cantidad de argumentos y regresan un Bool. No necesitan que los argumentos sean números; solamente hace falta que el tipo de los argumentos sea instancia de la clase de tipos Ord (i.e. que exista algún orden definido para ese tipo).

Todos los números "convencionales" (eso es, todos los tipos de datos que son instancia de la clase de tipos Num) son instancia de Ord, pero no son los únicos. (Más detalles sobre clases de tipos en una entrega posterior). Por ejemplo, los caracteres también tienen orden:

     [[Seguir leyendo]]

Tutorial Haskell #2: Funciones aritméticas II

No todas las funciones aritméticas en la biblioteca base de Haskell son operadores; la mayoría no lo son. Se cuenta con las siguientes funciones.

Para cualquier número:

negate le cambia el signo al número.

Prelude> negate 7
-7
Prelude> negate (-7)
7
Prelude> negate.negate $ 7
7

abs es valor absoluto:

Prelude> abs 7
7
Prelude> abs (-7)
7

signum produce un 1 "multiplicable" con el signo del argumento.

     [[Seguir leyendo]]

Tutorial Haskell #1: Funciones aritméticas I

Haskell interpretado, por ejemplo con ghci, puede ser utilizado como calculadora. Se pueden utilizar los operadores '+', '-', '*', '/', '**', '^' y '^^'. En realidad no son operadores; son funciones que toman dos argumentos, y al ponerlos entre paréntesis se pueden emplear con la sintaxis usual.

Prelude> 2 + 3
5
Prelude> (+) 2 3
5
Prelude> (7-4)*6
18
Prelude> (*) ((-) 7 4) 6
18

El operador '/' solamente opera sobre valores fraccionarios, como se puede ver en su declaración de tipo:

     [[Seguir leyendo]]

Collatz en base 6

Un programa para operar sobre la conjetura de Collatz en base seis. No implementa la multiplicación por tres; en lugar de eso multiplica por seis y divide por dos. Un posible cambio podría ser retirar la división por dos y sustituirla por multiplicar por tres y dividir entre seis. Otra cosa que posiblemente hay que mejorar es retirar las colas de ceros que se acumulan; aunque el número de ceros puede dar información adicional.

Nótese que en ningún momento empleo números en el sentido convencional del término.

     [[Seguir leyendo]]

Generador de Primos

Código en Haskell para generar una lista infinita de primos. Relativamente rápido. Escrito al final de la parte Haskell (primer mes) del curso de Lenguajes de Programación. Copiar y pegar en un archivo .hs, cargar en hugs o ghci y correr 'primos ([ ],2)'; o hacer un corte con 'primos ([ ],2) !! 1024' para encontrar el primo número 1024 (siendo 2 el primo número cero).

-- Generador de primos. Jaime Soffer, Mayo 2007.
-------------------------------------------------------------
 
-- Raí­z cuadrada para enteros (composición de funciones)
   [[Seguir leyendo]]

Algoritmo booleano para Collatz

Para determinar si un entero positivo n finaliza empleando las reglas de la conjetura de Collatz se pueden aprovechar algunas propiedades de los números binarios; y los binarios tienen equivalencias con los booleanos. Por lo tanto parece de lo más natural intentar aplicar directamente operaciones lógicas como reglas.

El conjunto de reglas requiere tres operaciones básicas: (\ x -> x+1), (\ x -> x/2), y (\ x -> 3*x).    [[Seguir leyendo]]

Simulador de máquina de Turing en Haskell

Máquina de Turing
------------------------------

Compilar con '-package parsec'; ejemplo de compilación: ' $ ghc -package parsec -o turing turing.lhs '

El ejecutable recibe como primer argumento la descripción de una máquina de Turing, y como segundo argumento una cadena inicial para la cinta.    [[Seguir leyendo]]

Distribuir contenido
Powered by Drupal, an open source content management system