看起来转换应该形成一个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磨砂膏所以我不确定如何解决这个问题 - 任何帮助?
答案 0 :(得分:2)
实际上错误消息很好地描述了它:a -> a
是一种过于具体的类型:
所有实例类型的格式必须为
(T a1 ... an)
其中a1 ... an
是不同的类型变量, 并且每个类型变量在实例头中最多出现一次。
T
这里是函数类型->
,您可以在没有特殊中缀符号的情况下编写
instance Monoid ((->) a a) where …
且显然a
只出现一次。
关于如何解决此问题,再次出现错误消息
如果要禁用此[限制],请使用
FlexibleInstances
。