代数データ型の直積型と直和型の理解

代数データ型という考え方があって、型に対する代数的な操作を行うものっぽいです。代数的な操作というのは、足し算とか掛け算ですね。直和型と直積型というのがあります。

直積型は構造体のようなもので、Javaだとrecordが導入されましたね。

record A(int p1, boolean p2) {}

みたいなものです。
これがなぜ積なのかというと、このレコードAの取りうる値の組み合わせは、intの値のパターン数(2 ^ 32) × booleanの値のパターン数(2)で2 ^ 33になるからなんだと思います。

直和型は、型がこれかこれ、みたいになるやつです。Javaだとtry-catchのcatch句に直和型が指定できて、この例外かこの例外、みたいな書き方ができますね。

catch (NullPointerException | NumberFormatException ex) 

あとsealed classが導入されたので同じようなことができます。

sealed interface B permits C, D {
}
record C(int n) implements B{}
record D(boolean f) implements B{}

こうすると、型Bは型Cか型Dの値を扱えることになります。このとき、型Bの取りうる値の組み合わせは、型Cの取りうる値の組み合わせ(2 ^ 32)と型Dの取りうる値の組み合わせ(2)を足したものになって2 ^ 32 + 2になります。*1
なので直和型ですね。

ということを忘れないようにメモ

*1:Javaの場合、nullも扱えるので2 ^ 32 + 2 + 1になりますね。滅ぼすべき