美文网首页代码改变世界
函数式编程基本概念理解一: Semigroup,Monoid

函数式编程基本概念理解一: Semigroup,Monoid

作者: jimson_ma | 来源:发表于2023-05-16 23:03 被阅读0次

实践函数式编程有几个概念是抽象的,但也是基础的,能够正确的理解它们,决定着我们如何更好的使用函数式编程。本文以 FP-TS 为例描述下我对这些概念的理解。

文中大写字符代表一个类型(一组值的集合), 小写字符代表一个值。


Semigroup (半群)


Semigroup 是指一个类型联合一个二元操作*,满足以下的规律:

  1. 对于 A 中的任何 a, b, 通过该操作 *得到的 c 也属于 A, 即 a * b = ca,b,c同属于类型 A.
  2. 该操作满足结合律,即 (a * b) * c = a * (b * c)

我们就称他们为Semigroup

比如我们知道的自然数和加法 +就是满足这个规律的。自然数和乘法 x也是满足的。但是自然数和减法 -就不满足了,两个自然数相减可能是负数,不是自然数,同时减法也不满足结合律。 同样对于字符串和 + 也是满足的。布尔类型和 && 也满足。可以称之为自然数和加法构成的半群,自然数和乘法构成的半群,字符串和 +构成的半群,布尔类型和 && 构成的半群。

在 FP-TS 中定义如下,操作 *concat

interface Semigroup<A> {
  concat: (x: A, y: A) => A
}

concat(concat(x, y), z) == concat(x, concat(y, z)); // true

当我们在逻辑中需要合并等功能时,考虑可否能够使用Semigroup。 它也是我们的功能可否并行执行的基础。

可以自定义Semigroup:

const semigroupSum: Semigroup<number> = {
  concat: (x, y) => x + y
}

Monoid (幺半群)


延续上面的内容,如果存在一个 Semigroup<A> ,可以找到一个唯一的一个值 e,使其能够满足:

  1. concat(x, e) == concat(e, x) == x
  2. e 属于类型 A

e 我们称之为幺元,所以可以理解 Monoid (幺半群) 为存在 幺元Semigroup (半群)

比如正整数和乘法就能构成Monoid (幺半群)1 就是那个幺元,但是正整数和加法就不行,找不到幺元,只能称之为Semigroup (半群),因为它的幺元0, 如果要自然数和加法,则可以是Monoid (幺半群) 。同理字符串和 +里的空字符串''是它的幺元。数组中的空数组等都可以做幺元

在 FP-TS 中定义如下,操作 *concat

interface Monoid<A> extends Semigroup<A> {
  readonly empty: A
}

可以自定义Monoid

/** number `Monoid` under addition */
const monoidSum: Monoid<number> = {
  concat: (x, y) => x + y,
  empty: 0
}

/** number `Monoid` under multiplication */
const monoidProduct: Monoid<number> = {
  concat: (x, y) => x * y,
  empty: 1
}

const monoidString: Monoid<string> = {
  concat: (x, y) => x + y,
  empty: ''
}

/** boolean monoid under conjunction */
const monoidAll: Monoid<boolean> = {
  concat: (x, y) => x && y,
  empty: true
}

/** boolean monoid under disjunction */
const monoidAny: Monoid<boolean> = {
  concat: (x, y) => x || y,
  empty: false
}

参考:
https://dev.to/gcanti/getting-started-with-fp-ts-semigroup-2mf7
https://dev.to/gcanti/getting-started-with-fp-ts-monoid-ja0

相关文章

  • 理解 Monad --- 1

    梳理这些概念:group、semigroup、monoid、functor、endofunctor、combina...

  • Rxswift(一)函数响应式编程思想

    @TOC 1. 函数响应式编程思想必备基本概念简介 函数式编程 在计算机科学里,函数式编程是一种编程范式,它将计算...

  • 函数式编程(一)—— 前置知识

    为什么要学函数式编程? 什么是函数式编程?函数式编程和面向对象编程的不同对于函数式编程思维方式的理解: 函数式编程...

  • 简单点,理解iOS与函数式编程

    简单点,理解iOS与函数式编程 简单点,理解iOS与函数式编程

  • pandas apply() 函数用法

    理解 pandas 的函数,要对函数式编程有一定的概念和理解。函数式编程,包括函数式编程思维,当然是一个很复杂的话...

  • 浅学函数式编程

    函数式编程基本概念 为什么学习函数式编程 函数式编程是随着 React 的流行受到越来越多的关注 Vue3也开始拥...

  • JavaScript:函数式编程基本概念学习

    基本概念 函数式编程(Functional programming)与面向对象编程(Object-oriented...

  • 函数式编程入门

    编程思路的概念[补充] 函数式编程思维范畴论基本理论基本概念纯函数函数的柯里化函数的组合Point Free声明式...

  • 5.纯函数

    理解JavaScript纯函数 函数式编程中有一个非常重要的概念叫纯函数,JavaScript符合函数式编程的范式...

  • 函数式编程 - 有趣的Monoid(单位半群)

    前言 Monoid(中文:单位半群,又名:幺半群),一个来源于数学的概念;得益于它的抽象特性,Monoid在函数式...

网友评论

    本文标题:函数式编程基本概念理解一: Semigroup,Monoid

    本文链接:https://www.haomeiwen.com/subject/mpnbsdtx.html