Haskell: inferenza di tipo e composizione di funzioni
-
20-09-2019 - |
Domanda
Questa domanda è stato ispirato da questo risposta a un'altra domanda, che indica che è possibile rimuovere ogni occorrenza di un elemento da un elenco utilizzando una funzione definita come:
removeall = filter . (/=)
Lavorare fuori con carta e matita dai tipi di filter
, (/=)
e (.)
, la funzione ha un tipo di
removeall :: (Eq a) => a -> [a] -> [a]
che è esattamente quello che ci si aspetta in base al suo contratto. Tuttavia, con GHCi 6.6, ottengo
gchi> :t removeall
removeall :: Integer -> [Integer] -> [Integer]
a meno che non specificare il tipo in modo esplicito (nel qual caso funziona benissimo). Perché Haskell inferire un tipo così specifico per la funzione?
Soluzione
Perché Haskell inferire un tipo così specifico per la funzione?
inadempiente , dedurre un tipo più specifico da una serie di possibili. È possibile evitare questo facilmente disabilitando la restrizione monomorfismo ,
Prelude> :set -XNoMonomorphismRestriction
Prelude> let removeall = filter . (/=)
Prelude> :t removeall
removeall :: (Eq a) => a -> [a] -> [a]
Altri suggerimenti
E 'anche interessante notare che, se non si assegna un nome all'espressione, coontrollore dei tipo sembra evitare inadempiente Tipo:
Prelude> :t filter . (/=)
filter . (/=) :: (Eq a) => a -> [a] -> [a]