Safe Haskell | Safe-Inferred |
---|---|
Language | GHC2021 |
Data.Registry.Lift
Contents
Description
This code is taken from https://stackoverflow.com/questions/28003135/is-it-possible-to-encode-a-generic-lift-function-in-haskell
to allow a generic lift operation over an Applicative
context
So if you have a function: Int -> Text -> IO Int
, it can be lifted to have all of its parameters
in IO
:
f :: Int -> Text -> IO Int lifted :: IO Int -> IO Text -> IO Int lifted = to @IO f
Synopsis
- class Applicative f => ApplyVariadic f a b where
- applyVariadic :: f a -> b
- allTo :: forall f a b. ApplyVariadic f a b => a -> b
- class Monad f => ApplyVariadic1 f a b where
- applyVariadic1 :: f a -> b
- argsTo :: forall f a b. ApplyVariadic1 f a b => a -> b
- class ApplyVariadic2 f g a b where
- applyVariadic2 :: (forall x. f x -> g x) -> a -> b
- outTo :: forall g f a b. ApplyVariadic2 f g a b => (forall x. f x -> g x) -> a -> b
- newtype Tag (s :: Symbol) a = Tag {
- unTag :: a
- tag :: forall (s :: Symbol) fun. CNumArgs (CountArgs fun) fun => fun -> Apply (Tag s) (CountArgs fun) fun
- data Nat
- data NumArgs :: Nat -> Type -> Type where
- type family CountArgs (f :: Type) :: Nat where ...
- class CNumArgs (numArgs :: Nat) (arrows :: Type) where
- type family Apply (f :: Type -> Type) (n :: Nat) (arrows :: Type) :: Type where ...
- applyLast :: forall f fun. (Applicative f, CNumArgs (CountArgs fun) fun) => fun -> Apply f (CountArgs fun) fun
Documentation
class Applicative f => ApplyVariadic f a b where Source #
Typeclass for lifting pure functions to effectful arguments and results
Methods
applyVariadic :: f a -> b Source #
Instances
(Applicative f, b ~ f a) => ApplyVariadic f a b Source # | |
Defined in Data.Registry.Lift Methods applyVariadic :: f a -> b Source # | |
(Monad f, b ~ f a) => ApplyVariadic f (f a) b Source # | |
Defined in Data.Registry.Lift Methods applyVariadic :: f (f a) -> b Source # | |
(Applicative f, ApplyVariadic f a' b', b ~ (f a -> b')) => ApplyVariadic f (a -> a') b Source # | |
Defined in Data.Registry.Lift Methods applyVariadic :: f (a -> a') -> b Source # |
allTo :: forall f a b. ApplyVariadic f a b => a -> b Source #
Lift a pure function to effectful arguments and results
class Monad f => ApplyVariadic1 f a b where Source #
Typeclass for lifting impure functions to effectful arguments and results
Methods
applyVariadic1 :: f a -> b Source #
Instances
(Monad f, b ~ f a) => ApplyVariadic1 f (f a) b Source # | |
Defined in Data.Registry.Lift Methods applyVariadic1 :: f (f a) -> b Source # | |
(Monad f, ApplyVariadic1 f a' b', b ~ (f a -> b')) => ApplyVariadic1 f (a -> a') b Source # | |
Defined in Data.Registry.Lift Methods applyVariadic1 :: f (a -> a') -> b Source # |
argsTo :: forall f a b. ApplyVariadic1 f a b => a -> b Source #
Lift an effectful function to effectful arguments and results
class ApplyVariadic2 f g a b where Source #
Typeclass for lifting a function with a result of type m b into a function with a result of type n b
Methods
applyVariadic2 :: (forall x. f x -> g x) -> a -> b Source #
Instances
b ~ g a => ApplyVariadic2 (f :: k -> Type) (g :: k -> Type) (f a) b Source # | |
Defined in Data.Registry.Lift Methods applyVariadic2 :: (forall (x :: k0). f x -> g x) -> f a -> b Source # | |
(ApplyVariadic2 f g a' b', b ~ (a -> b')) => ApplyVariadic2 (f :: k -> Type) (g :: k -> Type) (a -> a') b Source # | |
Defined in Data.Registry.Lift Methods applyVariadic2 :: (forall (x :: k0). f x -> g x) -> (a -> a') -> b Source # |
outTo :: forall g f a b. ApplyVariadic2 f g a b => (forall x. f x -> g x) -> a -> b Source #
Lift a function returning an effectful result to a function returning another effectful result
Tagging
newtype Tag (s :: Symbol) a Source #
The output of some constructors can be "tagged" with a string to indicate how a given value was built.
tag :: forall (s :: Symbol) fun. CNumArgs (CountArgs fun) fun => fun -> Apply (Tag s) (CountArgs fun) fun Source #
ApplyLast typeclass provided by @neongreen It uses an auxiliary typeclass to count the arguments of a function
type family CountArgs (f :: Type) :: Nat where ... Source #
Count the number of arguments for a function type
class CNumArgs (numArgs :: Nat) (arrows :: Type) where Source #
Typeclass for counting the number of arguments of a function type