Rustを数学で理解したい(1)
こんにちは学生エンジニアのkazuです!
今回は私が最も好きな言語Rustを数学的に理解したいなと思ったので書いていこうと思います。
完全に私情なのですが、大学に編入している関係で一年生の必修授業を取る必要があり、そこで線形代数について勉強する中で、Rustに適用出来そうな概念はやはり多いと感じました。
当然関数型に及ばないとは思いますが、適用できる考え方は積極的に適用したいと思っていたのでもう一度整理してみようと考えました。
もちろん関数型で理解するのが一番早いと思いますが、Rustと数学を絡めた記事がなかったので書いてみました。
積型
積型とは数学でいう直積を型で表現した型です。
シンプルに言ってしまえばstruct、tupleのように複数のフィールドを持つ型という事です。
数学の記号で表すと
積型について語る事はそこまでないと思うので次に行きます。
直和型
Rustの便利な構文の1つである直和型は、Rustを数学で表現する代表例だと考えます。
まず数学的な意味での直和とは
しかしRustにおいて直和の概念は少しだけ異なります。
以下にその式を示します。
この式の意味は、「集合Aの各要素に0を、集合Bの各要素に1をタグとして付ける」というものです。
Rustのenumもまったく同じ仕組みを持ちます。
この違いが何を意味するのか。
数学的な意味では$A \cap Bは直和に含まれないつまりA \xor Bであるのに対して、RustはAとBに関係のない一意なタグ(例の場合は1と0)を付与してタプルのようなものとすることで、それらを直和とすると定義しています。
そうする事により、
これによって本来数学的定義では許されなかった以下のような定義を可能にしているわけです。
enum Source {
FromA(i32), // Aの要素
FromB(i32), // Bの要素
}
つまりこの場合FromAが0、FromBが1のタグに対応するわけです。
それではもっと深くRustのenumについて掘り下げていきましょう。
数学からは逸れますが他の言語にもenumという概念は存在します。
しかし関数型とRustのenumと他の言語のenumでは決定的な差があります。
それはADT(Algebraic data type)かそうでないかです。
ADTでは先ほど紹介したenumのようにタグとその中に値を保持する事が出来ます。
つまり直積型と直和型を合体させた型を作成する事が出来るわけです。
Option<T>やResult<T>もこれを用いて実装されています。
一方でC言語ではenumはあくまでタグしか受け付けず、その中に値を保持する事はできません。
まとめ
今回は主に直和型、積型について触れました。
次回以降(あるかはわからない)はもっと数学的な話をしていきたいと思います。
Discussion