packages feed

mixed-types-num-0.1.0.0: mixed-types-num.cabal

name:           mixed-types-num
version:        0.1.0.0
cabal-version:  >= 1.9.2
build-type:     Simple
homepage:       https://github.com/michalkonecny/mixed-types-num
author:         Michal Konecny
maintainer:     Michal Konecny <mikkonecny@gmail.com>
copyright:      (c) 2015-2017 Michal Konecny
license:        BSD3
license-file:   LICENSE
stability:      experimental
tested-with:    GHC==7.10.3, GHC==8.0.2
category:       Math
synopsis:       Alternative Prelude with numeric and logic expressions typed bottom-up
Description:
    = Main purpose
    .
    This package provides a version of Prelude where
    unary and binary operations such as @not@, @+@, @==@
    have their result type derived from the parameter type(s),
    allowing, /e.g./:
    .
      * dividing an integer by an integer, giving a rational:
      .
      @let n = 1 :: Integer in n/(n+1) :: Rational@
      .
      @1/2 :: Rational@
      .
      (The type Rational would be derived automatically because
      integer literals are always of type @Integer@, not @Num t => t@.)
      .
      * adding an integer and a rational, giving a rational:
      .
      @(length [x])+1/3 :: Rational@
      .
      * taking natural, integer and fractional power using the same operator:
      .
      @2^2 :: Integer@
      .
      @2.0^(-2) :: Rational@
      .
      @(double 2)^(1/2) :: Double@
      -- .
      -- @negate 1 :: Integer@
      -- .
      -- @negate (x == 1) :: Bool@
      .
      The following examples require package <https://github.com/michalkonecny/aern2/aern2-real aern2-real>:
      .
      @2^(1/2) :: CauchyReal@
      .
      @pi :: CauchyReal@
      .
      @sqrt 2 :: CauchyReal@
      .
      * comparing an integer with an (exact) real number, giving a @Maybe Bool@:
      .
      @... x :: CauchyReal ... if (isCertainlyTrue (x > 1)) then ...@
    .
    = Type classes
    .
    Arithmetic operations are provided via multi-parameter type classes
    and the result type is given by associated
    type families. For example:
    .
    @(+) :: (CanAddAsymmetric t1 t2) => t1 -> t2 -> AddType t1 t2@
    .
    The type constraint @CanAdd t1 t2@ implies both
    @CanAddAsymmetric t1 t2@ and @CanAddAsymmetric t2 t1@.
    .
    For convenience there are other aggregate type constraints such as
    @CanAddThis t1 t2@, which implies that the result is of type @t1@,
    and @CanAddSameType t@, which is a shortcut for @CanAddThis t t@.
    .
    == Testable specification
    .
    The arithmetic type classes are accompanied by generic hspec test suites,
    which are specialised to concrete instance types for their testing.
    These test suites include the expected algebraic properties of operations,
    such as commutativity and associativity of addition.
    .
    = Limitations
    .
    * Not all numerical operations are supported yet.
      Eg @tan@, @atan@ are missing at the moment.
    .
    * Inferred types can be very large. Eg for @f a b c = sqrt (a + b * c + 1)@ the inferred type is:
      .
      @
      f: (CanMulAsymmetric t1 t2, CanAddAsymmetric t4 (MulType t1 t2),
          CanAddAsymmetric (AddType t4 (MulType t1 t2)) Integer,
          CanSqrt (AddType (AddType t4 (MulType t1 t2)) Integer)) =>
         t4
         -> t1
         -> t2
         -> SqrtType (AddType (AddType t4 (MulType t1 t2)) Integer)
      @
      .
    * Due to limitations of some versions of ghc, type inferrence sometimes fails.
      Eg @add1 = (+ 1)@ fails (eg with ghc 8.0.2) unless we explicitly declare the type
      @add1 :: (CanAdd Integer t) => t -> AddType t Integer@
      or use an explicit parameter, eg @add1 x = x + 1@.
    .
    = Further reading
    .
    To find out more, please read the documentation for the modules
    in the order specified in "Numeric.MixedTypes".
    .
    = Origin
    .
    The idea of having numeric expressions in Haskell with types
    derived bottom-up was initially suggested and implemented by Pieter Collins.
    This version is a fresh rewrite by Michal Konečný.

source-repository head
  type:     git
  location: https://github.com/mikkonecny/mixed-types-num

library
  hs-source-dirs:  src
  build-depends:
    base == 4.*
    , convertible >= 1.1.1.0 && < 1.2
    , hspec >= 2.1 && < 2.5
    , hspec-smallcheck >= 0.3 && < 0.5
    , smallcheck == 1.1.*
    , QuickCheck >= 2.7 && < 2.10
  ghc-options:     -Wall -fno-warn-orphans
  extensions:
    RebindableSyntax,
    PostfixOperators,
    ScopedTypeVariables,
    TypeFamilies,
    TypeOperators,
    ConstraintKinds,
    DefaultSignatures,
    MultiParamTypeClasses,
    FlexibleContexts,
    FlexibleInstances,
    UndecidableInstances
  exposed-modules:
    Numeric.MixedTypes
    Numeric.MixedTypes.PreludeHiding
    Numeric.MixedTypes.Literals
    Numeric.MixedTypes.Bool
    Numeric.MixedTypes.Eq
    Numeric.MixedTypes.Ord
    Numeric.MixedTypes.MinMaxAbs
    Numeric.MixedTypes.AddSub
    Numeric.MixedTypes.Round
    Numeric.MixedTypes.Ring
    Numeric.MixedTypes.Field
    Numeric.MixedTypes.Elementary

test-suite spec
  type:
      exitcode-stdio-1.0
  ghc-options:
      -Wall
  extensions:
    RebindableSyntax,
    PostfixOperators,
    ScopedTypeVariables,
    FlexibleContexts
  hs-source-dirs:
      test
  main-is:
      Spec.hs
  build-depends:
    base == 4.*
    , mixed-types-num
    , hspec >= 2.1 && < 2.3
    , hspec-smallcheck >= 0.3 && < 0.5
    , QuickCheck >= 2.7 && < 2.9