Haskell: l'inférence de type et la composition de fonctions
-
20-09-2019 - |
Question
Cette question a été inspirée par cette réponse à une autre question, ce qui indique que vous pouvez supprimer toutes les occurrences d'un élément d'une liste à l'aide d'une fonction définie comme:
removeall = filter . (/=)
Travailler dehors avec un crayon et du papier à partir des types de filter
, (/=)
et (.)
, la fonction a un type de
removeall :: (Eq a) => a -> [a] -> [a]
ce qui est exactement ce que vous attendez en fonction de son contrat. Cependant, avec GHCi 6.6, je reçois
gchi> :t removeall
removeall :: Integer -> [Integer] -> [Integer]
à moins que je précise le type explicitement (dans ce cas, il fonctionne très bien). Pourquoi un tel Haskell infère type spécifique pour la fonction?
La solution
Pourquoi un tel Haskell infère type spécifique pour la fonction?
GHCi utilise défaut , de déduire un type plus spécifique d'un ensemble de possibles. Vous pouvez éviter cela facilement en désactivant la restriction de monomorphisme ,
Prelude> :set -XNoMonomorphismRestriction
Prelude> let removeall = filter . (/=)
Prelude> :t removeall
removeall :: (Eq a) => a -> [a] -> [a]
Autres conseils
Il est également intéressant de noter que si vous ne donnez pas de nom à l'expression, typechecker semble éviter le défaut de type:
Prelude> :t filter . (/=)
filter . (/=) :: (Eq a) => a -> [a] -> [a]