Re: [Haskell] Partially applied type class functions
Thanks alot for the clarifications. If I understand correctly, I ran into the monomorphism restriction because of the constraint on the type variable. The Haskell report says this in Section 4.5.5: In addition, the constrained type variables of a restricted declaration group may not be generalized in the generalization step for that group. Thus, this is perfectly fine:
f1 :: Int -> a -> String f1 i a = "" x = let g = f1 1 in (g 1, g "a")
Whereas this definition, with the additional (Show a) constraint, runs in to the monomorphism restriction:
f2 :: Show a => Int -> a -> String f2 i a = show a y = let g = f2 1 in (g 1, g "a")
No instance for (Num [Char]) arising from the literal `1' at Syntax.lhs:16:24 Probable fix: add an instance declaration for (Num [Char]) In the first argument of `g', namely `1' In the definition of `y': y = let g = f2 1 in (g 1, g "a") I think my original program was a case similar to this last one. Thanks again for the quick response. Paul On Aug 05, Roberto Zunino wrote:
Paul Govereau wrote: [snip]
instance AbSyn Constraint where subst e n constr = let sub = subst e n -- :: AbSyn a => a -> a in case constr of Zero expr -> Zero (sub expr) AndL cs -> AndL (sub cs)
It looks sort of like sub is being monomorphised -- or something?
I think you just hit the monomorphism restriction. For the details, see: http://www.haskell.org/onlinereport/decls.html - Sect. 4.5.5 http://haskell.org/hawiki/MonomorphismRestriction
Possible solutions for your specific case are:
1) add an explicit type signature for sub
let sub :: AbSyn a => a -> a sub = subst e n in ...
2) eta-expand sub, so its definition becomes a function binding
let sub c = subst e n c in ...
Regards, Roberto Zunino.
participants (1)
-
Paul Govereau