Nach von this question, ich bin mir nicht sicher, warum diese beiden Code-Snippets ganz andere Fehler erzeugen:Warum erzeugt GHC hier einen Gleichheitsbedingungsfehler und nicht einen Typabgleichfehler?
zu diesem Verhaltenf :: 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'.
Was die Regel Anstieg geben wird?
Es ist nicht gut lesbar, selbst für jemanden, der mit Standard-Haskell vertraut ist; Die Gleichheitsbedingung (a ~ b)
erfordert eine Sprachenerweiterung.
Beachten Sie, dass, wie chi wies darauf hin, das bloße Vorhandensein einer Beschränkung der Beschränkung Fehler auslöst:
class C a
h :: C a => a -> b
h x = x
-- Could not deduce...
(Eine leere Einschränkung, () => a -> b
, gibt dem Spiel nicht die Einschränkung Fehler.)
Fügen Sie einen beliebigen Kontext zu 'f' hinzu und Sie werden den Gleichheitsbedingungsfehler auslösen: z. 'f :: Show a => a -> b' – chi
Während nicht streng falsch, ist die Meldung" Konnte nicht ableiten (a ~ b) "in diesem Fall für einen Anfänger wahrscheinlich nicht sehr gut, der nicht weiß, was das' ~ 'Symbol bedeutet. Was "warum" angeht - ich würde sagen, es ist ein Fehler. – user2407038