
There's apparently something very basic that I don't understand about implicit parameters. In the following program, compilation fails if either of the type declarations is omitted. What is "implicit" about implicit parameters, then? {-# OPTIONS -fglasgow-exts #-} main = print f1 f1 = let ?f = \ x -> x ++ x in f2 f2 :: (?f :: String -> String) => String f2 = f3 f3 :: (?f :: String -> String) => String f3 = ?f "x"

On Thursday, April 17, 2003, at 10:35 AM, Dean Herington wrote:
There's apparently something very basic that I don't understand about implicit parameters. In the following program, compilation fails if either of the type declarations is omitted. What is "implicit" about implicit parameters, then?
{-# OPTIONS -fglasgow-exts #-}
main = print f1
f1 = let ?f = \ x -> x ++ x in f2
f2 :: (?f :: String -> String) => String f2 = f3
f3 :: (?f :: String -> String) => String f3 = ?f "x"
The detail that you are missing is that implicit parameters are subject to the "monomorphism restriction". If f2 and f3 were functions, you wouldn't get errors when omitting signatures. And yes, the decision to have them obey the monomorphism restriction is questionable, but then so is the monomorphism restriction ;-) --Jeff
participants (2)
-
Dean Herington
-
Jeffrey R Lewis