Re:Manipulate Functions with the J Language
by yorwba on Sunday July 30, 2017 @02:15AM
(#14884637)
You could do something similar in "normal" functional programming languages, but you usually won't get the nice syntax.
Basically, you can represent each invertible function by a pair of functions (pseudo-Haskell, because I don't use it very often and can't test on mobile):
data Invertible a b = Invertible { forward :: a, backward :: b }
apply :: Invertible (a -> b) (b -> a) -> a
apply f a = forward f a
invert :: Invertible (Invertible a b -> Invertible b a) (Invertible b a -> Invertible a b)
invert = Invertible { forward = invert', backward = invert'}
where
invert' :: Invertible a b -> Invertible b a
invert f = Invertible { forward = backward f, backward = forward f}
Then you can for example invert invert itself by
apply invert invert == invert
But because there is no built-in language support, you'll end up doing lots of parallel construction of the standard library before you can even think of using it productively. Apparently someone already did that for Haskell (https://hackage.haskell.org/package/invertible), but it likely doesn't cover everything.
Basically, you can represent each invertible function by a pair of functions (pseudo-Haskell, because I don't use it very often and can't test on mobile):
Then you can for example invert invert itself by But because there is no built-in language support, you'll end up doing lots of parallel construction of the standard library before you can even think of using it productively. Apparently someone already did that for Haskell (https://hackage.haskell.org/package/invertible), but it likely doesn't cover everything.