type-level-sets-0.5: Type-level sets (with value-level counterparts and various operations)
This package provides type-level sets (no duplicates, sorted to provide a nomral form) via Set,
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)
Here is a brief example:
import Data.Type.Set
foo :: Set '["x" :-> Int, "z" :-> Int, "w" :-> Int]
foo = Ext ((Var :: (Var "x")) :-> 2) $
Ext ((Var :: (Var "z")) :-> 4) $
Ext ((Var :: (Var "w")) :-> 5) $
Empty
bar :: Set '["y" :-> Int, "w" :-> Int]
bar = Ext ((Var :: (Var "y")) :-> 3) $
Ext ((Var :: (Var "w")) :-> 1) $
Empty
-- foobar :: Set '["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.
Modules
- Data
- Type