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

Reply via email to