Hi,

Your definition of 'unit' in the

instance MetricDescription LengthInCentimetres Centimetre

is not well-typed. Maybe you want to write either

unit (LengthInCentimitres 2.0) = Centimetre
-- (pattern match fail for all (LengthInCentimetres l), l /= 2.0)

or

unit l = Centimetre
-- i.e. unit = const Centimetre as in the instance for Metre

Steffen


On 01/28/2011 12:42 PM, Patrick Browne wrote:
Below is some code that is produces information about the *types* used
for measuring (e.g. metres).  The following evaluation returns 1.00
which the convert factor for metres.

convertFactorToBaseUnit (unit (LengthInMetres  7))
.
The next evaluation returns the type, Metre, of data being measured
unit (LengthInMetres  7)

Using the particular definitions below is it possible to make an
instance of MetricDescription for centimetres? I have an error on the
defintion of the unit function in the definition of the
MetricDescription  instance.
As far as possible I would like to retain the data types and class
structures.


Thanks,
Pat

class (Unit unit) =>  MetricDescription description unit | description ->
unit where
  unit :: description ->  unit
  valueInUnit :: description ->  Double
  valueInBaseUnit :: description ->  Double
  valueInBaseUnit d = (convertFactorToBaseUnit(unit d)) * (valueInUnit d)


data Metre = Metre  deriving Show
data Centimetre = Centimetre deriving Show

-- Each member of the Unit class has one operator convertFactorToBaseUnit
-- that takes a measurement unit (say metre) and returns a conversion
factor for that unit of measurement
class  Unit unit where
   convertFactorToBaseUnit :: unit ->  Double

-- An instance for metres, where the convert factor is 1.0
instance Unit Metre where
  convertFactorToBaseUnit Metre  = 1.0

-- An instance for metres, where the convert factor is 0.1
instance Unit Centimetre where
   convertFactorToBaseUnit Centimetre  = 0.1



data LengthInMetres = LengthInMetres Double  deriving Show
data LengthInCentimetres = LengthInCentimetres Double  deriving Show

-- This seems fine
instance MetricDescription LengthInMetres Metre where
  valueInUnit (LengthInMetres d) = d
  unit l = Metre


-- This is the instance that I cannot get to work
-- The unit 2 function seems to be the problem.
-- instance MetricDescription LengthInCentimetres Centimetre where
--  valueInUnit (LengthInCentimetres d) = d
--  unit 2 = Centimetre


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

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


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

Reply via email to