2009-11-08 29 views
41

Estoy leyendo A Gentle Introduction to Haskell (que no es tan suave) y utiliza repetidamente el operador : sin explicar directamente lo que hace.¿Qué hace el operador: infijo en Haskell?

Entonces, ¿qué es exactamente?

+19

No es nada suave. Si este es su primer contacto con la programación funcional, recomiendo este sitio: http://learnyouahaskell.com/ Después de leer este sitio, regrese a A Gentle Introduction. Realmente allana mucho el camino. –

Respuesta

65

: 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 generalmente se llama cons, porque “contras” tructs una lista recursiva mediante la aplicación repetida de una lista vacía:

1 : 2 : 3 : 4 : [] 

es la lista [1, 2, 3, 4].

+0

¿cómo es esto diferente del operador '++' que concatena listas? – dlkulp

+2

@dlkulp '++' concatena una lista a otra. Con ':' el primer argumento es de tipo 'a' (un tipo arbitrario) y el segundo argumento es de tipo' [a] 'que es el tipo de listas de elementos de' a'. –

21

Siempre se pueden consultar los tipos en GHCi/HUGS, ya que los primeros pasos en el 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.

+1

Tienes toda la razón. +1 – moo

+1

¡Por qué gracias señor! Si descarga hoogle, puede usarlo como una función dentro de ghc. Es muy dulce Le permite buscar por tipo o nombre de función sin tener que importar, beats: t en todos los sentidos. – codebliss

+0

Técnicamente (:) podría ser x (:) xs = xs o x (:) xs = xs ++ [x] – alternative

9

Es el constructor de tipos para las listas. No es diferente de cualquier otro tipo constructor como Just o 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.

Para que pueda definir constructores de infijo para sus propios tipos de datos. Por ejemplo:

data MyList a = a :> MyList a 
       | Empty 

en el código anterior se define un tipo llamado MyList con dos constructores: el primero es un constructor de aspecto raro :> que tiene 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 
12

The: 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, e.gramo;

La lista [1,2,3,4] se pueden construir como sigue:

  • 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)

que le da;

[1,2,3,4] 

Escrito completamente eso;

1 : 2 : 3 : 4 : [] 
Cuestiones relacionadas