我正在尝试这个(出于学习目的):
{-# LANGUAGE FlexibleInstances #-}
instance Monoid (a -> a) where
mempty = id
mappend f g = f . g
期待id <> id
等于id . id
然而,随着(id <> id) 1
我收到此错误:
Non type-variable argument in the constraint: Monoid (a -> a)
我应该改变什么来运行它?
这只是为了更好地理解幺半群和 Haskell 类型类,而不是为了任何实际用途.
这将需要{-# OVERLAPPING #-}pragma 因为 GHC.Base 有一个实例Monoid (a -> b)当 b 是幺半群时:
{-# LANGUAGE FlexibleInstances #-}
import Data.Monoid (Monoid, mempty, mappend, (<>))
instance {-# OVERLAPPING #-} Monoid (a -> a) where
mempty = id
mappend f g = f . g
然后,上面的实例将被调用a -> a
, 即使a
是一个幺半群:
\> (id <> id) 1
1
\> (id <> id) [1]
[1]
而与Monoid b => a -> b
来自 GHC.Base 的实例将被调用:
\> ((:[]) <> (:[])) 1
[1,1]
注意Data.Monoid
提供与你的完全相同的实例a -> a但是使用绕过了重叠newtype Endo a.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)