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?

È stato utile?

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]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top