[Haskell-cafe] basic field questions

Brian Hulley brianh at metamilk.com
Wed Jan 24 06:49:19 EST 2007

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}


More information about the Haskell-Cafe mailing list