
The Haskell report describes many contructs by translation to a simpler language. This translation defines the dynamic semantics but does it define the static semantics (ie. type system)? GHC type-checks the *source* code of your Haskell program, before any desugaring or translation. Looking at source code it'd be silly to say that do e had any type (including Int), whereas do { ...; e } must have a monadic type. Try writing the typing rules for do-notation! So I think it's a bug in the Report. To fix it, you could try do e = e >>= return Which would still respect the dynamic semantics (albeit with a gratuitous extra >>=) but would now have the right static semantics Simon | -----Original Message----- | From: haskell-cafe-bounces@haskell.org [mailto:haskell-cafe-bounces@haskell.org] On Behalf Of Neil | Mitchell | Sent: 23 May 2007 18:28 | To: Haskell Café | Subject: [Haskell-cafe] Should "do 1" compile | | Hi, | | As discussed on #haskell, the following code: | | ---------------- | module Foo where | foo = do (1 :: Int) | ---------------- | | Compiles fine on Yhc, but doesn't on Hugs and GHC. | | GHC: | Couldn't match expected type `t t1' against inferred type `Int' | In the expression: (1 :: Int) | In the expression: do (1 :: Int) | In the definition of `foo': foo = do (1 :: Int) | | Hugs: | ERROR "test.hs":4 - Type error in final generator | *** Term : 1 | *** Type : Int | *** Does not match : a b | | So the question is, who is right? Where do the bugs need filing? Does | this issue need clarifying for Haskell' ? | | Thanks | | Neil | _______________________________________________ | Haskell-Cafe mailing list | Haskell-Cafe@haskell.org | http://www.haskell.org/mailman/listinfo/haskell-cafe