
Ketil Malde
jamin1001 wrote:
What if I want to do something like data Chair = Chair {pos:: Int, color :: Int} data Table = Table {pos:: Int, color :: Int} data Properties = Props { pos, color :: Int } data Chair = Chair Props data Table = Table Props
or:
data Chair = Chair Int Int data Table = Table Int Int
class Furniture a where pos :: a -> Int color :: a -> Int
instance Furniture Chair where pos (Chair x _) = x color (Chair _ c) = c
I'm not sure I follow what's really wanted here. Whats wrong with this:
data Colour = Black | Brown deriving (Enum, Show) data Furniture = Table {colour:: Colour, weight:: Double, height:: Double} | Chair {colour:: Colour, weight:: Double, squishiness:: Double} deriving Show
and then... ___ ___ _ / _ \ /\ /\/ __(_) / /_\// /_/ / / | | GHC Interactive, version 6.4.2, for Haskell 98. / /_\\/ __ / /___| | http://www.haskell.org/ghc/ \____/\/ /_/\____/|_| Type :? for help. Loading package base-1.0 ... linking ... done. Prelude> :l /tmp/foo.lhs Compiling Foo ( /tmp/foo.lhs, interpreted ) Ok, modules loaded: Foo. *Foo> colour $ Table {colour = Black, weight=1, height= 2} Black *Foo> colour $ Chair {colour = Brown, weight = 1, squishiness=100} Brown *Foo> The requirement is that all the "colour" fields have the same type.
The record system is somewhat wartish,
Sure, but it's not obvious to me that we're looking at one of the warts here, unless the problem is that my "Furniture" above isn't extensible in the appropriate sense or someone wants the different coulour fields to have different types (confusing, surely?). -- Jón Fairbairn Jon.Fairbairn@cl.cam.ac.uk