Roberto Zunino wrote:
When you type some expression such as

   \x -> x

you have to choose among an infinite number of valid types for it:

  Int -> Int
  Char -> Char
  forall a . a -> a
  forall a b . (a,b) -> (a,b)
  ...

Yet the type inference is smart enough to choose the "best" one:
   forall a. a -> a
because this is the "most general" type.

Alas, for code like yours:

  foo = \f -> (f 'J', f True)

there are infinite valid types too:

  (forall a. a -> Int) -> (Int, Int)
  (forall a. a -> Char)-> (Char, Char)
  (forall a. a -> (a,a)) -> ((Char,Char),(Bool,Bool))
  ...

and it is much less clear if a "best", most general type exists at all.

Requiring a type annotation for these not-so-common code snippets seems to be a fair compromise, at least to me.

Thank you for coming up with a clear and comprehensible answer.

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to