Muovendo dalle this question, io non sono sicuro perché questi due frammenti di codice producono completamente diversi errori:Perché GHC produce un errore di vincolo di uguaglianza piuttosto che un errore di corrispondenza di tipo qui?
f :: a -> b
f x = x
-- Couldn't match expected type `b' with actual type `a'
-- In the expression: x
g :: Monad m => a -> m b
g x = return x
-- Could not deduce (a ~ b) from the context (Monad m)
-- In the first argument of `return', namely `x'.
Qual è la regola dando luogo a questo comportamento?
Non è molto leggibile, anche a qualcuno che ha familiarità con Haskell standard; il vincolo di uguaglianza (a ~ b)
richiede un'estensione di lingua.
noti che, come chi sottolineato, la semplice presenza di un vincolo innesca l'errore di vincolo:
class C a
h :: C a => a -> b
h x = x
-- Could not deduce...
(Un vincolo vuoto, () => a -> b
, dà la non corrispondenza dell'errore vincolo.)
Aggiungere un contesto a 'f' e si attiverà l'errore di vincolo di uguaglianza: ad es. 'f :: Mostra a => a -> b' – chi
Sebbene non sia strettamente sbagliato, il messaggio" Impossibile dedurre (a ~ b) "probabilmente non è molto buono in questo caso per un principiante che non è a conoscenza di cosa' ~ 'simbolo significa. Quindi per "perché" - direi che è un bug. – user2407038