[Haskell] Monoid

class Monoid m where
  mempty :: m
  mappend :: m -> m -> m
  mconcat :: [m] -> m
  mconcat = foldr mapend mempty

其中m是一个具体类型(:k m = *)。

注:
<u></u>foldr定义为:

foldr :: (a -> b -> b) -> b -> [a] -> b
foldr step zero (x:xs) = step x (foldr step zero xs)
foldr _      zero []        = zero

Monoid Law
(1)mempty `mapend` x = x
(2)x `mappend` mempty = x
(3)(x `mappend` y) `mappend` z = x `mappend` (y `mappend` z)

Examples

(1)[a]是Monoid类型类的实例

instance Monoid [a] where
  mempty = []
  mappend = (++)
ghci> [1, 2, 3] `mappend` [4, 5, 6]
[1, 2, 3, 4, 5, 6]

ghci> (“one ” `mappend` “two ”) `mappend` “three”
“one two three”

其中,:t “one” = [Char]

(2)Any是Monoid类型类的实例

newtype Any = Any { getAny :: Bool }
  deriving (Eq, Ord, Read, Show, Bounded)

instance Monoid Any where
  mempty = Any False
  Any x `mappend` Any y = Any (x || y)

注:
(1):k Any = *
(2)“instance Monoid Any where”中的Any是类型,“mempty = Any False”和“Any x `mappend` Any y = Any (x || y)”中的Any是值构造器

ghci> getAny $ Any True `mappend` Any False
True

其中getAnyAny类型的字段读取器。

(3)Maybe a是Monoid类型类的实例

instance Monoid a => Monoid (Maybe a) where
  mempty = Nothing
  Nothing `mappend` m = m
  m `mappend` Nothing = m
  Just m1 `mappend` Just m2 = Just (m1 `mappend` m2)
ghci> Nothing `mappend` Just “andy”
Just “andy”
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,049评论 19 139
  • 一年级语文上册生字表 生字表一(共400字) 啊(ā)爱(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang阅读 2,897评论 0 6
  • TF API数学计算tf...... :math(1)刚开始先给一个运行实例。tf是基于图(Graph)的计算系统...
    MachineLP阅读 3,578评论 0 1
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,625评论 0 17
  • 那一片圣洁的蓝 文/林子 在朝圣的路上颠簸 林风飞扬起你的白发 映衬着那片圣洁的蓝 佝偻的脊背愈发虔诚 为了心中的...
    芝麻的微光阅读 219评论 0 3