When using implicit parameters I have noticed (at least for me) a rather puzzling behaviour with GHC and Hugs. Given the declarations data Env = Env {numlines :: Int, numcols :: Int} initEnv = Env {numlines = 0, numcols = 1} withEnv :: ((?env :: Env) => IO a) -> IO a withEnv io = let ?env = initEnv in io I can write code like: main = withEnv (do let lines = numlines ?env putStrLn ("Initial number of lines is " ++ (show lines))) which works as expected, but the version below main = withEnv $ do let lines = numlines ?env putStrLn ("Initial number of lines is " ++ (show lines)) is not accepted by either GHC or Hugs! Is this a bug or have stumbled into a context where it actually matters if you use '$' or explicit grouping with parentheses? Per Larsson
hi, i don't think this is a bug, and this is a situation where it matters if you use ($) or parens. the same probelm occurs when you work with polymorohism, rank-2 and above, e.g. when you use runST. the problem occurs because ($) has a monomorphic (non-overloaded) type: ($) :: (a -> b) -> (a -> b) now consider the type of runST (same example applies to your problem bellow, but with constraints) runST :: (forall s. ST s b) -> b now if we were to apply ($) to runST, we must make sure that the type of runST is at least as polymorphic as what is required by ($),i.e. (forall s. ST s b) -> b <= a -> b (type on the left should be _more_ polymorphic, i.e. has _less_ elements hence the notation) the above would be true, if 1. b <= b (which is ok) 2. a <= forall s. ST s b (which is not ok, as "a" is an arbitry _monomorphic_ type, and is not more polymorphic then a schema) hope this helps, for details on the polymorphism & subtyping you may take a look at a number of papers over the past few years. there are some on simon pj's page i forget the exact title, but it is easy to find. -iavor Per Larsson wrote:
When using implicit parameters I have noticed (at least for me) a rather puzzling behaviour with GHC and Hugs.
Given the declarations
data Env = Env {numlines :: Int, numcols :: Int}
initEnv = Env {numlines = 0, numcols = 1}
withEnv :: ((?env :: Env) => IO a) -> IO a withEnv io = let ?env = initEnv in io
I can write code like:
main = withEnv (do let lines = numlines ?env putStrLn ("Initial number of lines is " ++ (show lines)))
which works as expected, but the version below
main = withEnv $ do let lines = numlines ?env putStrLn ("Initial number of lines is " ++ (show lines))
is not accepted by either GHC or Hugs! Is this a bug or have stumbled into a context where it actually matters if you use '$' or explicit grouping with parentheses?
Per Larsson
_______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell
participants (2)
-
Iavor S. Diatchki -
Per Larsson