usos - ¿Qué hace el operador: infix en Haskell?
operadores logicos y aritmeticos en haskell (4)
Estoy leyendo A Gentle Introduction to Haskell (que no es tan suave) y usa repetidamente el operador :
sin explicar directamente lo que hace.
Entonces, ¿qué es exactamente lo que hace?
El operador: en Haskell es el constructor de listas. Es ''contra'' lo que está antes del colon en la lista especificada después de él.
Por ejemplo, una lista de enteros se hace "consingrando" cada número en la lista vacía, por ejemplo;
La lista [1,2,3,4]
se puede construir de la siguiente manera:
-
4 : []
(consing 4 a la lista vacía) -
3 : [4]
(consing 3 en la lista que contiene 4) -
2 : [3,4]
(consing 2 en la lista que contiene 3, 4) -
1 : [2,3,4]
(consing 1 en la lista que contiene 2,3,4)
dandote;
[1,2,3,4]
Escrito completamente eso es;
1 : 2 : 3 : 4 : []
Es el constructor de tipos para listas. No es diferente de cualquier otro constructor de tipos como Just
or Left
, excepto que es infijo. Los constructores de tipos válidos pueden ser palabras que comienzan con una letra mayúscula o símbolos que comienzan con dos puntos.
Por lo tanto, puede definir constructores de infijo para sus propios tipos de datos. Por ejemplo:
data MyList a = a :> MyList a
| Empty
en el código anterior definimos un tipo llamado MyList
con dos constructores: el primero es un constructor de aspecto extraño :>
que toma un elemento y otro MyList a
; el segundo es un constructor vacío Empty
que es equivalente a []
en las listas nativas de Haskell.
Lo anterior es equivalente a:
data MyList a = Cons a (MyList a)
| Empty
Siempre podría verificar los tipos en GHCi / HUGS, ya que los primeros pasos del tutorial lo alientan a descargar GHC / HUGS.
Prelude> :t (:)
(:) :: a -> [a] -> [a]
Prelude> :t (++)
(++) :: [a] -> [a] -> [a]
De sus respectivos tipos, es bastante fácil deducir su uso.
PD: http://haskell.org/hoogle/ es increíble.
:
es el operador "prepend":
x : xs
Devuelve una lista que tiene x
como primer elemento, seguido de todos los elementos en xs
. En otros lenguajes funcionales, esto se suele llamar cons
, ya que los "contras" generan una lista recursiva mediante la aplicación repetida de una lista vacía:
1 : 2 : 3 : 4 : []
es la lista [1, 2, 3, 4]
.