代码之家  ›  专栏  ›  技术社区  ›  Raffael

如何对函数参数进行typeclass实例化?

  •  2
  • Raffael  · 技术社区  · 8 年前

    好吧,我能做到:

    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 是一个 有趣的 . 是 (<-) a b 也是 有趣的 ?

    1 回复  |  直到 8 年前
        1
  •  4
  •   K. A. Buhr    8 年前

    是的,但只能使用新类型:

    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 在实例中,声明尚未完全应用。

    (->) 构造函数将其包装为如上所述的新类型。

    推荐文章