dimensional 0.7.2 → 0.7.3
raw patch · 17 files changed
+466/−25 lines, 17 files
Files
- LICENSE +1/−1
- Numeric/NumType.lhs +24/−2
- Numeric/Units/Dimensional.lhs +18/−6
- Numeric/Units/Dimensional/CGS.lhs +17/−4
- Numeric/Units/Dimensional/Extensible.lhs +15/−2
- Numeric/Units/Dimensional/ExtensibleTest.lhs +91/−0
- Numeric/Units/Dimensional/NonSI.lhs +16/−0
- Numeric/Units/Dimensional/Prelude.hs +2/−2
- Numeric/Units/Dimensional/Quantities.lhs +15/−0
- Numeric/Units/Dimensional/QuantitiesTest.hs +88/−0
- Numeric/Units/Dimensional/SIUnits.lhs +13/−4
- Numeric/Units/Dimensional/Test.hs +35/−0
- README +10/−0
- Test.hs +12/−0
- dimensional.cabal +14/−4
- examples/GM.lhs +93/−0
- examples/README +2/−0
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2006-2007, Bjorn Buckwalter.+Copyright (c) 2006-2008, Bjorn Buckwalter. All rights reserved. Redistribution and use in source and binary forms, with or without
Numeric/NumType.lhs view
@@ -42,6 +42,18 @@ > , FlexibleInstances > #-} +> {- |+> Copyright : Copyright (C) 2006-2008 Bjorn Buckwalter+> License : BSD3+>+> Maintainer : bjorn.buckwalter@gmail.com+> Stability : Stable+> Portability: GHC only?+> +> Please refer to the literate Haskell code for documentation of both API+> and implementation.+> -}+ > module Numeric.NumType > -- Basic classes (exported versions). > ( NumType, PosType, NegType, NonZero@@ -159,8 +171,8 @@ For convenience we create show instances for the defined NumTypes. > instance Show Zero where show _ = "NumType 0"-> instance (PosTypeI n) => Show (Pos n) where show x = "NumType " ++ show (toNum x)-> instance (NegTypeI n) => Show (Neg n) where show x = "NumType " ++ show (toNum x)+> instance (PosTypeI n) => Show (Pos n) where show x = "NumType " ++ show (toNum x :: Integer)+> instance (NegTypeI n) => Show (Neg n) where show x = "NumType " ++ show (toNum x :: Integer) = Negation, incrementing and decrementing =@@ -361,15 +373,25 @@ > zero :: Zero -- ~ hZero > zero = undefined+> pos1 :: Pos1 > pos1 = incr zero+> pos2 :: Pos2 > pos2 = incr pos1+> pos3 :: Pos3 > pos3 = incr pos2+> pos4 :: Pos4 > pos4 = incr pos3+> pos5 :: Pos5 > pos5 = incr pos4+> neg1 :: Neg1 > neg1 = decr zero+> neg2 :: Neg2 > neg2 = decr neg1+> neg3 :: Neg3 > neg3 = decr neg2+> neg4 :: Neg4 > neg4 = decr neg3+> neg5 :: Neg5 > neg5 = decr neg4
Numeric/Units/Dimensional.lhs view
@@ -56,6 +56,18 @@ > , FlexibleContexts > #-} +> {- |+> Copyright : Copyright (C) 2006-2008 Bjorn Buckwalter+> License : BSD3+>+> Maintainer : bjorn.buckwalter@gmail.com+> Stability : Stable+> Portability: GHC only?+> +> Please refer to the literate Haskell code for documentation of both API+> and implementation.+> -}+ > module Numeric.Units.Dimensional > -- TODO discriminate exports, in particular Variants and Dims. > where@@ -63,7 +75,7 @@ > import Prelude > ( Show, Eq, Ord, Num, Fractional, Floating, RealFloat, Functor, fmap > , (.), flip, show, (++), undefined, otherwise, (==), String, unwords-> , map, foldr+> , map, foldr, null, Integer > ) > import qualified Prelude > import Data.List (genericLength)@@ -71,7 +83,6 @@ > import Numeric.NumType > ( NumType, NonZero, PosType, Zero, toNum, Sum > , Pos1, Pos2, pos2, Pos3, pos3-> , neg3, zero -- Only for playing around. > ) > import qualified Numeric.NumType as N (Mul, Div) @@ -296,7 +307,7 @@ > (^) :: (Fractional a, Pow d n d') > => Dimensional v d a -> n -> Dimensional v d' a-> Dimensional x ^ n = Dimensional (x Prelude.^^ toNum n)+> Dimensional x ^ n = Dimensional (x Prelude.^^ (toNum n :: Integer)) In the unlikely case someone needs to use this library with non-fractional numbers we provide the alternative power operator@@ -304,7 +315,7 @@ > (^+) :: (Num a, PosType n, Pow d n d') > => Dimensional v d a -> n -> Dimensional v d' a-> Dimensional x ^+ n = Dimensional (x Prelude.^ toNum n)+> Dimensional x ^+ n = Dimensional (x Prelude.^ (toNum n :: Integer)) A special case is that dimensionless quantities are not restricted to integer exponents. This is accommodated by the '**' operator@@ -451,7 +462,8 @@ even a requirement. > instance forall d a. (Show d, Show a) => Show (Quantity d a) where-> show (Dimensional x) = show x ++ " " ++ show (undefined :: d)+> show (Dimensional x) = show x ++ if (null unit) then "" else " " ++ unit+> where unit = show (undefined :: d) The above implementation of 'show' relies on the dimension 'd' being an instance of 'Show'. The "normalized" unit of the quantity can be inferred@@ -486,7 +498,7 @@ > | x == 0 = Nothing > | x == 1 = Just u > | otherwise = Just (u ++ "^" ++ show x)-> where x = toNum n+> where x = toNum n :: Integer = The 'prefix' function =
Numeric/Units/Dimensional/CGS.lhs view
@@ -51,16 +51,29 @@ > , FlexibleContexts > #-} +> {- |+> Copyright : Copyright (C) 2006-2008 Bjorn Buckwalter+> License : BSD3+>+> Maintainer : bjorn.buckwalter@gmail.com+> Stability : Experimental+> Portability: GHC only?+> +> Please refer to the literate Haskell code for documentation of both API+> and implementation.+> -}+ > module Numeric.Units.Dimensional.CGS where -> import Prelude ( undefined, Num, Fractional, Floating, Show, recip, Double )+> import Prelude+> ( undefined, Num, Fractional, Floating, Show, recip, Double, unwords, (.) ) > import qualified Prelude > import Numeric.Units.Dimensional hiding ( DLength, DMass, DTime, DElectricCurrent ) > import Numeric.Units.Dimensional.Quantities as SIQ > import qualified Numeric.Units.Dimensional.SIUnits as SI > import qualified Numeric.NumType as N-> import Numeric.NumType ( Neg2, Neg1, Zero, Pos, Pos1, Pos2, Pos3, NumType )-> import Numeric.NumType ( neg2, neg1, zero, pos1, pos2, pos3 )+> import Numeric.NumType ( Neg2, Neg1, Zero, Pos1, Pos2, Pos3, NumType )+> import Numeric.NumType ( neg2, pos2, pos3 ) > import Data.Maybe (catMaybes) @@ -245,7 +258,7 @@ > , NumType mh > , NumType t > ) => Show (CGSDim lh mh t) where-> show _ = (Prelude.unwords Prelude.. catMaybes)+> show _ = (unwords . catMaybes) > [ dimUnit "sqrt(cm)" (undefined :: lh) > , dimUnit "sqrt(g)" (undefined :: mh) > , dimUnit "s" (undefined :: t)
Numeric/Units/Dimensional/Extensible.lhs view
@@ -34,6 +34,18 @@ > , FlexibleInstances > #-} +> {- |+> Copyright : Copyright (C) 2006-2008 Bjorn Buckwalter+> License : BSD3+>+> Maintainer : bjorn.buckwalter@gmail.com+> Stability : Experimental+> Portability: GHC only?+> +> Please refer to the literate Haskell code for documentation of both API+> and implementation.+> -}+ > module Numeric.Units.Dimensional.Extensible ( DExt, showDExt ) where > import Numeric.Units.Dimensional ( Dim, Mul, Div, Pow, Root, dimUnit )@@ -86,8 +98,9 @@ > showDExt :: forall a n d. (NumType n, Show d) => String -> DExt a n d -> String > showDExt u _ = showHelp (dimUnit u (undefined :: n)) (show (undefined :: d)) > where-> showHelp Nothing s = s-> showHelp (Just s) s' = s ++ " " ++ s'+> showHelp Nothing s = s+> showHelp (Just u') "" = u'+> showHelp (Just u') s = u' ++ " " ++ s Using this helper function defining 'Show' instances for the dimensions with extent in apples and oranges is simple.
+ Numeric/Units/Dimensional/ExtensibleTest.lhs view
@@ -0,0 +1,91 @@+> {-# LANGUAGE EmptyDataDecls, FlexibleInstances #-}++> module Numeric.Units.Dimensional.ExtensibleTest where++> import Numeric.Units.Dimensional.Prelude+> import Numeric.Units.Dimensional.Extensible+> import Numeric.Units.Dimensional ( Dimensional (Dimensional), dimUnit )+> import Numeric.NumType ( NumType, Zero, Pos1, Neg1 )+> import Test.HUnit+> import qualified Prelude+++= Setting up the problem domain =++For testing we will use apples, oranges and peaches. We define the+type tags and show instances for each.++> data TApples -- Type tag.+> type DApples = DExt TApples Pos1 DOne+> type Apples = Quantity DApples++> data TOranges -- Type tag.+> type DOranges = DExt TApples Zero (DExt TOranges Pos1 DOne)+> type Oranges = Quantity DOranges++> data TPeaches -- Type tag.+> type DPeaches = DExt TApples Zero (DExt TOranges Zero (DExt TPeaches Pos1 DOne))+> type Peaches = Quantity DPeaches++Define show instances.++> instance (NumType n, Show d) => Show (DExt TApples n d) where+> show = showDExt "apple" ++> instance (NumType n, Show d) => Show (DExt TOranges n d) where+> show = showDExt "orange" ++> instance (NumType n, Show d) => Show (DExt TPeaches n d) where+> show = showDExt "peaches" ++Finally the base units.++> apple :: Num a => Unit DApples a+> apple = Dimensional 1+> orange :: Num a => Unit DOranges a+> orange = Dimensional 1+> peach :: Num a => Unit DPeaches a+> peach = Dimensional 1+++= Test values =++> a = 1 *~ apple+> o = 2 *~ orange+> m = 3 *~ meter+> p = 4 *~ peach+++= Stuff we expect to compile =++> f = a / o * p+> f' = a * o+> f'' = m / a++> foo1 :: Quantity (DExt TApples Pos1 (DExt TOranges Neg1 (DLength))) Double+> foo1 = a / o * m++> foo2 :: Double+> foo2 = a * m / a /~ meter++> foo3 :: Length Double+> foo3 = a * m / a + m+++Finally a HUnit test case.++> testShow = TestLabel "Test 'Show' instance" $ TestList+> [ TestCase $ show (1 *~ apple) @?= "1 apple"+> , TestCase $ show (2 *~ orange) @?= "2 orange"+> , TestCase $ show (2.0 *~ (apple / second)) @?= "2.0 apple s^-1"+> , TestCase $ show (2.0 *~ (meter ^ pos2 / peach ^ pos2)) @?= "2.0 peaches^-2 m^2"+> , TestCase $ show (2.0 *~ (apple ^ pos2 / peach ^ pos2)) @?= "2.0 apple^2 peaches^-2"+> , TestCase $ show (undefined :: DApples) @?= "apple"+> ]++Main function.++> main = do +> putStrLn "If I compiled I'm mostly OK!"+> runTestTT $ TestList [testShow]+
Numeric/Units/Dimensional/NonSI.lhs view
@@ -12,6 +12,18 @@ Any chapters, sections or tables referenced are from [1] unless otherwise specified. +> {- |+> Copyright : Copyright (C) 2006-2008 Bjorn Buckwalter+> License : BSD3+>+> Maintainer : bjorn.buckwalter@gmail.com+> Stability : Stable+> Portability: GHC only?+> +> Please refer to the literate Haskell code for documentation of both API+> and implementation.+> -}+ > module Numeric.Units.Dimensional.NonSI where > import Numeric.Units.Dimensional.Prelude@@ -64,6 +76,10 @@ Other (non inch-pound) units. +> yard, mile, nauticalMile :: (Fractional a) => Unit DLength a+> yard = prefix 3 foot+> mile = prefix 1760 yard+> nauticalMile = prefix 1852 meter > revolution :: (Floating a) => Unit DOne a > revolution = prefix 360 degree > bar :: (Fractional a) => Unit DPressure a
Numeric/Units/Dimensional/Prelude.hs view
@@ -16,7 +16,7 @@ import Numeric.NumType ( neg5, neg4, neg3, neg2, neg1, zero, pos1, pos2, pos3, pos4, pos5- ) -- ^Used in exponents.+ ) -- Used in exponents. import Prelude hiding ( (+), (-), (*), (/), (^), (**)@@ -24,4 +24,4 @@ , sin, cos, tan, asin, acos, atan, atan2 , sinh, cosh, tanh, asinh, acosh, atanh , sum- ) -- ^Hide definitions overridden by 'Numeric.Dimensional'.+ ) -- Hide definitions overridden by 'Numeric.Dimensional'.
Numeric/Units/Dimensional/Quantities.lhs view
@@ -15,6 +15,18 @@ is defined. If there are several quantity types with the same dimensionality type synonyms are provided for each quantity type. +> {- |+> Copyright : Copyright (C) 2006-2008 Bjorn Buckwalter+> License : BSD3+>+> Maintainer : bjorn.buckwalter@gmail.com+> Stability : Stable+> Portability: GHC only?+> +> Please refer to the literate Haskell code for documentation of both API+> and implementation.+> -}+ > module Numeric.Units.Dimensional.Quantities where > import Numeric.Units.Dimensional @@ -286,6 +298,9 @@ > type DMassFlow = Dim Zero Pos1 Neg1 Zero Zero Zero Zero > type MassFlow = Quantity DMassFlow++> type DGravitationalParameter = Dim Pos3 Zero Neg2 Zero Zero Zero Zero+> type GravitationalParameter = Quantity DGravitationalParameter For these we don't bother defining new type synonyms for dimensionalities. Is this rational?
+ Numeric/Units/Dimensional/QuantitiesTest.hs view
@@ -0,0 +1,88 @@+module Numeric.Units.Dimensional.QuantitiesTest where++import Numeric.Units.Dimensional.Prelude+import qualified Prelude++-- These definitions simply verify that the type synonyms are+-- consistent with the appropriate units from table 2. If the+-- definitions compile the type synonyms are good.++x1 :: Area Double+x1 = 1 *~ meter ^ pos2+x2 :: Volume Double+x2 = 1 *~ meter ^ pos3+x3 :: Velocity Double+x3 = 1 *~ (meter / second)+x4 :: Acceleration Double+x4 = 1 *~ (meter / second ^ pos2)+x5 :: WaveNumber Double+x5 = 1 *~ meter ^ neg1+x6 :: Density Double+x6 = 1 *~ (kilo gram / meter ^ pos3)+x7 :: SpecificVolume Double+x7 = 1 *~ (meter ^ pos3 / kilo gram)+x8 :: CurrentDensity Double+x8 = 1 *~ (ampere / meter ^ pos2)+x9 :: MagneticFieldStrength Double+x9 = 1 *~ (ampere / meter)+x10 :: Concentration Double+x10 = 1 *~ (mole / meter ^ pos3)+x11 :: Luminance Double+x11 = 1 *~ (candela / meter ^ pos2)++-- Tables 3a and 3b are implicitely tested by the corresponding+-- unit definitions.++-- Verification of table 4. If the definitions compile the type+-- synonyms are good.++y1 :: AngularVelocity Double+y1 = 1 *~ (radian / second)+y2 :: AngularAcceleration Double+y2 = 1 *~ (radian / second ^ pos2)+y3 :: DynamicViscosity Double+y3 = 1 *~ (pascal * second)+y4 :: MomentOfForce Double+y4 = 1 *~ (newton * meter)+y5 :: SurfaceTension Double+y5 = 1 *~ (newton / meter)+y6 :: HeatFluxDensity Double+y6 = 1 *~ (watt / meter ^ pos2)+y7 :: RadiantIntensity Double+y7 = 1 *~ (watt / steradian)+y8 :: Radiance Double+y8 = 1 *~ (watt / (meter ^ pos2 * steradian))+y9 :: HeatCapacity Double+y9 = 1 *~ (joule / kelvin)+y10 :: SpecificHeatCapacity Double+y10 = 1 *~ (joule / (kilo gram * kelvin))+y11 :: ThermalConductivity Double+y11 = 1 *~ (watt / (meter * kelvin))+y12 :: EnergyDensity Double+y12 = 1 *~ (joule / meter ^ pos3)+y13 :: ElectricFieldStrength Double+y13 = 1 *~ (volt / meter)+y14 :: ElectricChargeDensity Double+y14 = 1 *~ (coulomb / meter ^ pos3)+y15 :: ElectricFluxDensity Double+y15 = 1 *~ (coulomb / meter ^ pos2)+y16 :: Permittivity Double+y16 = 1 *~ (farad / meter)+y17 :: Permeability Double+y17 = 1 *~ (henry / meter)+y18 :: MolarEnergy Double+y18 = 1 *~ (joule / mole)+y19 :: MolarEntropy Double+y19 = 1 *~ (joule / (mole * kelvin))+y20 :: Exposure Double+y20 = 1 *~ (coulomb / kilo gram)+y21 :: AbsorbedDoseRate Double+y21 = 1 *~ (gray / second)++-- Other quantitites.+mu :: GravitationalParameter Double+mu = 398600.4418 *~ (kilo meter ^ pos3 / second ^ pos2)++-- Dummy main function.+main = Prelude.putStrLn "If I compiled I'm OK!"+
Numeric/Units/Dimensional/SIUnits.lhs view
@@ -10,14 +10,23 @@ accepted for use with the SI. Any chapters, sections or tables referenced are from [1] unless otherwise specified. +> {- |+> Copyright : Copyright (C) 2006-2008 Bjorn Buckwalter+> License : BSD3+>+> Maintainer : bjorn.buckwalter@gmail.com+> Stability : Stable+> Portability: GHC only?+> +> Please refer to the literate Haskell code for documentation of both API+> and implementation.+> -}+ > module Numeric.Units.Dimensional.SIUnits where > import Numeric.Units.Dimensional > import Numeric.Units.Dimensional.Quantities-> import Numeric.NumType -> ( Neg3, Neg2, Neg1, Zero, Pos1, Pos2, Pos3, Pos4-> , neg3, neg2, neg1, pos1, pos2, pos3-> )+> import Numeric.NumType ( neg1, neg2, pos2, pos3 ) > import Data.Time.Clock (DiffTime) > import Prelude ( (.), Num, Real (toRational), Fractional (fromRational), Floating, recip ) > import qualified Prelude
+ Numeric/Units/Dimensional/Test.hs view
@@ -0,0 +1,35 @@+{-# LANGUAGE NoMonomorphismRestriction #-}++module Numeric.Units.Dimensional.Test where++import Numeric.Units.Dimensional.Prelude+import qualified Prelude+import Test.HUnit++testPower = TestLabel "Power test" $ TestList+ [ TestCase $ (9 *~ one) @=? (3 *~ one) ^ pos2+ , TestCase $ (1 *~ one) @=? (12.1231 *~ one) ^ zero+ , TestCase $ (0.25 *~ one) @=? (2 *~ one) ^ neg2+ ]++testDimensionless = TestLabel "Dimensionless test" $ TestList+ [ TestCase $ (3 Prelude.** 2) *~ one @=? (3 *~ one) ** (2 *~ one)+ ]++testShow = TestLabel "Test 'Show' instance" $ TestList+ [ TestCase $ show (1 *~ one) @?= "1"+ , TestCase $ show (2 *~ meter) @?= "2 m"+ , TestCase $ show (2.0 *~ (meter / second)) @?= "2.0 m s^-1"+ , TestCase $ show (2.0 *~ (meter ^ pos2 / second ^ pos2)) @?= "2.0 m^2 s^-2"+ , TestCase $ show (undefined :: DVelocity) @?= "m s^-1"+ ]++-- Collect the test cases.+tests = TestList+ [ testPower+ , testDimensionless+ , testShow+ ]++main = runTestTT tests+
+ README view
@@ -0,0 +1,10 @@+For documentation see the literate haskell source code.++For project information (issues, updates, wiki, examples) see:+ http://code.google.com/p/dimensional/++To install (requires GHC 6.6 or later):+ runhaskell Setup.lhs configure+ runhaskell Setup.lhs build+ runhaskell Setup.lhs install+
+ Test.hs view
@@ -0,0 +1,12 @@++import qualified Numeric.NumTypeTests+import qualified Numeric.Units.Dimensional.Test+import qualified Numeric.Units.Dimensional.QuantitiesTest+import qualified Numeric.Units.Dimensional.ExtensibleTest++main = do+ Numeric.NumTypeTests.main+ Numeric.Units.Dimensional.Test.main+ Numeric.Units.Dimensional.QuantitiesTest.main+ Numeric.Units.Dimensional.ExtensibleTest.main+
dimensional.cabal view
@@ -1,5 +1,5 @@ Name: dimensional-Version: 0.7.2+Version: 0.7.3 License: BSD3 License-File: LICENSE Copyright: Bjorn Buckwalter 2006-2008@@ -18,8 +18,9 @@ far as is practical, enforce/encourage best practices of unit usage. Requires GHC 6.6.1 or later. Category: Math-Build-Depends: base,- time+Build-Type: Simple+Build-Depends: base, time+ -- , fad Exposed-Modules: Numeric.NumType, Numeric.Units.Dimensional, Numeric.Units.Dimensional.Prelude,@@ -28,5 +29,14 @@ Numeric.Units.Dimensional.NonSI, Numeric.Units.Dimensional.Extensible, Numeric.Units.Dimensional.CGS-ghc-options: -O+ -- , Numeric.Units.Dimensional.ForwardAD+Extra-source-files: README,+ -- Fad.hs,+ Test.hs+ Numeric/Units/Dimensional/Test.hs,+ Numeric/Units/Dimensional/QuantitiesTest.hs,+ Numeric/Units/Dimensional/ExtensibleTest.lhs,+ -- , Numeric/Units/Dimensional/ForwardADTest.lhs+ examples/README,+ examples/GM.lhs
+ examples/GM.lhs view
@@ -0,0 +1,93 @@++= GM calculation =++Several representation can be used to describe a satellite's orbit. Two+of the most popular are the cartesian state vector (position and+velocity vectors) and the keplerian elements. Conversion between the two+representations is fairly straight-forward but requires an assumption+to be made about the universal gravitational constant 'G' and the mass+'M' of the body the satellite is orbiting. In practice they are often+combined into a parameter "mu = GM" where the magnitude of 'mu' is+empirically better known that the magnitudes of 'G' and 'M' individually.++*The problem:* Given two representations of the same satellite orbit -- one+using the cartesian state vector and using keplerian elements, both at the+same epoch -- determine the value of 'mu' used to convert between the two.+{{{++> module GM where++> import Numeric.Units.Dimensional.Prelude+> import qualified Prelude++}}}+The state vector describing the orbit at epoch.+{{{++> x = 4383.9449203752 *~ kilo meter+> y = (-41940.917505092) *~ kilo meter+> z = 22.790255916589 *~ kilo meter+> x_dot = 3.0575666627812 *~ (kilo meter / second)+> y_dot = 0.32047068607303 *~ (kilo meter / second)+> z_dot = 0.00084729371755294 *~ (kilo meter / second)++}}}+From the state vector we calculate the distance from the reference frame center at epoch and the velocity squared at epoch.+{{{++> r = sqrt (x ^ pos2 + y ^ pos2 + z ^ pos2)+> v = sqrt (x_dot ^ pos2 + y_dot ^ pos2 + z_dot ^ pos2)++}}}+The kinetic energy per unit mass at epoch is a function of the velocity.+{{{++> e_kin :: EnergyPerUnitMass Double+> e_kin = v ^ pos2 / _2++}}}+The only keplerian element we need for this calculation is the semi-major axis.+{{{++> semi_major_axis = 42165.221455 *~ kilo meter++}}}+The expression for 'mu' is obtained by solving the following equation system:++ e_pot = - mu / r,++ e_tot = - mu / 2a,++ e_tot = e_pot + e_kin,++which gives:++ mu = e_kin / (1 / r - 1 / 2a).++{{{++> mu = e_kin / (_1 / r - _1 / (_2 * semi_major_axis))++}}}+Wrap up with a main function showing the value of 'mu' in desired units.+{{{++> main = putStrLn $ "The value used for GM was " ++ show mu++}}}+Loading this module in 'ghci' and running 'main' produces the following output.+{{{+ ___ ___ _+ / _ \ /\ /\/ __(_)+ / /_\// /_/ / / | | GHC Interactive, version 6.6.1, for Haskell 98.+/ /_\\/ __ / /___| | http://www.haskell.org/ghc/+\____/\/ /_/\____/|_| Type :? for help.++Loading package base ... linking ... done.+[1 of 1] Compiling GM ( GM.lhs, interpreted )+Ok, modules loaded: GM.+*GM> main+Loading package dimensional-0.5 ... linking ... done.+The value used for GM was 3.986004400008003e14 m^3 s^-2+*GM>+}}}
+ examples/README view
@@ -0,0 +1,2 @@+See the project wiki at http://dimensional.googlecode.com for more examples.+