On Sun, Oct 3, 2010 at 14:10, Daniel Fischer <daniel.is.fisc...@web.de> wrote: > On Sunday 03 October 2010 10:43:24, Henning Thielemann wrote: >> On Sun, 3 Oct 2010, Ben Franksen wrote: >> > Christopher Done wrote: >> >> Consider the following program: >> >> >> >> main = putStrLn $ show $ length [undefined :: a,undefined :: b] >> >> >> >> A concrete type of the element in list doesn't need to be determined >> >> at runtime, or any time. a unifies with b, and that unifies with x in >> >> length :: [x] -> Int. >> > >> > A simpler example is >> > >> > main = print Nothing >> >> This seems to be a different example, because "GHCi -Wall" says that the >> type variable defaults to (). Thus 'Nothing' has monomorphic type at >> runtime. The difference is certainly that 'print' requires a Show >> instance, whereas Christopher's example does not require a type >> constraint. > > Yup. > > Prelude> print $ length [undefined :: a, undefined :: b] > 2 > Prelude> print $ length [undefined :: a, undefined :: Num b => b] > > <interactive>:1:32: > Warning: Defaulting the following constraint(s) to type `Integer' > `Num a' > arising from an expression type signature at > <interactive>:1:32-54 > In the expression: undefined :: (Num b) => b > In the first argument of `length', namely > `[undefined :: a, undefined :: (Num b) => b]' > In the second argument of `($)', namely > `length [undefined :: a, undefined :: (Num b) => b]' > 2 > Prelude> print $ length [undefined :: a, undefined :: Num b => c -> b] > > <interactive>:1:32: > Warning: Defaulting the following constraint(s) to type `Integer' > `Num b' > arising from an expression type signature at > <interactive>:1:32-59 > In the expression: undefined :: (Num b) => c -> b > In the first argument of `length', namely > `[undefined :: a, undefined :: (Num b) => c -> b]' > In the second argument of `($)', namely > `length [undefined :: a, undefined :: (Num b) => c -> b]' > 2 > > At runtime, a type variable has to be either unconstrained or instantiated > with a concrete type?
GHC has the 'Any' type, and the docs state: "It's also used to instantiate un-constrained type variables after type checking." [1] So I guess at least for GHC, all type variables are instantiated after type checking? Regards, Erik [1] http://www.haskell.org/ghc/docs/6.12.2/html/libraries/ghc-prim-0.2.0.0/GHC-Prim.html#t%3AAny _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe