null au lieu de ==
J'ai juste commencé à apprendre Haskell centres d'intérêt. J'ai suivi learnyouahaskell.com.
J'y ai trouvé ceci:
null
vérifie si une liste est vide. Si c'
est, il retourneTrue
, sinon il
retourneFalse
. Utiliser cette fonction
au lieu dexs == []
(si vous en avez un
liste appeléexs
)
Pourquoi est-ce? Pourquoi devrions-nous utiliser null
au lieu de ==
lorsque les deux produisent le même résultat?
Grâce.
- Excellente question, BTW. La pensée n'avait pas encore traversé l'esprit. (Encore à apprendre Haskell trop)
Vous devez vous connecter pour publier un commentaire.
En comparant les listes de
==
exige des éléments comparables (notéeEq a
).Par exemple,
[sin] == []
ne fonctionne pas, puisque vous ne pouvez pas comparer des fonctions. Il peut sembler stupide, mais le type de système doit juger le type d'une expression sans regarder sa valeur.Un autre chèque serait
length xs == 0
, cela ne nécessite pas l'égalité mais ne s'arrête pas si votre liste est infinie (essayezlength [1..] == 0
). C'est pourquoi il y a une fonction dédiée.À mon avis,
null myList
lit plus naturellement quemyList == []
.Mais la raison d'être pour
null
est qu'il peut être utilisé comme une fonction. Par exemple, voici une fonction qui prend une liste de listes, et renvoie uniquement les non vide: laSans
null
, ce serait plus gênant:filter ([] /=)
.filter (/= [])
. Notez que j'ai toujours préférer la correspondance de motif sur un opérateur d'égalité (sauf dans le cas ci-dessus de l'utiliser comme une fonction)null
fonctionne avec n'importe quelle liste, tandis que(== [])
ne fonctionne qu'avec des listes deEq
.(/= [])
de plus naturel? (Enfin, sauf si vous aimez yoda-conditions. 🙂 )Un autre avantage à l'utilisation de
null
est que beaucoup d'autres contenants (p. ex. des Données.Séquence De Données.ByteString, etc.) avoir unnull
fonction. Cela rend plus facile de passer à une autre application en changeant simplement vos déclarations d'importation.