Open2

Haskellと数学

とさとさ

関手(functor)

定義(ベーシック圏論より引用)

\mathscr{A}, \mathscr{B}を圏とする. 関手(functor)F: \mathscr{A} \rightarrow \mathscr{B}とは,

  1. A \rightarrow F(A)と書かれる関数
ob(\mathscr{A}) \rightarrow ob(\mathscr{B})
  1. A, A' \in \mathscr{A}についてf \rightarrow F(f)と書かれる関数
\mathscr{A}(A, A') \rightarrow \mathscr{B}(F(A), F(A'))

からなり以下の公理を満たすもののことである.

  1. \mathscr{A}A\rightarrow^{f} A' \rightarrow^{f'} A''となるものについてF(f' \circ f)= F(f')\circ F(f)
  2. A\in \mathscr{A}についてF(1_A) = 1_{F(A)}

Haskell

fmap :: (a -> b) -> f a -> f b

このfmap関数が定義の2番に対応する. 定義通りこの関数を読むのであれば、a -> bへの関数を f a -> f bへの関数に変換していると読める。

fは以下の性質を満たす必要がある

Identity
fmap id == id
Composition
fmap (f . g) == fmap f . fmap g

Identityが4, Compositionが3の性質に対応する。
fがfunctorと対応していることがわかる。

https://hackage.haskell.org/package/base-4.16.1.0/docs/Data-Functor.html#v:fmap

とさとさ

半群 (Semigroup)

集合Sとその上の二項演算\cdot: S \times S \rightarrow Sが与えられた時、組み(S, \cdot)が以下の条件を満たすならば、これを半群という。

結合律

Sの格元a, b, cに対して、等式(a \cdot b) \cdot c = a \cdot (b \cdot c)が満たされる。

演算が定義されていて結合律を満たせば半群である。

https://ja.wikipedia.org/wiki/半群

Haskell

Haskellでも半群の定義は以下の通り。Instanceはx <> (y <> z) = (x <> y) <> zを満たす必要があるがこれは半群の定義のまま。演算子は<>である

-- @since 4.9.0.0
class Semigroup a where
        -- | An associative operation.
        --
        -- >>> [1,2,3] <> [4,5,6]
        -- [1,2,3,4,5,6]
        (<>) :: a -> a -> a

https://hackage.haskell.org/package/base-4.16.1.0/docs/Data-Semigroup.html