转换集f :: a->形成一个关于函数组合的monoid - 如何使它成为Monoid的一个实例?

时间:2017-01-10 03:08:14

标签: haskell functional-programming category-theory monoids

看起来转换应该形成一个Monoid,其中identity函数作为空元素,标准函数组成作为二元操作。我不认为它特别有用,但它应该是可能的。有点像:

instance Monoid (a -> a) where
        mempty = id
        mappend f g = (.)

以上内容无法编译,可能是因为它被预先存在的定义掩盖了

instance Monoid b => Monoid (a -> b) where
    mempty _ = mempty
    mappend f g x = f x `mappend` g x

错误是:

Illegal instance declaration for ‘Monoid (a -> a)’
      (All instance types must be of the form (T a1 ... an)
       where a1 ... an are *distinct type variables*,
       and each type variable appears at most once in the instance head.
       Use FlexibleInstances if you want to disable this.)
    In the instance declaration for ‘Monoid (a -> a)’

我仍然是Haskell磨砂膏所以我不确定如何解决这个问题 - 任何帮助?

1 个答案:

答案 0 :(得分:2)

实际上错误消息很好地描述了它:a -> a是一种过于具体的类型:

  

所有实例类型的格式必须为(T a1 ... an)   其中a1 ... an不同的类型变量,   并且每个类型变量在实例头中最多出现一次。

T这里是函数类型->,您可以在没有特殊中缀符号的情况下编写

instance Monoid ((->) a a) where …

且显然a只出现一次。

关于如何解决此问题,再次出现错误消息

  

如果要禁用此[限制],请使用FlexibleInstances