Semigroup

class Semigroup a where
(<>) :: a -> a -> a
sconcat :: NonEmpty a -> a
stimes :: Integral b => b -> a -> a class Semigroup a => Monoid a where
mempty :: a mappend :: a -> a -> a
mappend = (<>) mconcat :: [a] -> a
mconcat = foldr mappend mempty

半群(Semigroup)是个类型类,它是幺半群(Monoid)的基类。

Prelude Data.List.NonEmpty Data.Semigroup> Sum 3 <> Sum 4
Sum {getSum = 7}
Prelude Data.List.NonEmpty Data.Semigroup> sconcat $ Sum 3 :| [Sum 4]
Sum {getSum = 7}
Prelude Data.List.NonEmpty Data.Semigroup> [3] <> [4]
[3,4]
Prelude Data.List.NonEmpty Data.Semigroup> sconcat $ [3] :| [[4]]
[3,4]
Prelude Data.List.NonEmpty Data.Semigroup> stimes 3 [3]
[3,3,3]
Prelude Data.List.NonEmpty Data.Semigroup> (1 :| [2]) <> (1 :| [2])
1 :| [2,1,2]
Prelude Data.List.NonEmpty Data.Semigroup> stimes 3 $ 1 :| [2]
1 :| [2,1,2,1,2]
Prelude Data.List.NonEmpty Data.Semigroup> stimes 3 $ Sum 3
Sum {getSum = 9}

运算符 <> 的实现与 Monoid 中的 mempty 同义。

sconcat a 将 NonEmpty 列表 a 中的各个元素用运算符 <> 连接起来。

stimes b a 将 a 重复 b 次,然后用运算符 <> 连接起来。

Haskell语言学习笔记(71)Semigroup的更多相关文章

  1. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  2. Haskell语言学习笔记(79)lambda演算

    lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...

  3. Haskell语言学习笔记(69)Yesod

    Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...

  4. Haskell语言学习笔记(20)IORef, STRef

    IORef 一个在IO monad中使用变量的类型. 函数 参数 功能 newIORef 值 新建带初值的引用 readIORef 引用 读取引用的值 writeIORef 引用和值 设置引用的值 m ...

  5. Haskell语言学习笔记(39)Category

    Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...

  6. Haskell语言学习笔记(72)Free Monad

    安装 free 包 $ cabal install free Installed free-5.0.2 Free Monad data Free f a = Pure a | Free (f (Fre ...

  7. Haskell语言学习笔记(44)Lens(2)

    自定义 Lens 和 Isos -- Some of the examples in this chapter require a few GHC extensions: -- TemplateHas ...

  8. Haskell语言学习笔记(38)Lens(1)

    Lens Lens是一个接近语言级别的库,使用它可以方便的读取,设置,修改一个大的数据结构中某一部分的值. view, over, set Prelude> :m +Control.Lens P ...

  9. Haskell语言学习笔记(92)HXT

    HXT The Haskell XML Toolbox (hxt) 是一个解析 XML 的库. $ cabal install hxt Installed hxt-9.3.1.16 Prelude&g ...

随机推荐

  1. Java内存泄漏简单说明

    Java语言的一个关键的优势就是它的内存管理机制.你只管创建对象,Java的垃圾回收器帮你分配以及回收内存.然而,实际的情况并没有那么简单,因为内存泄漏在Java应用程序中还是时有发生的. 下面就解释 ...

  2. netbeans运行项目时,弹出“cannot be run from folder that contains non-ASCII characters in path”的对话框 解决方法

    netbeans运行项目时,弹出“cannot be run from folder that contains non-ASCII characters in path”的对话框,原因是项目路径中有 ...

  3. webpack 配置案例for angular babel

    1.dev.js: const webpack = require('webpack'); const webpackUglifyJsPlugin = require('webpack-uglify- ...

  4. 最小化安装CentOS 7后,图形界面的安装(GNOME、KDE等)

    安装图形化界面: 1.首先安装X(X Window System),命令为 yum groupinstall "X Window System" 2.检查一下我们已经安装的软件以及 ...

  5. 【Jmeter自学】JMeter的安装(一)

    ==================================================================================================== ...

  6. 剑指Offer(三):从尾到头打印链表

    说明: 1.本系列是根据<剑指Offer>这个系列做的一个小笔记. 2.直接动力是因为师兄师姐找工作很难,而且机械出生的我面试算法更难. 3.刚开始准备刷LeetCode.LintCode ...

  7. Basler和Matrox的配置及调试

    说明: 本系列博文是我自己研究生课题,采用做一步记录一步,在论文答辩结束或者机器设计结束之后才会附上源代码! 自从装好相机和设计好机械结构之后就没有继续进行下一步,这段时间花了三四天继续上次任务进行, ...

  8. jquery前期总结,及实例

    一.元素查找 1.选择器 id=d------------------------------------------>$("#d") class=c1----------- ...

  9. JavaScript正则表达式以及字符串处理

    正则表达式之基本概念 在我们写页面时,往往需要对表单的数据比如账号.身份证号等进行验证,而最有效的.用的最多的便是使用正则表达式来验证.那什么是正则表达式呢? 正则表达式(Regular Expres ...

  10. JAVA 本地序列化。

    HashMap map = new HashMap(); map.put("province", "北京"); map.put("coding&quo ...