LoginSignup
24
9

More than 5 years have passed since last update.

数式と Haskell 式の対応関係をまとめてみた

Last updated at Posted at 2018-07-25

はじめに

数式と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, orPrelude モジュールの関数で、結構便利です。

集合論

数式における $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

intersectunion\\Data.List で定義されている関数、filterMControl.Monad で定義されている関数です。

真部分集合を扱うことはほとんどないと思いますが、Haskell で表現しようとするとしんどいですね。

定数

piPrelude モジュールで定義されている値です。

意味 数式 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$ はリスト型の値、fgNum 型の値を返す関数、m は 0 以上の Integral 型の値、 x および yNum 型の値、zData.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 で表現できますね。


  1. ネイピア数をリーズナブルに表現する関数は Haskell には(多分)存在しません 

  2. Haskell では虚数単位は存在しませんが、敢えて表すとするなら 0 :+ 1 でしょうか 

24
9
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
9