Magma 為代數結構的一種,擁有最單純定義,卻是其他代數結構的基礎。

定義

有一個集合與運算 ,隨意取出 中兩個元素 ,將兩者做運算的結果仍為集合 內的元素。

而在 fp-tsinterface 是這樣定義的

interface Magma<A> {
    readonly concat(first: A, second: A) => A
}

這裡的 A 就是你要給的集合 concat 就是你要定義的運算

實例

假設我要定義數字的相加的 Magma,會寫成這樣:

const MagmaAdd: Magma<number> = {
  concat: (first, second) => first + second,
};

加法太好聯想的,來點不一樣的,座標相加:

type Coord = {
  x: number;
  y: number;
};
 
const MagmaCoordAdd: Magma<Coord> = {
  concat: (first, second) => ({ x: first.x + second.x, y: first.y + second.y }),
};

結合律?交換律?

這是我們要注意的點,Magma 本身並沒有要求你要達成結合律交換律特性,只是我們用的加法剛好有而已,所以我們只要達成定義上 的條件,即可成為 Magma

參考資訊