内函数作为幺半群

2023-12-09

我正在尝试这个(出于学习目的):

{-# 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(使用前将#替换为@)

内函数作为幺半群 的相关文章

随机推荐