type-level-sets: Type-level sets and finite maps (with value-level counterparts)
This package provides type-level sets (no duplicates, sorted to provide a normal form) via Set and type-level
finite maps via Map, with value-level counterparts.
Described in the paper "Embedding effect systems in Haskell" by Dominic Orchard and Tomas Petricek http://www.cl.cam.ac.uk/~dao29/publ/haskell14-effects.pdf (Haskell Symposium, 2014). This version now uses Quicksort to normalise the representation.
Here is a brief example for finite maps.:
import Data.Type.Map
foo :: Map '["x" :-> Int, "z" :-> Int, "w" :-> Int]
foo = Ext ((Var :: (Var "x")) :-> 2) $
Ext ((Var :: (Var "z")) :-> 4) $
Ext ((Var :: (Var "w")) :-> 5) $
Empty
bar :: Map '["y" :-> Int, "w" :-> Int]
bar = Ext ((Var :: (Var "y")) :-> 3) $
Ext ((Var :: (Var "w")) :-> 1) $
Empty
-- foobar :: Map '["w" :-> Int, "x" :-> Int, "y" :-> Int, "z" :-> Int]
foobar = foo `union` barThe Set type for foobar here shows the normalised form (sorted with no duplicates).
The type signatures is commented out as it can be infered. Running the example we get:
>>> foobar [(Var :-> 1), (Var :-> 2), (Var :-> 3), (Var :-> 4)]
Thus, we see that the first value paired with the "w" variable is dropped. For sets, here is an example:
import GHC.TypeLits import Data.Type.Set type instance Cmp (Natural n) (Natural m) = CmpNat n m data Natural (a :: Nat) where Z :: Natural 0 S :: Natural n -> Natural (n + 1) -- foo :: Set '[Natural 0, Natural 1, Natural 3] foo = asSet $ Ext (S Z) (Ext (S (S (S Z))) (Ext Z Empty)) -- bar :: Set '[Natural 1, Natural 2] bar = asSet $ Ext (S (S Z)) (Ext (S Z) (Ext (S Z) Empty)) -- foobar :: Set '[Natural 0, Natural 1, Natural 2, Natural 3] foobar = foo `union` bar
Note the types here are all inferred.
Downloads
- type-level-sets-0.6.1.tar.gz [browse] (Cabal source package)
- Package description (as included in the package)
Maintainer's Corner
For package maintainers and hackage trustees
Candidates
| Versions [RSS] | 0.5, 0.6, 0.6.1, 0.7, 0.8.0.0, 0.8.5.0, 0.8.6.0, 0.8.7.0, 0.8.9.0 |
|---|---|
| Dependencies | base (>=4.7.0.0 && <5), ghc-prim [details] |
| Tested with | ghc ==7.8.2 |
| License | BSD-3-Clause |
| Copyright | 2013-16 University of Cambridge |
| Author | Dominic Orchard |
| Maintainer | Dominic Orchard |
| Category | Type System, Data Structures |
| Source repo | head: git clone https://github.com/dorchard/type-level-sets |
| Uploaded | by DominicOrchard at 2016-01-05T17:44:56Z |
| Distributions | |
| Reverse Dependencies | 5 direct, 0 indirect [details] |
| Downloads | 7150 total (18 in the last 30 days) |
| Rating | 2.0 (votes: 1) [estimated by Bayesian average] |
| Your Rating | |
| Status | Docs available [build log] Last success reported on 2016-11-28 [all 1 reports] |