Modulestrict-sop-core-0.1.4.0Haskell2010
Data.SOP.Strict
Strict variant of SOP
- 1 type
- 9 classes
- 25 values
- Packagestrict-sop-core-0.1.4.0
- Exports39
- LanguageHaskell2010
- LicenceApache-2.0
- SourceStrict.hs
module Data.SOP.Strict.NP
module Data.SOP.Strict.NS
fn
1 declarationReexports
38 declarationsConstruct a lifted function.
Same as Fn. Only available for uniformity with the higher-arity versions.
Construct a binary lifted function.
Construct a ternary lifted function.
Construct a quarternary lifted function.
Special case of hctraverse_.
Flipped version of hctraverse.
Flipped version of hctraverse_.
Another name for hcliftA.
Special case of hctraverse' where f' = I.
Another name for hcliftA2.
Another name for hcliftA3.
Specialization of hcoerce.
A generalized form of liftA, which in turn is a generalized map.
Takes a lifted function and applies it to every element of a structure while preserving its shape.
Specification:
hliftA f xs = hpure (fn f) ` hap ` xs
Instances:
hliftA, liftA_NP :: Data.SOP.Sing.SListI xs => (forall a. f a -> f' a) -> NP f xs -> NP f' xs
hliftA, liftA_NS :: Data.SOP.Sing.SListI xs => (forall a. f a -> f' a) -> NS f xs -> NS f' xs
hliftA, liftA_POP :: SListI2 xss => (forall a. f a -> f' a) -> POP f xss -> POP f' xss
hliftA, liftA_SOP :: SListI2 xss => (forall a. f a -> f' a) -> SOP f xss -> SOP f' xss
A generalized form of liftA2, which in turn is a generalized zipWith.
Takes a lifted binary function and uses it to combine two structures of equal shape into a single structure.
It either takes two product structures to a product structure, or one product and one sum structure to a sum structure.
Specification:
hliftA2 f xs ys = hpure (fn_2 f) ` hap ` xs ` hap ` ys
Instances:
hliftA2, liftA2_NP :: Data.SOP.Sing.SListI xs => (forall a. f a -> f' a -> f'' a) -> NP f xs -> NP f' xs -> NP f'' xs
hliftA2, liftA2_NS :: Data.SOP.Sing.SListI xs => (forall a. f a -> f' a -> f'' a) -> NP f xs -> NS f' xs -> NS f'' xs
hliftA2, liftA2_POP :: SListI2 xss => (forall a. f a -> f' a -> f'' a) -> POP f xss -> POP f' xss -> POP f'' xss
hliftA2, liftA2_SOP :: SListI2 xss => (forall a. f a -> f' a -> f'' a) -> POP f xss -> SOP f' xss -> SOP f'' xss
A generalized form of liftA3, which in turn is a generalized zipWith3.
Takes a lifted ternary function and uses it to combine three structures of equal shape into a single structure.
It either takes three product structures to a product structure, or two product structures and one sum structure to a sum structure.
Specification:
hliftA3 f xs ys zs = hpure (fn_3 f) ` hap ` xs ` hap ` ys ` hap ` zs
Instances:
hliftA3, liftA3_NP :: Data.SOP.Sing.SListI xs => (forall a. f a -> f' a -> f'' a -> f''' a) -> NP f xs -> NP f' xs -> NP f'' xs -> NP f''' xs
hliftA3, Data.SOP.NS.liftA3_NS :: Data.SOP.Sing.SListI xs => (forall a. f a -> f' a -> f'' a -> f''' a) -> NP f xs -> NP f' xs -> NS f'' xs -> NS f''' xs
hliftA3, liftA3_POP :: SListI2 xss => (forall a. f a -> f' a -> f'' a -> f''' a) -> POP f xss -> POP f' xss -> POP f'' xss -> POP f''' xs
hliftA3, Data.SOP.NS.liftA3_SOP :: SListI2 xss => (forall a. f a -> f' a -> f'' a -> f''' a) -> POP f xss -> POP f' xss -> SOP f'' xss -> Data.SOP.NP.SOP f''' xs
Another name for hliftA.
Special case of hsequence' where g = I.
Special case of hsequence' where g = K a.
Specialization of hcoerce.
Another name for hliftA2.
Another name for hliftA3.
Maps products to lists, and sums to identities.
Instances6CollapseTo
type CollapseTo NP a = [a]Defined in sop-core-0.5.0.2 · Data.SOP.NPtype CollapseTo POP a = [[a]]Defined in sop-core-0.5.0.2 · Data.SOP.NPtype CollapseTo NS a = aDefined in sop-core-0.5.0.2 · Data.SOP.NStype CollapseTo SOP a = [a]Defined in sop-core-0.5.0.2 · Data.SOP.NStype CollapseTo NP a = [a]Defined in strict-sop-core-0.1.4.0 · Data.SOP.Strict.NPtype CollapseTo NS a = aDefined in strict-sop-core-0.1.4.0 · Data.SOP.Strict.NS
A generalization of <*>.
Methods
hap :: Prod h (f -.-> g) xs -> h f xs -> h g xsCorresponds to <*>.
For products (NP) as well as products of products (POP), the correspondence is rather direct. We combine a structure containing (lifted) functions and a compatible structure containing corresponding arguments into a compatible structure containing results.
The same combinator can also be used to combine a product structure of functions with a sum structure of arguments, which then results in another sum structure of results. The sum structure determines which part of the product structure will be used.
Instances:
hap, ap_NP :: NP (f -.-> g) xs -> NP f xs -> NP g xs hap, ap_NS ::Data.SOP.NS.NP(f -.-> g) xs -> NS f xs -> NS g xs hap, ap_POP :: POP (f -.-> g) xss -> POP f xss -> POP g xss hap, ap_SOP ::Data.SOP.NS.POP(f -.-> g) xss -> SOP f xss -> SOP g xss
Instances6HAp
HAp NPDefined in sop-core-0.5.0.2 · Data.SOP.NPHAp POPDefined in sop-core-0.5.0.2 · Data.SOP.NPHAp NSDefined in sop-core-0.5.0.2 · Data.SOP.NSHAp SOPDefined in sop-core-0.5.0.2 · Data.SOP.NSHAp NPDefined in strict-sop-core-0.1.4.0 · Data.SOP.Strict.NPHAp NSDefined in strict-sop-core-0.1.4.0 · Data.SOP.Strict.NS
A class for applying all injections corresponding to a sum-like structure to a table containing suitable arguments.
Methods
hapInjs :: SListIN h xs => Prod h f xs -> [h f xs]For a given table (product-like structure), produce a list where each element corresponds to the application of an injection function into the corresponding sum-like structure.
Instances:
hapInjs, apInjs_NP ::Data.SOP.Sing.SListIxs => NP f xs -> [NS f xs ] hapInjs,Data.SOP.NS.apInjs_SOP:: SListI2 xss => POP f xs -> [SOP f xss]Examples:
Example1 expression hapInjs (I 'x' :* I True :* I 2 :* Nil) :: [NS I '[Char, Bool, Int]][Z (I 'x'),S (Z (I True)),S (S (Z (I 2)))]
Example1 expression hapInjs (POP ((I 'x' :* Nil) :* (I True :* I 2 :* Nil) :* Nil)) :: [SOP I '[ '[Char], '[Bool, Int]]][SOP (Z (I 'x' :* Nil)),SOP (S (Z (I True :* I 2 :* Nil)))]
Unfortunately the type-signatures are required in GHC-7.10 and older.
A class for collapsing a heterogeneous structure into a homogeneous one.
Methods
hcollapse :: SListIN h xs => h (K a) xs -> CollapseTo h aCollapse a heterogeneous structure with homogeneous elements into a homogeneous structure.
If a heterogeneous structure is instantiated to the constant functor K, then it is in fact homogeneous. This function maps such a value to a simpler Haskell datatype reflecting that. An
contains a singleData.SOP.NS(K a)a, and ancontains a list ofData.SOP.NP(K a)as.Instances:
hcollapse, collapse_NP :: NP (K a) xs -> [a] hcollapse, collapse_NS :: NS (K a) xs -> a hcollapse, collapse_POP :: POP (K a) xss -> [[a]] hcollapse, collapse_SOP ::Data.SOP.NP.SOP(K a) xss -> [a]
Instances6HCollapse
HCollapse NPDefined in sop-core-0.5.0.2 · Data.SOP.NPHCollapse POPDefined in sop-core-0.5.0.2 · Data.SOP.NPHCollapse NSDefined in sop-core-0.5.0.2 · Data.SOP.NSHCollapse SOPDefined in sop-core-0.5.0.2 · Data.SOP.NSHCollapse NPDefined in strict-sop-core-0.1.4.0 · Data.SOP.Strict.NPHCollapse NSDefined in strict-sop-core-0.1.4.0 · Data.SOP.Strict.NS
A class for expanding sum structures into corresponding product structures, filling in the slots not targeted by the sum with default values.
Methods
hexpand :: SListIN (Prod h) xs => (forall (x :: k). f x) -> h f xs -> Prod h f xsExpand a given sum structure into a corresponding product structure by placing the value contained in the sum into the corresponding position in the product, and using the given default value for all other positions.
Instances:
hexpand, expand_NS ::Data.SOP.Sing.SListIxs => (forall x . f x) -> NS f xs ->Data.SOP.NS.NPf xs hexpand, expand_SOP :: SListI2 xss => (forall x . f x) -> SOP f xss -> POP f xssExamples:
Example2 expressions hexpand Nothing (S (Z (Just 3))) :: NP Maybe '[Char, Int, Bool]Nothing :* Just 3 :* Nothing :* Nilhexpand [] (SOP (S (Z ([1,2] :* "xyz" :* Nil)))) :: POP [] '[ '[Bool], '[Int, Char] ]POP (([] :* Nil) :* ([1,2] :* "xyz" :* Nil) :* Nil)
hcexpand :: AllN (Prod h) c xs => proxy c -> (forall (x :: k). c x => f x) -> h f xs -> Prod h f xsVariant of hexpand that allows passing a constrained default.
Instances:
hcexpand, cexpand_NS :: All c xs => proxy c -> (forall x . c x => f x) -> NS f xs -> NP f xs hcexpand, cexpand_SOP :: All2 c xss => proxy c -> (forall x . c x => f x) -> SOP f xss -> POP f xssExamples:
Example2 expressions hcexpand (Proxy :: Proxy Bounded) (I minBound) (S (Z (I 20))) :: NP I '[Bool, Int, Ordering]I False :* I 20 :* I LT :* Nilhcexpand (Proxy :: Proxy Num) (I 0) (SOP (S (Z (I 1 :* I 2 :* Nil)))) :: POP I '[ '[Double], '[Int, Int] ]POP ((I 0.0 :* Nil) :* (I 1 :* I 2 :* Nil) :* Nil)
A class for determining which choice in a sum-like structure a value represents.
Methods
hindex :: h f xs -> IntIf
his a sum-like structure representing a choice betweenndifferent options, andxis a value of typeh f xs, thenhindex xreturns a number between0andn - 1representing the index of the choice made byx.Instances:
hindex, index_NS :: NS f xs -> Int hindex, index_SOP :: SOP f xs -> IntExamples:
Example3 expressions hindex (S (S (Z (I False))))2hindex (Z (K ()))0hindex (SOP (S (Z (I True :* I 'x' :* Nil))))1
Methods
hpure :: SListIN h xs => (forall (a :: k). f a) -> h f xshcpure :: AllN h c xs => proxy c -> (forall (a :: k). c a => f a) -> h f xsA variant of hpure that allows passing in a constrained argument.
Calling
hcpure f swheres :: h f xscausesfto be applied at all the types that are contained inxs. Therefore, the constraintchas to be satisfied for all elements ofxs, which is whatAllN h c xsstates.Instances:
hcpure, cpure_NP :: (All c xs ) => proxy c -> (forall a. c a => f a) -> NP f xs hcpure, cpure_POP :: (All2 c xss) => proxy c -> (forall a. c a => f a) -> POP f xss
A generalization of sequenceA.
Methods
hsequence' :: (SListIN h xs, Applicative f) => h (f :.: g) xs -> f (h g xs)Corresponds to sequenceA.
Lifts an applicative functor out of a structure.
Instances:
hsequence', sequence'_NP :: (Data.SOP.Sing.SListIxs , Applicative f) => NP (f :.: g) xs -> f (NP g xs ) hsequence', sequence'_NS :: (Data.SOP.Sing.SListIxs , Applicative f) => NS (f :.: g) xs -> f (NS g xs ) hsequence', sequence'_POP :: (SListI2 xss, Applicative f) => POP (f :.: g) xss -> f (POP g xss) hsequence', sequence'_SOP :: (SListI2 xss, Applicative f) => SOP (f :.: g) xss -> f (SOP g xss)hctraverse' :: (AllN h c xs, Applicative g) => proxy c -> (forall (a :: k). c a => f a -> g (f' a)) -> h f xs -> g (h f' xs)Corresponds to traverse.
Instances:
hctraverse', ctraverse'_NP :: (All c xs , Applicative g) => proxy c -> (forall a. c a => f a -> g (f' a)) -> NP f xs -> g (NP f' xs ) hctraverse', ctraverse'_NS :: (All2 c xs , Applicative g) => proxy c -> (forall a. c a => f a -> g (f' a)) -> NS f xs -> g (NS f' xs ) hctraverse', ctraverse'_POP :: (All c xss, Applicative g) => proxy c -> (forall a. c a => f a -> g (f' a)) -> POP f xss -> g (POP f' xss) hctraverse', ctraverse'_SOP :: (All2 c xss, Applicative g) => proxy c -> (forall a. c a => f a -> g (f' a)) -> SOP f xss -> g (SOP f' xss)htraverse' :: (SListIN h xs, Applicative g) => (forall (a :: k). f a -> g (f' a)) -> h f xs -> g (h f' xs)Unconstrained variant of hctraverse'.
Instances:
htraverse', traverse'_NP :: (SListI xs , Applicative g) => (forall a. c a => f a -> g (f' a)) -> NP f xs -> g (NP f' xs ) htraverse', traverse'_NS :: (SListI2 xs , Applicative g) => (forall a. c a => f a -> g (f' a)) -> NS f xs -> g (NS f' xs ) htraverse', traverse'_POP :: (SListI xss, Applicative g) => (forall a. c a => f a -> g (f' a)) -> POP f xss -> g (POP f' xss) htraverse', traverse'_SOP :: (SListI2 xss, Applicative g) => (forall a. c a => f a -> g (f' a)) -> SOP f xss -> g (SOP f' xss)
Instances6HSequence
HSequence NPDefined in sop-core-0.5.0.2 · Data.SOP.NPHSequence POPDefined in sop-core-0.5.0.2 · Data.SOP.NPHSequence NSDefined in sop-core-0.5.0.2 · Data.SOP.NSHSequence SOPDefined in sop-core-0.5.0.2 · Data.SOP.NSHSequence NPDefined in strict-sop-core-0.1.4.0 · Data.SOP.Strict.NPHSequence NSDefined in strict-sop-core-0.1.4.0 · Data.SOP.Strict.NS
class (Same h1 ~ h2, Same h2 ~ h1) => HTrans (h1 :: (k1 -> Type) -> l1 -> Type) (h2 :: (k2 -> Type) -> l2 -> Type) whereA class for transforming structures into related structures with a different index list, as long as the index lists have the same shape and the elements and interpretation functions are suitably related.
Methods
htrans :: AllZipN (Prod h1) c xs ys => proxy c -> (forall (x :: k1) (y :: k2). c x y => f x -> g y) -> h1 f xs -> h2 g ysTransform a structure into a related structure given a conversion function for the elements.
hcoerce :: AllZipN (Prod h1) (LiftedCoercible f g) xs ys => h1 f xs -> h2 g ysSafely coerce a structure into a representationally equal structure.
This is a special case of htrans, but can be implemented more efficiently; for example in terms of unsafeCoerce.
Examples:
Example2 expressions hcoerce (I (Just LT) :* I (Just 'x') :* I (Just True) :* Nil) :: NP Maybe '[Ordering, Char, Bool]Just LT :* Just 'x' :* Just True :* Nilhcoerce (SOP (Z (K True :* K False :* Nil))) :: SOP I '[ '[Bool, Bool], '[Bool] ]SOP (Z (I True :* I False :* Nil))
Instances6HTrans
HTrans NP NPDefined in sop-core-0.5.0.2 · Data.SOP.NPHTrans POP POPDefined in sop-core-0.5.0.2 · Data.SOP.NPHTrans NS NSDefined in sop-core-0.5.0.2 · Data.SOP.NSHTrans SOP SOPDefined in sop-core-0.5.0.2 · Data.SOP.NSHTrans NP NPDefined in strict-sop-core-0.1.4.0 · Data.SOP.Strict.NPHTrans NS NSDefined in strict-sop-core-0.1.4.0 · Data.SOP.Strict.NS
Methods
hctraverse_ :: (AllN h c xs, Applicative g) => proxy c -> (forall (a :: k). c a => f a -> g ()) -> h f xs -> g ()Corresponds to traverse_.
Instances:
hctraverse_, ctraverse__NP :: (All c xs , Applicative g) => proxy c -> (forall a. c a => f a -> g ()) -> NP f xs -> g () hctraverse_, ctraverse__NS :: (All2 c xs , Applicative g) => proxy c -> (forall a. c a => f a -> g ()) -> NS f xs -> g () hctraverse_, ctraverse__POP :: (All c xss, Applicative g) => proxy c -> (forall a. c a => f a -> g ()) -> POP f xss -> g () hctraverse_, ctraverse__SOP :: (All2 c xss, Applicative g) => proxy c -> (forall a. c a => f a -> g ()) -> SOP f xss -> g ()htraverse_ :: (SListIN h xs, Applicative g) => (forall (a :: k). f a -> g ()) -> h f xs -> g ()Unconstrained version of hctraverse_.
Instances:
traverse_, traverse__NP :: (SListI xs , Applicative g) => (forall a. f a -> g ()) -> NP f xs -> g ()traverse_, traverse__NS :: (SListI xs , Applicative g) => (forall a. f a -> g ()) -> NS f xs -> g ()traverse_, traverse__POP :: (SListI2 xss, Applicative g) => (forall a. f a -> g ()) -> POP f xss -> g ()traverse_, traverse__SOP :: (SListI2 xss, Applicative g) => (forall a. f a -> g ()) -> SOP f xss -> g ()
Instances5HTraverse_
HTraverse_ NPDefined in sop-core-0.5.0.2 · Data.SOP.NPHTraverse_ POPDefined in sop-core-0.5.0.2 · Data.SOP.NPHTraverse_ NSDefined in sop-core-0.5.0.2 · Data.SOP.NSHTraverse_ SOPDefined in sop-core-0.5.0.2 · Data.SOP.NSHTraverse_ NPDefined in strict-sop-core-0.1.4.0 · Data.SOP.Strict.NP
Maps a structure containing sums to the corresponding product structure.
Instances6Prod
type Prod NP = NPDefined in sop-core-0.5.0.2 · Data.SOP.NPtype Prod POP = POPDefined in sop-core-0.5.0.2 · Data.SOP.NPtype Prod NS = NPDefined in sop-core-0.5.0.2 · Data.SOP.NStype Prod SOP = POPDefined in sop-core-0.5.0.2 · Data.SOP.NStype Prod NP = NPDefined in strict-sop-core-0.1.4.0 · Data.SOP.Strict.NPtype Prod NS = NPDefined in strict-sop-core-0.1.4.0 · Data.SOP.Strict.NS
Maps a structure to the same structure.
Instances6Same
type Same NP = NPDefined in sop-core-0.5.0.2 · Data.SOP.NPtype Same POP = POPDefined in sop-core-0.5.0.2 · Data.SOP.NPtype Same NS = NSDefined in sop-core-0.5.0.2 · Data.SOP.NStype Same SOP = SOPDefined in sop-core-0.5.0.2 · Data.SOP.NStype Same NP = NPDefined in strict-sop-core-0.1.4.0 · Data.SOP.Strict.NPtype Same NS = NSDefined in strict-sop-core-0.1.4.0 · Data.SOP.Strict.NS
Maps a structure containing products to the corresponding sum structure.