Steffen Schuldenzucker sschuldenzucker at uni-bonn.de
Sat Jan 29 13:18:52 CET 2011

```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
>
> _______________________________________________