¿Qué hace el operador: infix en Haskell?

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?

: 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] .

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.

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