{-# LANGUAGE TypeFamilies, TypeOperators, PatternSynonyms, TemplateHaskell #-}
-----------------------------------------------------------------------------
-- |
-- Module : Data.Metrology.SI.Units
-- Copyright : (C) 2013 Richard Eisenberg
-- License : BSD-style (see LICENSE)
-- Maintainer : Richard Eisenberg (eir@cis.upenn.edu)
-- Stability : experimental
-- Portability : non-portable
--
-- This module exports unit definitions according to the SI system of units.
-- The definitions were taken from here: .
--
-- Some additional units were added base on
-- :
-- "Non-SI units accepted for use with the SI,
-- and units based on fundamental constants".
--
-- There is one deviation from the definition at that site: To work better
-- with prefixes, the unit of mass is 'Gram'.
--
-- This module exports both American spellings and British spellings of
-- units, using pattern synonyms to get the British spellings of data
-- constructors.
-----------------------------------------------------------------------------
module Data.Metrology.SI.Units where
import Data.Metrology
import Data.Metrology.SI.Dims
import Data.Metrology.SI.Prefixes ( Kilo, Centi )
import Language.Haskell.TH ( Name )
data Meter = Meter
instance Unit Meter where
type BaseUnit Meter = Canonical
type DimOfUnit Meter = Length
instance Show Meter where
show _ = "m"
type Metre = Meter
pattern Metre = Meter
data Gram = Gram
instance Unit Gram where
type BaseUnit Gram = Canonical
type DimOfUnit Gram = Mass
instance Show Gram where
show _ = "g"
data Second = Second
instance Unit Second where
type BaseUnit Second = Canonical
type DimOfUnit Second = Time
instance Show Second where
show _ = "s"
-- | Derived SI unit
data Minute = Minute
instance Unit Minute where
type BaseUnit Minute = Second
conversionRatio _ = 60
instance Show Minute where
show _ = "min"
-- | Derived SI unit
data Hour = Hour
instance Unit Hour where
type BaseUnit Hour = Minute
conversionRatio _ = 60
instance Show Hour where
show _ = "h"
data Day = Day
instance Unit Day where
type BaseUnit Day = Hour
conversionRatio _ = 24
instance Show Day where
show _ = "d"
data Ampere = Ampere
instance Unit Ampere where
type BaseUnit Ampere = Canonical
type DimOfUnit Ampere = Current
instance Show Ampere where
show _ = "A"
data Kelvin = Kelvin
instance Unit Kelvin where
type BaseUnit Kelvin = Canonical
type DimOfUnit Kelvin = Temperature
instance Show Kelvin where
show _ = "K"
data Mole = Mole
instance Unit Mole where
type BaseUnit Mole = Canonical
type DimOfUnit Mole = AmountOfSubstance
instance Show Mole where
show _ = "mol"
data Candela = Candela
instance Unit Candela where
type BaseUnit Candela = Canonical
type DimOfUnit Candela = LuminousIntensity
instance Show Candela where
show _ = "cd"
data Hertz = Hertz
instance Unit Hertz where
type BaseUnit Hertz = Number :/ Second
instance Show Hertz where
show _ = "Hz"
-- | This is not in the SI standard, but is used widely.
data Liter = Liter
instance Unit Liter where
type BaseUnit Liter = (Centi :@ Meter) :^ Three
conversionRatio _ = 1000
instance Show Liter where
show _ = "l"
type Litre = Liter
pattern Litre = Liter
data Newton = Newton
instance Unit Newton where
type BaseUnit Newton = Gram :* Meter :/ (Second :^ Two)
conversionRatio _ = 1000
instance Show Newton where
show _ = "N"
data Pascal = Pascal
instance Unit Pascal where
type BaseUnit Pascal = Newton :/ (Meter :^ Two)
instance Show Pascal where
show _ = "Pa"
data Joule = Joule
instance Unit Joule where
type BaseUnit Joule = Newton :* Meter
instance Show Joule where
show _ = "J"
data Watt = Watt
instance Unit Watt where
type BaseUnit Watt = Joule :/ Second
instance Show Watt where
show _ = "W"
data Coulomb = Coulomb
instance Unit Coulomb where
type BaseUnit Coulomb = Ampere :* Second
instance Show Coulomb where
show _ = "C"
data Volt = Volt
instance Unit Volt where
type BaseUnit Volt = Watt :/ Ampere
instance Show Volt where
show _ = "V"
data Farad = Farad
instance Unit Farad where
type BaseUnit Farad = Coulomb :/ Volt
instance Show Farad where
show _ = "F"
data Ohm = Ohm
instance Unit Ohm where
type BaseUnit Ohm = Volt :/ Ampere
instance Show Ohm where
show _ = "Ω"
data Siemens = Siemens
instance Unit Siemens where
type BaseUnit Siemens = Ampere :/ Volt
instance Show Siemens where
show _ = "S"
data Weber = Weber
instance Unit Weber where
type BaseUnit Weber = Volt :* Second
instance Show Weber where
show _ = "Wb"
data Tesla = Tesla
instance Unit Tesla where
type BaseUnit Tesla = Weber :/ (Meter :^ Two)
instance Show Tesla where
show _ = "T"
data Henry = Henry
instance Unit Henry where
type BaseUnit Henry = Weber :/ Ampere
instance Show Henry where
show _ = "H"
data Lumen = Lumen
instance Unit Lumen where
type BaseUnit Lumen = Candela
instance Show Lumen where
show _ = "lm"
data Lux = Lux
instance Unit Lux where
type BaseUnit Lux = Lumen :/ (Meter :^ Two)
instance Show Lux where
show _ = "lx"
data Becquerel = Becquerel
instance Unit Becquerel where
type BaseUnit Becquerel = Number :/ Second
instance Show Becquerel where
show _ = "Bq"
data Gray = Gray
instance Unit Gray where
type BaseUnit Gray = (Meter :^ Two) :/ (Second :^ Two)
instance Show Gray where
show _ = "Gy"
data Sievert = Sievert
instance Unit Sievert where
type BaseUnit Sievert = (Meter :^ Two) :/ (Second :^ Two)
instance Show Sievert where
show _ = "Sv"
data Katal = Katal
instance Unit Katal where
type BaseUnit Katal = Mole :/ Second
instance Show Katal where
show _ = "kat"
-- | Derived SI unit
data Hectare = Hectare
instance Unit Hectare where
type BaseUnit Hectare = Meter :^ Two
conversionRatio _ = 10000
instance Show Hectare where
show _ = "ha"
-- | Derived SI unit
data Ton = Ton
instance Unit Ton where
type BaseUnit Ton = Kilo :@ Gram
conversionRatio _ = 1000
instance Show Ton where
show _ = "t"
type Tonne = Ton
pattern Tonne = Ton
-- | A list of the names of all unit types. Useful with
-- 'Data.Metrology.Parser.makeQuasiQuoter'.
siUnits :: [Name]
siUnits =
[ ''Meter, ''Gram, ''Second, ''Minute, ''Hour, ''Day, ''Ampere
, ''Kelvin, ''Mole, ''Candela, ''Hertz, ''Liter, ''Newton, ''Pascal
, ''Joule, ''Watt, ''Coulomb, ''Volt, ''Farad, ''Ohm, ''Siemens
, ''Weber, ''Tesla, ''Henry, ''Lumen, ''Lux, ''Becquerel, ''Gray
, ''Sievert, ''Katal, ''Hectare, ''Ton
]