jamin1001 wrote:
Hi, I am new at Haskell and have some basic questions.
So then how should this be done?  What if I want to do something like

data Chair = Chair {pos:: Int, color :: Int}
data Table = Table {pos:: Int, color :: Int}

Unfortunately you have to think up different names for all constructors and field names that are declared anywhere in the same module. A possible methodical way to do this is to prefix all names by the type name (with first letter lowercase of course) eg:

   data Chair = Chair {chair_pos:: Int, chair_color :: Int}
   data Table = Table {table_pos:: Int, table_color :: Int}

The reason is that when you declare a fieldname this also introduces a top level function with the same name which returns the relevant component of the record ie in the above the following top level functions are generated by the compiler:

   chair_pos :: Char -> Int
   chair_color :: Chair -> Int
   table_pos :: Table -> Int
   table_color :: Table -> Int



Also, could someone tell me why this doesn't compile in GHC:

data Test = A {a::Int} | B {a::Int, b::Int}
data Test2 = C {c::A}

(Test2 line): Not in scope: type constructor or class 'A'

(A) is a data constructor whereas you need a type here, so it should be:

   data Test2 = C {c :: Test}

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

Reply via email to