Here’s the code:
class Problem p where
readProblem :: String -> p
solveProblem :: p -> String
readAndSolve = solveProblem . readProblem
And this is the error message GHC yields:
Ambiguous type variable `b0' in the constraint:
(Problem b0) arising from a use of `readProblem'
Probable fix: add a type signature that fixes these type variable(s)
In the second argument of `(.)', namely `readProblem'
In the expression: solveProblem . readProblem
In an equation for `readAndSolve':
readAndSolve = solveProblem . readProblem
As I understand, I have to somehow tell the compiler that the Problem instance used by solveProblem and readProblem is the same type, but I see no way to declare that. And why can’t it figure that by itself?
You need not tell the compiler that it has to be the same type, the compiler figures that out by itself. However, it can’t figure out which type to use. The canonical famous example of the problem is
If
foohad a legal type, that would beNow, how could the compiler determine a?
Your
readAndSolvewould have the type