Hi, I noticed an annoying incompatibility between Hugs (Feb 2000) and Hugs (Feb 2001), namely the fact that when evaluating expressions of type `IO T' in Hugs (Feb 2001), the following happens: 1. when T = (), the IO action is just evaluated. 2. when T /= (), the IO action is evaluated, *and* the result is printed, but only if T is an instance of Show. 3. when T is no instance of Show, just a type error is generated. Hugs (Feb 2000) has behavior 1. in all cases for T. It is discussable which behavior is better. But I think there should at least be a flag specifying what behavior you want. And I also think that it should not be the default! I don't like the new behavior because: * The Haskell 98 report does not say anything about printing the result of the main :: IO T action. * There is a rather arbitrary distinction between T = () and T /= (). * The error in case 3. is totally unacceptable. (Especially because there are interactive systems (such as Lava) which rely on Hugs' (Feb 2000) behavior.) Take a look at the following examples, which illustrate some of the issues. Prelude> return () :: IO () Prelude> return id :: IO (Int -> Int) ERROR - Cannot find "show" function for IO result: *** Expression : return id *** Of type : IO (Int -> Int) This is really strange too: Prelude> return undefined :: IO () Prelude> return undefined :: IO Int Program error: {undefined} And here: Prelude> print "apa" >> return () :: IO () apa Prelude> print "apa" >> return id :: IO (Int -> Int) ERROR - Cannot find "show" function for IO result: *** Expression : print "apa" >> return id *** Of type : IO (Int -> Int) What do you think? /Koen. -- Koen Claessen http://www.cs.chalmers.se/~koen phone:+46-31-772 5424 mailto:koen@cs.chalmers.se ----------------------------------------------------- Chalmers University of Technology, Gothenburg, Sweden
participants (1)
-
Koen Claessen