はじめに
数式とPython式の対応関係をまとめてみた - Qiita を Haskell に置き換えてみました。良質な記事をありがとうございます。
記号論理
数式における $X$ および $Y$ は命題、 $A$ は集合、 $P$ は述語を、Haskell における $X$ および $Y$ は Bool 型の値、 $A$ はリスト型の値、 $P$ は Bool 型の値を返す関数を表すとします。
| 意味 | 数式 | Haskell |
|---|---|---|
| 論理積 | $X \land Y$ | X && Y |
| 論理和 | $X \lor Y$ | X || Y |
| 論理否定 | $\lnot X$ | not X |
| 論理包含 | $X \Rightarrow Y$ | not X || Y |
| 全称限量記号 | $\forall a \in A, P(a)$ | and [P a | a <- A] |
| 存在限量記号 | $\exists a \in A, P(a)$ | or [P a | a <- A] |
and, or は Prelude モジュールの関数で、結構便利です。
集合論
数式における $A$ および $B$ は集合を、$P$ は述語を、Haskell における $A$ および $B$ はリスト型の値、 $P$ は Bool 型の値を返す関数とします。
| 意味 | 数式 | Haskell |
|---|---|---|
| 内包表記 | $\{a \mid a \in A, P(a) \}$ | [a | a <- A, P a] |
| 元である | $a \in A$ | a `elem` A |
| 元でない | $a \notin A$ | not (a `elem` A) |
| 部分集合 | $A \subseteq B$ | all (`elem` B) A |
| 真部分集合 | $A \subset B$ | all (`elem` B) A && not (all (`elem` A) B) |
| 積集合 | $A \cap B$ | A `intersect` B |
| 和集合 | $A \cup B$ | A `union` B |
| 差集合 | $A \setminus B$ | A \\ B |
| べき集合 | $2^{A}$ | filterM (\_ -> [True, False]) A |
| 直積集合 | $A \times B$ | [[x, y] | x <- A, y <- B] |
| 最大値 | $\max{A}$ | foldr1 max A |
| 最小値 | $\min{A}$ | foldr1 max A |
| 濃度 | $ \mid A \mid$ | length A |
intersect、union、\\ は Data.List で定義されている関数、filterM は Control.Monad で定義されている関数です。
真部分集合を扱うことはほとんどないと思いますが、Haskell で表現しようとするとしんどいですね。
定数
pi は Prelude モジュールで定義されている値です。
| 意味 | 数式 | Haskell |
|---|---|---|
| 0 | $0$ | 0 |
| 1 | $1$ | 1 |
| 円周率 | $\pi$ | pi |
| ネイピア数 | $e$ | N/A 1 |
| 虚数単位 | $i$ | N/A 2 |
Haskell では、複素数を 4 :+ 2 のように表せます。
代数学
数式における $n$ は自然数、$A$ は集合、$f$ は $\mathbb{N} \rightarrow \mathbb{R}$ なる写像、$g$ は $A \rightarrow \mathbb{R}$ なる写像、$m$ は非負の整数、 $x$ および $y$ は実数、$z$ は複素数、Haskell式における n は 1 以上の Integral 型の値、$A$ はリスト型の値、f、g は Num 型の値を返す関数、m は 0 以上の Integral 型の値、 x および y は Num 型の値、z は Data.Complex 型の値を表すとします。
| 意味 | 数式 | Haskell |
|---|---|---|
| 総和 | $\sum_{i=1}^{n} f(i)$ | sum (map f [1..n]) |
| 総和 | $\sum_{a \in A} g(a)$ | sum (map g A) |
| 総乗 | $\prod_{i=1}^{n} f(i)$ | product (map f [1..n]) |
| 総乗 | $\prod_{a \in A} g(a)$ | product (map f A) |
| 階乗 | $m!$ | product [1..m] |
| 天井関数 | $\lceil x \rceil $ | ceiling x |
| 床関数 | $\lfloor x \rfloor $ | floor x |
| 絶対値 | $\mid x \mid $ | abs x |
| 実部 | $\Re{z}$ | (z :+ _) |
| 虚部 | $\Im{z}$ | (_ :+ z) |
| 指数 | $x^y$ | x ** y |
| 冪根 | $\sqrt[m]{x}$ | x ** (1 / m) |
:+ は Data.Complex で定義されるデータコンストラクタです。
おわりに
標準ライブラリだけでも、多くの数式をきれいな Haskell で表現できますね。