In article <[EMAIL PROTECTED]>, Ben Rudiak-Gould <[EMAIL PROTECTED]> wrote:
> The final straw was: > > Prelude> let ?x = 1 in let g = ?x in let ?x = 2 in g > 1 > Prelude> let ?x = 1 in let g () = ?x in let ?x = 2 in g () > 2 > > This is insanity. I can't possibly use a language feature which behaves in > such a non-orthogonal way. It's a type inference problem: Prelude> let ?x = 1 in let {g :: Int;g = ?x;} in let ?x = 2 in g 1 Prelude> let ?x = 1 in let {g :: (?x :: Int) => Int;g = ?x;} in let ?x = 2 in g 2 Prelude> let ?x = 1 in let {g :: () -> Int;g () = ?x;} in let ?x = 2 in g () 1 Prelude> let ?x = 1 in let {g :: (?x :: Int) => () -> Int;g () = ?x;} in let ?x = 2 in g () 2 The type of g is ambiguous, and GHC arbitrarily goes with different options in the two different cases. Ideally, GHC would complain about the ambiguity. IIRC with -fglasgow-exts turned on there are other cases when GHC infers the "wrong" type if you don't specify it. This is because with higher-order types, there isn't necessarily an inferable "most general" type for some expressions. But implicit parameters work very well if you have the type of everything specified. I use them extensively in HScheme without trouble. -- Ashley Yakeley, Seattle WA _______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell