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?

Était-ce utile?

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]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top