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