This library provides utilities for working with existential types and type-level constraints.
It allows you to enforce multiple constraints on polymorphic types and containers complementing some
.
- Existential types:
Somes
andSomes1
provide existential wrappers for types with multiple constraints. - Convenient aliases: Simplified types
Some
andSome1
for scenarios where just one constraint is needed. - More convenient aliases: Simplified types
SomeF
andSomesF
for scenarios where the container of aSomes1
is known. - Natural transformations with constraints
mapSome :: (forall a. AllC csa a => f a -> g a) -> SomesF f csa -> SomesF g csa
traverseSome :: Functor m => (forall a. AllC csa a => f a -> m (g a)) -> SomesF f csa -> m (SomesF g csa)
import Data.Some.Constraint
someShowableOrd :: Somes '[Show, Ord]
someShowableOrd = Some [1, 2, 3 :: Int]
someNumFunctor :: Some1 Functor Num
someNumFunctor = Some1 [1, 2, 3 :: Int]
someListShowable :: SomeF [] Show
someListShowable = Some1 [1, 2, 3 :: Int]
Contributions, critics and bug reports are welcome!
Please feel free to contact me through GitHub.