我想像泛化($)
一样进行Control.Category
泛化(.)
,并且我已经使用本文末尾的代码(也是 ideone)这样做了。
在这段代码中,我创建了一个名为FunctionObject
. 此类具有具有($)
以下签名的函数:
($) :: f a b -> a -> b
自然地,我创建(->)
了这个类的一个实例,以便$
继续使用普通函数。
但这允许您创建特殊函数,例如,知道它们自己的逆函数,如下例所示。
我已经得出结论,有以下三种可能性之一:
- 我是第一个想到的。
- 其他人已经做到了,而我正在重新发明轮子。
- 这是个坏主意。
选项 1 似乎不太可能,我在hayoo上的搜索没有显示选项 2,所以我怀疑选项 3 最有可能,但如果有人能解释为什么会这样,那就太好了。
import Prelude hiding ((.), ($))
import Control.Category ((.), Category)
class FunctionObject f where
($) :: f a b -> a -> b
infixr 0 $
instance FunctionObject (->) where
f $ x = f x
data InvertibleFunction a b =
InvertibleFunction (a -> b) (b -> a)
instance Category InvertibleFunction where
(InvertibleFunction f f') . (InvertibleFunction g g') =
InvertibleFunction (f . g) (g' . f')
instance FunctionObject InvertibleFunction where
(InvertibleFunction f _) $ x = f $ x
inverse (InvertibleFunction f f') = InvertibleFunction f' f
add :: (Num n) => n -> InvertibleFunction n n
add n = InvertibleFunction (+n) (subtract n)
main = do
print $ add 2 $ 5 -- 7
print $ inverse (add 2) $ 5 -- 3