data - type constraint haskell
null en lugar de== (3)
Comparar las listas con ==
requiere que los elementos sean comparables (denotados como Eq a
).
Prelude> :t (==[])
(==[]) :: (Eq a) => [a] -> Bool
Por ejemplo, [sin] == []
no funcionará, ya que no puede comparar funciones. Puede parecer estúpido, pero el sistema de tipos debe juzgar el tipo de expresión sin mirar su valor.
Una verificación alternativa sería la length xs == 0
, esto no requiere igualdad pero no se detendrá si su lista es infinita (intente con la length [1..] == 0
). Es por eso que hay una función dedicada.
null [] = True
null _ = False
Prelude> :t null
null :: [a] -> Bool -- Notice lack of (Eq a).
Acabo de empezar a aprender Haskell por interés. Yo sigo learnyouahaskell.com .
Ahí encontré esto:
null
comprueba si una lista está vacía. Si es así, devuelveTrue
; de lo contrario, devuelveFalse
. Utilice esta función en lugar dexs == []
(si tiene una lista llamadaxs
)
¿Porqué es eso? ¿Por qué deberíamos usar null
lugar de ==
cuando ambos producen el mismo resultado?
Gracias.
En mi opinión, null myList
lee más naturalmente que myList == []
.
Pero la razón de ser para null
es que se puede usar como una función. Por ejemplo, aquí hay una función que toma una lista de listas y devuelve solo las que no están vacías:
nonemptyLists :: [[a]] -> [[a]]
nonemptyLists = filter (not . null)
Sin null
, esto sería más incómodo:
nonEmptyLists = filter ([] /=)
Otro beneficio de utilizar null
es que muchos otros contenedores (por ejemplo, Data.Sequence, Data.ByteString, etc.) también tienen una función null
. Esto hace que sea fácil cambiar a otra implementación simplemente cambiando sus instrucciones de importación.