好的,我可以这样做:
class Fun fun where
fm :: (b -> b) -> fun b -> fun b
instance Fun ((->) a) where
fm g f = g . f
我还可以针对参数而不是结果实例化Fun
吗?
类似这样的东西:
instance Fun (\x -> (->) x a) where
fm g f = f . g
这只是概念性的,因为我不知道如何正确编写它-但我希望这个想法能弄清楚。
我也尝试过:
type F b a = (->) a b
instance Fun (F b) where
fm g f = f . g
但这似乎有根本缺陷。
换句话说:(->) a b
是Fun
。 (<-) a b
也是Fun
吗?
答案 0 :(得分:4)
是的,但只有一个新类型:
newtype BackFun a b = BackFun (b -> a)
instance Fun (BackFun a) where
fm g (BackFun f) = BackFun (f . g)
问题在于,即使具有扩展名,您也不能在实例声明中使用部分应用的类型别名,因此:
type F b a = (->) a b
instance Fun (F b)
不起作用,因为实例声明中的F b
尚未完全应用。
将参数的顺序翻转到(->)
构造函数的另一种方法是将其包装为上述的新类型。