[Haskell-cafe] basic field questions

jamin1001 jamin1001 at yahoo.com
Wed Jan 24 10:31:17 EST 2007


This is what I mean by "machinery":



-- CASE 1

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

data Wooden = Wooden { grain :: Int }
data WoodenFurniture = WoodenFurniture Wooden Furniture
data WoodenTable = WoodenTable Wooden Table

class GetFurniture a where
   getFurniture :: a -> Furniture

instance GetFurniture Chair where
   getFurniture (Chair f) = f

instance GetFurniture Table where
   getFurniture (Table f) = f

instance GetFurniture WoodenFurniture where
   getFurniture (WoodenFurniture _ f) = f
   
instance GetFurniture WoodenTable where
   getFurniture (WoodenTable _ (Table f)) = f

   
class GetWooden a where
   getWooden :: a -> Wooden
   
instance GetWooden WoodenFurniture where
   getWooden (WoodenFurniture w _) = w
   
instance GetWooden WoodenTable where
   getWooden (WoodenTable w _) = w


   
-- CASE 2   

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 

instance Furniture Table where 
   pos (Table x _) = x 
   color (Table _ c) = c 




data WoodenFurniture = WoodenFurniture Int Int Int -- pos, color, grain
data WoodenTable = WoodenTable Int Int Int -- pos, color, grain

class Wooden a where
   grain :: a -> Int

instance Wooden WoodenFurniture where
   grain (WoodenFurniture _ _ g) = g

instance Furniture WoodenFurniture where
   pos (WoodenFurniture x _ _) = x 
   color (WoodenFurniture _ c _) = c

instance Wooden WoodenTable where
   grain (WoodenTable _ _ g) = g
   
instance Furniture WoodenTable where
   pos (WoodenTable x _ _) = x 
   color (WoodenTable _ c _) = c



-- CASE 3

data FurnitureProp = FurnitureProp Int Int
data Chair = Chair FurnitureProp 
data Table = Table FurnitureProp 

class Furniture a where 
   pos :: a -> Int 
   color :: a -> Int 

instance Furniture Chair where 
   pos (Chair (FurnitureProp x _)) = x 
   color (Chair (FurnitureProp _ c)) = c 

instance Furniture Table where 
   pos (Table (FurnitureProp x _)) = x 
   color (Table (FurnitureProp  _ c)) = c 


data WoodenProp = WoodenProp Int
data WoodenFurniture = WoodenFurniture FurnitureProp WoodenProp
data WoodenTable = WoodenTable Table WoodenProp

class Wooden a where
   grain :: a -> Int

instance Wooden WoodenFurniture where
   grain (WoodenFurniture _ (WoodenProp g)) = g

instance Furniture WoodenFurniture where
   pos (WoodenFurniture (FurnitureProp x _) _) = x 
   color (WoodenFurniture (FurnitureProp _ c) _) = c

instance Wooden WoodenTable where
   grain (WoodenTable _ (WoodenProp g)) = g

instance Furniture WoodenTable where
   pos (WoodenTable (Table (FurnitureProp x _)) _) = x 
   color (WoodenTable (Table (FurnitureProp _ c)) _) = c







jamin1001 wrote:
> 
> Thanks, that's much clearer now.
> 
> Following this further, it seems that this could get monotonous/verbose if
> you have more than a handful of classes.  I looked into "deriving" but it
> seems that is only useful for a set of builtin Haskell types (Eq, Ord,
> Show, etc.).
> 
> Is Template Haskell the answer to automating some of this machinery?
> 
> 
> -Jamin
> 
> 
> 
> Ketil Malde-2 wrote:
>> 
>> 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
>> 
>> instance Furniture Table where ...
>>>
>>> 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, and not a type.  Try:
>> 
>>    data Test2 = C { c :: Test }
>>> Is there a way to qualify identical field names?  What are some standard
>>> practices for dealing with this?
>>>   
>> The record system is somewhat wartish, and there have been
>> several proposals to remedy it.  I'm not sure if any consensus
>> has emerged yet.
>> 
>> -k
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe at haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>> 
>> 
> 
> 

-- 
View this message in context: http://www.nabble.com/basic-field-questions-tf3080392.html#a8562642
Sent from the Haskell - Haskell-Cafe mailing list archive at Nabble.com.



More information about the Haskell-Cafe mailing list