はじめに
数式と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 で表現できますね。