| Copyright | (c) Justin Le 2018 |
|---|---|
| License | BSD3 |
| Maintainer | justin@jle.im |
| Stability | experimental |
| Portability | non-portable |
| Safe Haskell | None |
| Language | Haskell2010 |
Numeric.Backprop.Tuple
Contents
Description
Canonical strict tuples (and unit) with Num instances for usage with
backprop. This is here to solve the problem of orphan instances in
libraries and potential mismatched tuple types.
If you are writing a library that needs to export BVars of tuples,
consider using the tuples in this module so that your library can have
easy interoperability with other libraries using backprop.
Because of API decisions, backprop and gradBP only work with things
with Num instances. However, this disallows default Prelude tuples
(without orphan instances from packages like
NumInstances).
Until tuples have Num instances in base, this module is intended to
be a workaround for situations where:
This comes up often in cases where:
- A function wants to return more than one value (
BVars (T2a b) - You want to uncurry a
BVarfunction to use withbackpropandgradBP. - You want to use the useful
Prisms automatically generated by the lens library, which use tuples for multiple-constructor fields.
Only 2-tuples and 3-tuples are provided. Any more and you should probably be using your own custom product types, with instances automatically generated from something like one-liner-instances.
Lenses into the fields are provided, but they also work with _1, _2,
and _3 from Lens.Micro. However, note that these are incompatible
with _1, _2, and _3 from Control.Lens.
You can "construct" a with functions like
BVar s (T2 a b)isoVar.
Since: 0.1.1.0
- data T0 = T0
- data T2 a b = T2 !a !b
- t2Tup :: T2 a b -> (a, b)
- tupT2 :: (a, b) -> T2 a b
- uncurryT2 :: (a -> b -> c) -> T2 a b -> c
- curryT2 :: (T2 a b -> c) -> a -> b -> c
- t2_1 :: Lens (T2 a b) (T2 a' b) a a'
- t2_2 :: Lens (T2 a b) (T2 a b') b b'
- data T3 a b c = T3 !a !b !c
- t3Tup :: T3 a b c -> (a, b, c)
- tupT3 :: (a, b, c) -> T3 a b c
- t3_1 :: Lens (T3 a b c) (T3 a' b c) a a'
- t3_2 :: Lens (T3 a b c) (T3 a b' c) b b'
- t3_3 :: Lens (T3 a b c) (T3 a b c') c c'
- uncurryT3 :: (a -> b -> c -> d) -> T3 a b c -> d
- curryT3 :: (T3 a b c -> d) -> a -> b -> c -> d
- data T :: [Type] -> Type where
- indexT :: Index as a -> T as -> a
- tOnly :: T '[a] -> a
- onlyT :: a -> T '[a]
- tSplit :: Length as -> T (as ++ bs) -> (T as, T bs)
- tAppend :: T as -> T bs -> T (as ++ bs)
- tProd :: T as -> Tuple as
- prodT :: Tuple as -> T as
- tIx :: Index as a -> Lens' (T as) a
- tHead :: Lens (T (a ': as)) (T (b ': as)) a b
- tTail :: Lens (T (a ': as)) (T (a ': bs)) (T as) (T bs)
- tTake :: forall as bs cs. Length as -> Lens (T (as ++ bs)) (T (cs ++ bs)) (T as) (T cs)
- tDrop :: forall as bs cs. Length as -> Lens (T (as ++ bs)) (T (as ++ cs)) (T bs) (T cs)
- constT :: forall c as. ListC (c <$> as) => (forall a. c a => a) -> Length as -> T as
- mapT :: forall c as. ListC (c <$> as) => (forall a. c a => a -> a) -> T as -> T as
- zipT :: forall c as. ListC (c <$> as) => (forall a. c a => a -> a -> a) -> T as -> T as -> T as
Zero-tuples (unit)
Unit ('()') with Num, Fractional, and Floating instances.
Be aware that the methods in its numerical instances are all non-strict:
_ + _ =T0negate_ =T0fromIntegral_ =T0
Since: 0.1.4.0
Constructors
| T0 |
Two-tuples
Strict 2-tuple with Num, Fractional, and Floating instances.
Since: 0.1.1.0
Constructors
| T2 !a !b |
Instances
| Bifunctor T2 Source # | |
| Functor (T2 a) Source # | |
| (Eq b, Eq a) => Eq (T2 a b) Source # | |
| (Floating a, Floating b) => Floating (T2 a b) Source # | |
| (Fractional a, Fractional b) => Fractional (T2 a b) Source # | |
| (Data b, Data a) => Data (T2 a b) Source # | |
| (Num a, Num b) => Num (T2 a b) Source # | |
| (Ord b, Ord a) => Ord (T2 a b) Source # | |
| (Read b, Read a) => Read (T2 a b) Source # | |
| (Show b, Show a) => Show (T2 a b) Source # | |
| Generic (T2 a b) Source # | |
| (Semigroup a, Semigroup b) => Semigroup (T2 a b) Source # | |
| (Semigroup a, Semigroup b, Monoid a, Monoid b) => Monoid (T2 a b) Source # | |
| (Binary a, Binary b) => Binary (T2 a b) Source # | Since: 0.1.5.1 |
| (NFData a, NFData b) => NFData (T2 a b) Source # | |
| Field1 (T2 a b) (T2 a' b) a a' Source # | |
| Field2 (T2 a b) (T2 a b') b b' Source # | |
| type Rep (T2 a b) Source # | |
Conversions
If using lens, the two conversion functions can be chained with prisms and traversals and other optics using:
isotupT2t2Tup::Iso'(a, b) (T2a b)
Consumption
uncurryT2 :: (a -> b -> c) -> T2 a b -> c Source #
Uncurry a function to take in a T2 of its arguments
Since: 0.1.2.0
curryT2 :: (T2 a b -> c) -> a -> b -> c Source #
Curry a function taking a T2 of its arguments
Since: 0.1.2.0
Lenses
t2_1 :: Lens (T2 a b) (T2 a' b) a a' Source #
Lens into the first field of a T2. Also exported as _1 from
Lens.Micro.
t2_2 :: Lens (T2 a b) (T2 a b') b b' Source #
Lens into the second field of a T2. Also exported as _2 from
Lens.Micro.
Three-tuples
Strict 3-tuple with a Num, Fractional, and Floating instances.
Since: 0.1.1.0
Constructors
| T3 !a !b !c |
Instances
| Bifunctor (T3 a) Source # | |
| Functor (T3 a b) Source # | |
| (Eq c, Eq b, Eq a) => Eq (T3 a b c) Source # | |
| (Floating a, Floating b, Floating c) => Floating (T3 a b c) Source # | |
| (Fractional a, Fractional b, Fractional c) => Fractional (T3 a b c) Source # | |
| (Data c, Data b, Data a) => Data (T3 a b c) Source # | |
| (Num a, Num b, Num c) => Num (T3 a b c) Source # | |
| (Ord c, Ord b, Ord a) => Ord (T3 a b c) Source # | |
| (Read c, Read b, Read a) => Read (T3 a b c) Source # | |
| (Show c, Show b, Show a) => Show (T3 a b c) Source # | |
| Generic (T3 a b c) Source # | |
| (Semigroup a, Semigroup b, Semigroup c) => Semigroup (T3 a b c) Source # | |
| (Semigroup a, Semigroup b, Semigroup c, Monoid a, Monoid b, Monoid c) => Monoid (T3 a b c) Source # | |
| (Binary a, Binary b, Binary c) => Binary (T3 a b c) Source # | Since: 0.1.5.1 |
| (NFData a, NFData b, NFData c) => NFData (T3 a b c) Source # | |
| Field1 (T3 a b c) (T3 a' b c) a a' Source # | |
| Field2 (T3 a b c) (T3 a b' c) b b' Source # | |
| Field3 (T3 a b c) (T3 a b c') c c' Source # | |
| type Rep (T3 a b c) Source # | |
Conversions
If using lens, the two conversion functions can be chained with prisms and traversals and other optics using:
isotupT3t2Tup::Iso'(a, b, c) (T3a b c)
Lenses
t3_1 :: Lens (T3 a b c) (T3 a' b c) a a' Source #
Lens into the first field of a T3. Also exported as _1 from
Lens.Micro.
t3_2 :: Lens (T3 a b c) (T3 a b' c) b b' Source #
Lens into the second field of a T3. Also exported as _2 from
Lens.Micro.
t3_3 :: Lens (T3 a b c) (T3 a b c') c c' Source #
Lens into the third field of a T3. Also exported as _3 from
Lens.Micro.
Consumption
uncurryT3 :: (a -> b -> c -> d) -> T3 a b c -> d Source #
Uncurry a function to take in a T3 of its arguments
Since: 0.1.2.0
curryT3 :: (T3 a b c -> d) -> a -> b -> c -> d Source #
Curry a function taking a T3 of its arguments
Since: 0.1.2.0
N-Tuples
data T :: [Type] -> Type where Source #
Strict inductive N-tuple with a Num, Fractional, and Floating
instances.
It is basically "yet another HList", like the one found in Data.Type.Product and many other locations on the haskell ecosystem. Because it's inductively defined, it has O(n) random indexing, but is efficient for zipping and mapping and other sequential consumption patterns.
It is provided because of its Num instance, making it useful for
backproup. Will be obsolete when Product gets
numerical instances.
Since: 0.1.5.0
Instances
Conversions
If using lens, the two conversion functions can be chained with prisms and traversals and other optics using:
isoonlyTtOnly::Iso'a (T '[a])
Lenses
tTail :: Lens (T (a ': as)) (T (a ': bs)) (T as) (T bs) Source #
Lens into the tail of a T
Since: 0.1.5.0
Internal Utility
constT :: forall c as. ListC (c <$> as) => (forall a. c a => a) -> Length as -> T as Source #
Initialize a T with a Rank-N value. Mostly used internally, but
provided in case useful.
Must be used with TypeApplications to provide the Rank-N constraint.
Since: 0.1.5.0