Kontynuując od this question, nie jestem pewien, dlaczego te dwa fragmenty kodu produkować zupełnie różne błędy:Dlaczego GHC generuje błąd ograniczenia równości, a nie błąd dopasowania typu?
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'.
Jaka jest zasada powodujące tego zachowania?
Nie jest czytelny, nawet dla kogoś, kto zna standardowy Haskell; ograniczenie równości (a ~ b)
wymaga rozszerzenia języka.
zauważyć, że jako chi wskazał, sama obecność ograniczenie powoduje błąd wiązania:
class C a
h :: C a => a -> b
h x = x
-- Could not deduce...
(Pusty ograniczeń, () => a -> b
, daje nie odpowiadać błąd wiązania.)
Dodaj dowolny kontekst do 'f', a wyzwolisz błąd ograniczenia równości: np. 'f :: Show a => a -> b' – chi
Chociaż nie jest całkowicie błędny, komunikat" Nie można wydedukować (a ~ b) "prawdopodobnie nie jest zbyt dobry w tym przypadku dla początkującego, który nie jest świadomy tego, co' ' symbol '' oznacza. Jeśli chodzi o "dlaczego" - powiedziałbym, że to błąd. – user2407038