如何使函数参数接受类型类实例化?

时间:2018-08-31 23:17:11

标签: haskell

好的,我可以这样做:

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 bFun(<-) a b也是Fun吗?

1 个答案:

答案 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尚未完全应用。

将参数的顺序翻转到(->)构造函数的另一种方法是将其包装为上述的新类型。