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?
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?
:
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]
.
¿cómo es esto diferente del operador '++' que concatena listas? – dlkulp
@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'. –
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.
Tienes toda la razón. +1 – moo
¡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
Técnicamente (:) podría ser x (:) xs = xs o x (:) xs = xs ++ [x] – alternative
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
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 : []
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. –