a -> (b, c) = (a -> b, a -> c)
(b * c)^a = b^a * c^a
This is useful as common argument factoring and can optimize repeated function calls.
Another is the famous
(c^b)^a = c^(b * a)
a -> b -> c = (a, b) -> c
Which is curry/uncurry or the "product/exponential adjunction" in category theory.
Finally, consider
a^b * a^c = a^(b + c)
(b -> a, c -> a) = Either b c -> a
Which essentially says that given a tuple of functions we can choose which one we want to evaluate. Choose b and c to be unit and notice that `() -> a` is essentially `a` (after all, a^1 = a) and you'll have
a * a = a^2
(a, a) = Bool -> a
Which is the seed of a useful way of memorizing pure functions (look up memo-combinators for many more details).
Another is the famous
Which is curry/uncurry or the "product/exponential adjunction" in category theory.Finally, consider
Which essentially says that given a tuple of functions we can choose which one we want to evaluate. Choose b and c to be unit and notice that `() -> a` is essentially `a` (after all, a^1 = a) and you'll have Which is the seed of a useful way of memorizing pure functions (look up memo-combinators for many more details).