type data constraint haskell coding-style operators typeclass

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í, devuelve True ; de lo contrario, devuelve False . Utilice esta función en lugar de xs == [] (si tiene una lista llamada xs )

¿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.