[Haskell-cafe] Re: Some random newbie questions

Simon Peyton-Jones simonpj at microsoft.com
Mon Jan 10 23:45:40 EST 2005



| -----Original Message-----
| From: haskell-cafe-bounces at haskell.org
[mailto:haskell-cafe-bounces at haskell.org] On Behalf Of John
| Hughes
| Sent: 10 January 2005 09:16
| To: haskell-cafe at haskell.org
| Subject: [Haskell-cafe] Re: Some random newbie questions
| 
| I seriously considered switching frlom Hugs to GHC for my introductory
| programming class this year, but in the end stayed with Hugs because
of
| a single feature.
| 
| I'm teaching beginning programmers, and for them at least, there is an
| overwhelming volume of names to learn -- "what's that function?" is a
| question they ask themselves often, as is "what's that type?". I teach
| them that, whenever they see a name they don't recognise, they can
find
| out more about it using the :i command. This is a simple trick to
learn,
| that helps them understand points they've missed and catches
| misapprehensions.
| 
| My students also see type classes very early. I'll bet yours will too.
| Even if one is very careful to restrict the examples in lectures so as
| to avoid them (which is a bind), as soon as students try out Hugs for
| themselves, they will make mistakes that generate error messages
| referring to type classes. No problem: the question "what's that
class?"
| can ALSO be answered by :i.
| 
| Now, at the beginning students have only a very rudimentary
| understanding of classes. A class is a collection of types to them,
| nothing more. In particular, the class definition itself is of little
| use to them, since it often contains a very subtly chosen collection
of
| methods (just type :i Show, for example, which students do very
early).
| What IS useful, right from the beginning, is the list of instances.
What
| are Num types? Oh, integers and reals.  What are Show types? Oh,
pretty
| much everything. Particularly when debugging "missing instance"
errors,
| this is just the information you need.
| 
| Unfortunately, while Hugs prints the list of instances of a class in
| response to :i, GHCi does not. It only prints the class definition --
| which, for my students, contains no useful information. For that
reason
| alone, I stuck with Hugs last year.

| How about changing the behaviour of :i, Simon, so I can use GHCi
| throughout next year?

Done, some while ago.  You want GHC 6.4!  See below

Simon

Prelude> :i Show
class Show a where
  showsPrec :: Int -> a -> String -> String
  show :: a -> String
  showList :: [a] -> String -> String
-- Imported from `GHC.Show'
instance Show IOMode 	-- Imported from `GHC.IOBase'
instance Show IOException 	-- Imported from `GHC.IOBase'
instance Show IOErrorType 	-- Imported from `GHC.IOBase'
instance Show HandleType 	-- Imported from `GHC.IOBase'
instance Show Handle 	-- Imported from `GHC.IOBase'
instance Show ExitCode 	-- Imported from `GHC.IOBase'
instance Show Exception 	-- Imported from `GHC.IOBase'
instance Show BufferMode 	-- Imported from `GHC.IOBase'
instance Show AsyncException 	-- Imported from `GHC.IOBase'
instance Show ArrayException 	-- Imported from `GHC.IOBase'
instance Show ArithException 	-- Imported from `GHC.IOBase'
instance Show SeekMode 	-- Imported from `GHC.Handle'
instance Show HandlePosn 	-- Imported from `GHC.Handle'
instance Show CWchar 	-- Imported from `Foreign.C.Types'
instance Show CUShort 	-- Imported from `Foreign.C.Types'
instance Show CULong 	-- Imported from `Foreign.C.Types'
instance Show CULLong 	-- Imported from `Foreign.C.Types'
instance Show CUInt 	-- Imported from `Foreign.C.Types'
instance Show CUChar 	-- Imported from `Foreign.C.Types'
instance Show CTime 	-- Imported from `Foreign.C.Types'
instance Show CSize 	-- Imported from `Foreign.C.Types'
instance Show CSigAtomic 	-- Imported from `Foreign.C.Types'
instance Show CShort 	-- Imported from `Foreign.C.Types'
instance Show CSChar 	-- Imported from `Foreign.C.Types'
instance Show CPtrdiff 	-- Imported from `Foreign.C.Types'
instance Show CLong 	-- Imported from `Foreign.C.Types'
instance Show CLLong 	-- Imported from `Foreign.C.Types'
instance Show CLDouble 	-- Imported from `Foreign.C.Types'
instance Show CInt 	-- Imported from `Foreign.C.Types'
instance Show CFloat 	-- Imported from `Foreign.C.Types'
instance Show CDouble 	-- Imported from `Foreign.C.Types'
instance Show CClock 	-- Imported from `Foreign.C.Types'
instance Show CChar 	-- Imported from `Foreign.C.Types'
instance Show (GHC.Ptr.Ptr a) 	-- Imported from `Foreign.Ptr'
instance Show (GHC.Ptr.FunPtr a) 	-- Imported from `Foreign.Ptr'
instance Show Float 	-- Imported from `GHC.Float'
instance Show Double 	-- Imported from `GHC.Float'
instance Show Int8 	-- Imported from `GHC.Int'
instance Show Int64 	-- Imported from `GHC.Int'
instance Show Int32 	-- Imported from `GHC.Int'
instance Show Int16 	-- Imported from `GHC.Int'
instance Show Word8 	-- Imported from `GHC.Word'
instance Show Word64 	-- Imported from `GHC.Word'
instance Show Word32 	-- Imported from `GHC.Word'
instance Show Word16 	-- Imported from `GHC.Word'
instance Show Word 	-- Imported from `GHC.Word'
instance Show [a] 	-- Imported from `GHC.Show'
instance Show (a, b, c, d, e) 	-- Imported from `GHC.Show'
instance Show (a, b, c, d) 	-- Imported from `GHC.Show'
instance Show (a, b, c) 	-- Imported from `GHC.Show'
instance Show (a, b) 	-- Imported from `GHC.Show'
instance Show () 	-- Imported from `GHC.Show'
instance Show Ordering 	-- Imported from `GHC.Show'
instance Show (Maybe a) 	-- Imported from `GHC.Show'
instance Show Int 	-- Imported from `GHC.Show'
instance Show (Either a b) 	-- Imported from `GHC.Show'
instance Show Char 	-- Imported from `GHC.Show'
instance Show Bool 	-- Imported from `GHC.Show'
Prelude>


More information about the Haskell-Cafe mailing list