mixed-types-num: Alternative Prelude with numeric and logic expressions typed bottom-up
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
The following examples require package 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 typeadd1 :: (CanAdd Integer t) => t -> AddType t Integer
or use an explicit parameter, egadd1 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ý.
Downloads
- mixed-types-num-0.1.0.0.tar.gz [browse] (Cabal source package)
- Package description (as included in the package)
Maintainer's Corner
For package maintainers and hackage trustees
Candidates
- No Candidates
Versions [RSS] | 0.1.0.0, 0.1.0.1, 0.2, 0.2.0.1, 0.3, 0.3.0.1, 0.3.1, 0.3.1.1, 0.3.1.2, 0.3.1.3, 0.3.1.4, 0.3.1.5, 0.3.2, 0.4.0, 0.4.0.1, 0.4.0.2, 0.4.1, 0.5.0.0, 0.5.0.1, 0.5.0.2, 0.5.0.3, 0.5.0.4, 0.5.1.0, 0.5.2.0, 0.5.3.0, 0.5.3.1, 0.5.4.0, 0.5.5.0, 0.5.6.0, 0.5.7.0, 0.5.8.0, 0.5.9.0, 0.5.9.1, 0.5.10, 0.5.11, 0.5.12, 0.6.0, 0.6.1, 0.6.2 (info) |
---|---|
Dependencies | base (>=4 && <5), convertible (>=1.1.1.0 && <1.2), hspec (>=2.1 && <2.5), hspec-smallcheck (>=0.3 && <0.5), QuickCheck (>=2.7 && <2.10), smallcheck (>=1.1 && <1.2) [details] |
Tested with | ghc ==7.10.3, ghc ==8.0.2 |
License | BSD-3-Clause |
Copyright | (c) 2015-2017 Michal Konecny |
Author | Michal Konecny |
Maintainer | Michal Konecny <mikkonecny@gmail.com> |
Category | Math |
Home page | https://github.com/michalkonecny/mixed-types-num |
Source repo | head: git clone https://github.com/mikkonecny/mixed-types-num |
Uploaded | by MichalKonecny at 2017-03-08T23:10:17Z |
Distributions | LTSHaskell:0.6.2, NixOS:0.5.12, Stackage:0.6.2 |
Reverse Dependencies | 7 direct, 0 indirect [details] |
Downloads | 14652 total (9 in the last 30 days) |
Rating | (no votes yet) [estimated by Bayesian average] |
Your Rating | |
Status | Docs available [build log] Last success reported on 2017-03-08 [all 1 reports] |