好吧,我能做到:
class Fun fun where fm :: (b -> b) -> fun b -> fun b instance Fun ((->) a) where fm g f = g . f
我也可以实例化吗 Fun
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 是一个 有趣的 . 是 (<-) a b 也是 有趣的 ?
(->) a b
有趣的
(<-) a b
是的,但只能使用新类型:
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 在实例中,声明尚未完全应用。
F b
(->) 构造函数将其包装为如上所述的新类型。
(->)