[Haskell-cafe] problem with instance method
Patrick Browne
patrick.browne at dit.ie
Thu Feb 3 11:09:58 CET 2011
Hi,
I am studying type classes using examples from the literature [1].
The attached code is a formalization of basic object oriented ideas. The
particular approach seems to be built on the concepts of: thing, object,
and identifier.
I have no intension to implement anything or significantly change the
code below. Rather, I am trying to understand the code as it stands.
I include a number of test runs which seem OK, but I cannot get the
*obj* function to work.
obj :: t -> i -> o t i
obj t i = Obj t i
Any hints would be appreciated.
Thanks,
Pat
[1]
ftp://ftp.geoinfo.tuwien.ac.at/frank/frank97executableAxiomaticSpecification.pdf
-- A property of a thing
data Color = Blue | Green | Red | White deriving Show
-- A thing
class Cars c where
car :: Color -> c
getColor :: c -> Color
putColor :: Color -> c -> c
paint :: Color -> c -> c
paint color car = putColor color car
data Car = Car Color deriving Show
instance Cars Car where
car c = Car c
putColor color (Car c) = Car color
getColor (Car c) = c
-- Identifiers for objects
class (Integral i) => IDs i where
startId :: i
newId :: i -> i
newId i = succ i
sameId, notSameId :: i -> i -> Bool
sameId i j = i == j
notSameId i j = not (sameId i j)
instance IDs Integer where
startId = 1
-- Objects consist of Things, with Identifiers
class (IDs i, Show i) => Objects o t i where
obj :: t -> i -> o t i
getId :: o t i -> i
getThing :: o t i -> t
doThing :: (t -> t) -> o t i -> o t i
doThing f o = obj (f (getThing o)) (getId o)
same :: o t i -> o t i -> Bool
same i j = sameId (getId i) (getId j)
isId :: i -> o t i -> Bool
isId i o = sameId i (getId o)
-- A general type of Obj
data Object t i = Obj t i deriving Show
-- A particular Car Obj, which an instance of Objects class (in Haskell
terms, not OO terms)
instance Objects Object Car Integer where
obj t i = Obj t i
getId (Obj t i) = i
getThing (Obj t i) = t
-- Create some actual Objects
x = (Obj (Car Blue) (startId::Integer))
y = (Obj (Car Green) (newId startId::Integer))
-- Some tests on car thing, seem OK
-- getColor (Car Blue)
-- putColor Green (Car Blue)
-- getColor (putColor Green (Car Blue))
-- Some tests on objects, seem OK
-- same x y
-- Obj (Car Blue) (newId startId::Integer)
-- Obj (Car Blue) (startId::Integer)
-- getThing (Obj (Car Blue) (startId::Integer))
-- getId (Obj (Car Blue) (startId::Integer))
-- isId 2 (Obj (Car Blue) (startId::Integer))
This message has been scanned for content and viruses by the DIT Information Services E-Mail Scanning Service, and is believed to be clean. http://www.dit.ie
More information about the Haskell-Cafe
mailing list