Zusammenfassung der Ressource
Tipos y clases de tipos en haskell
- Podemos definir nuestros propios tipos de datos
- se definen mediante la palabra reservada Data
- Al lado izquierdo se define el tipo de dato y al lado derecho su constructor
- por ejemplo
- Crear un tipo de dato "Figura"
- Podemos relacionar este tipo de dato con los "objetos" como en otros lenguajes de programación
- que este conformado por un circulo o un rectangulo
- Desde ahora un circulo o un rectangulo seran tratados como si fueran una figura
- Al tener dos tipos de dato posibles la "figura"
- puede tener funciones con parametros diferentes
- como por ejemplo una funcion para hallar el area
- tanto como para el circulo como para el
rectangulo
- Data Figura = Circulo Float Float Float | Rectangulo Float Float Float Float
- Si deseamos representar este tipo de dato debemos declararlo
- con deriving (show) en el contructor del tipo
- Lo que nos asegura poder mostrar su representacion en pantalla
- Consideremos el tipo de dato "Persona"
- Con sus distintos atributos , como nombre ,color favorito, edad
- Podemos declarar este tipo de dato , de forma lineal , especificando cada atributo de tipo primitivo y String
- Es decir , Persona = Persona String String Int
- Declarar de esta forma se presta para confuciones
- ya que los atributos no son representativos
- por ejemplo el segundo parametro podria ser color de ojos cafe
- cuando en realidad era el color favorito
cafe
- o Podemos declarar la persona con una sintaxis de registro
- En la que especificamos directamente cuales van a ser exactamente los atributos
- y sus respectivos tipos de datos , ya sean primitivos o
compuestos
- por ejemplo
- Data Persona = Persona { nombre :: String , colorFavorito:: String, edad::
Int}
- Así evitamos confusiones en cuanto a los
parametros
- Otra forma de evitar estas confuciones es con los sinonimos de tipo
- que no es mas que dar un sobrenombre a el parametro del tipo de dato
- por ejemplo
- type nombre =
String
- type colorFavorito =String
- type Persona = { nombre ,
colorFavorito}
- declarar una persona seria sencillo y muy explícito
- por ejemplo
- Persona {nombre= "Lina" , colorFavorito= "negro", edad =
20}
- Podemos declarar nuestros tipos de datos , haciendo que sus parametros puedan ser de tipos diferentes
- Como por ejemplo
- Data carro a b = carro { compañia :: a, modelo:: b}
- En este caso el parametro a , podria se un tipo de dato compuesto o
primitivo
- por ejemplo un entero , compañia = 1
- por ejemplo a podria ser un tipo de dato compañia( compuesto), que tenga
- nombre de la compañia y ubicacion
- De esta forma obtenemos flexibilidad en nuestros tipos de datos
- Esto es llamado Parámetros de
tipo
- Los tipos pueden derivar caracteristicas, comportamientos y condiciones
- por medio
de:
- deriving( derivación ),
- al final del contructor del tipo, Por ejemplo
- Data Persona = Persona {nombre:: String, edad :: Int} deriving (Eq, Show , Read)
- Como por ejemplo
- Con "Eq"
- se podrán comparar dos valores == o /=, Haskell comprobará si los constructores de tipo coinciden.
- Con "Show"
- Se permite ver el valor del tipo por consola representando el valor como un cadena
- Con "read"
- se permite convertir el tipo en una cadena
- Ord
- Es para tipos de valores que puedan ser
ordenados
- Este conjunto es llamado Clases de tipo
- Si querermos definir nuestras propias clases de tipo para alguna estructura de dato
- Debemos crear una instancia de ese tipo
- por ejemplo
- Data semaforo = Rojo | Amarillo | Verde
- instance Eq semaforo where
- Rojo == Rojo == true
- Amarillo = Amarillo == true
- Verde == verde == True
- _ == _ == False
- De esta manera tenemos nuestro propia clase de tipo y podriamos comparar dos luces
- tenemos la opcion tambien de hacer tipos de clase si - no
- que nos arrojaran un valor boleano
- por ejemplo podemos definir una instancia si -no para valores enteros
- si el numero es 0 arrojariamos falso y si es cualquier otro numero devolvemos verdadero
- Instance YesNo Int where
- yesno 0 = False
- yesno _ = True
- Probando esta instancia tendriamos algo asi
- yesno 0
- False
- Por otra parte si queremos crear una instancia que aplique una función a una lista de un tipo
- necesitariamos implementar un functor
- esto tiene el mismo enfoque que la función map
- por ejemplo
- instance Functor [ ] where fmap = map
- Probandola instancia
- fmap ( 2* ) [1.. 3]
- obtenemos
- [ 2,4, 6]
- podemos definir mas condiciones en la instancia si queremos
- pero en escencia el functor aplica una funcion de un tipo , a una lista de otro tipo ( a )
- y finalmente obtenemos una lista de un tipo diferente ( b )
- Recordemos que haskell nos permite hacer recursión en distintos marcos
- Uno de ellos es justamente cuando definimos estructuras o tipos de datos
- por ejemplo
- Data lista a = Empty | Cons a (Lista a ) deriving ( show)
- Como podemos ver el tipo de dato lista puede contener listas o un valor vacio
- Este tipo de llamada hace que haskell tenga un nivel de recursividad bastante alto
- en este caso podemos declarar de forma infija una lista
- como por ejemplo
- 20 'Cons' (5 ' Const ' Empty )
- Y obtendriamos
- 20 : ( 5 : [ ] )
- Cons en estee caso equivale a (dos puntos ) ' : '
- Podemos generar facilmente una función para implementar arboles binario de busqueda
- definiendo el arbol así
- Data Arbol a = ArbolVacio | Nodo a ( Arbol a) (Arbol a )
- Difiniendo una funcion para insertar en el
arbol
- que garantice que halla recursivdad a la hora de insertar los nodos ordenadamene
- por ejemplo cuando un nodo es menor se deberia insertar por la izquierda de la raiz
- Caso x < a = Nodo a ( Insertar x ArbolIzquierdo) ArbolDerecho