🌽

集合としてのデータ型(物理的・論理的な捉え方)

2022/07/08に公開

「データ型は値の集合として捉えることができる」とよく聞くのですが、どうしてもその考えが自分的にはしっくりきませんでした。データ型って結局はメモリスペースのことなのに、それをなぜ集合として考えることができるのでしょうか。この記事では「こんな風に考えると、データ型=集合としてわかりやすくなるかも..」というのを書いてみます。(コードは主にHaskellを使っていきます。)

データ型とは?

そもそもデータ型とは何でしょうか。データ型とはこれから扱うデータの種類・大きさをコンピュータに伝える情報です。文字列/整数/小数/10桁/1万桁など、開発する人が扱う情報をコンピュータへ知らせる役割を持っています。

num1 :: Int
num2 :: Int
num1 = 10
num2 = 20
main = print $ num1 + num2

例えばこちらでは変数num1、num2にInt型を指定しています。int型は4バイト・整数を扱うとして、numが扱うデータに制限を加えます。このように変数・関数に対して扱うデータ型の種類を決める役割を果たしています。

なぜデータ型は必要?

ではなぜデータ型は必要なのでしょうか。プログラミングにおいてデータ型が重要な理由は3つあります。

1、計算可能なデータを定義するため
2、大きさを正確に把握するため
3、コードを読み書きしやすくするため

1、計算可能なデータを定義するため

例えば以下のような計算をすると多くの場合、エラーになりますよね。(10HelloWorldと出ることもありますが、それは置いておきます。)

10 +HelloWorld

Int型とString型の足し算という、データ型が一致しないモノ同士での計算だからです。一緒に計算できるデータ、一緒には計算できないデータ..という計算の種類を定義できます。

2、大きさを正確に把握するため

そもそもデータの種類・大きさによって必要なメモリスペースは異なります。10と100万では100万の方がたくさんスペースが必要になりますし、小数点以下は何桁か?何文字必要か?によっても違います。それぞれに合った形でデータを扱うために、データ型は必要となります。

3、コードを読み書きしやすくするため

データ型は「この変数ではこのようなデータを扱いたい!」と人間側へ情報を伝えることができます。ある意味ではプログラムの設計書とも言えます。データ型によって変数・関数の用途を指定することで、プログラムについての情報を伝えたり、あらかじめその内容を規定できます。データ型はコードを読み解く上で大切な「情報源」ともなります。

ビルディングから集合へ

ここまでデータ型とは何か?どんな目的があるか?といった基本を確認してきました。ここからデータ型の物理的・論理的な形に注目します。物理的にデータ型とはメモリスペースですが、論理的には集合として扱うことができます。2つの形態に注目します。

物理的な形:ビルディング

まず物理的なデータ型の形からです。データ型とは物理的にはメモリスペースのことを指します。私たちが変数を宣言した場合、このようなビルディングからスペースが確保されることとなっています。Int:4バイト、Char:1バイト..というように、データ型が宣言されるとその大きさ分、メモリスペースが確保されます。

どんな種類・性質のデータが入るかわからない

物理的な形としてはメモリスペースであることには間違いないですが1つ問題があります。それはそこに入るデータの種類・性質がわかりづらい点です。 例えばInt型で4バイトの大きさを確保することはわかったのですが、そこに入るデータの種類・性質は何でしょうか。整数、-2147483648~2147483647、10などが入る..といった、私たちがコードを書く上で最も大切な情報は分かりづらいですよね。

論理的:私たちが考えやすい

もっと私たちが扱いやすい/考えやすいようにすることはできないでしょうか。論理的なデータ型の形というのは、人間がもっと扱いやすい/考えやすいという意味です。そこでデータ型をメモリスペースではなく、集合として考えることにしました。(実際の形とはあくまで違う点に注意して下さい。)

集合としてのデータ型

データ型を「値の集合」として捉え直したのがこちらです。例えばInt型の集合に属するデータはこの中から1つの値を取るようになります。

Int = -2147483648 ~ 2147483647
Char = -128 ~ 127
Double = 1.7E +/- 308 (15 桁)

こうすると「どんなデータを扱うか?」というのが一目でわかりますよね。メモリスペースよりももっと直感的にデータ型の性質が理解できそうです。

(C++ですがこんな記事もあったので参考にすると良いかもしれません。)

https://docs.microsoft.com/ja-jp/cpp/cpp/data-type-ranges?view=msvc-170

データ型を集合として捉えるメリット

そしてデータ型を集合として捉えられるようになると、データ型にまつわる難しい概念が非常に理解しやすくなります。例えば代数的データ型ではOR条件としてデータを扱うことができます。これを集合として捉えるとこのようになります。

data Color = red | blue | yellow

Color型を持つ値はred | blue | yellowのどれかを値として持ち得るのですが、これは集合として考えるとわかりやすいですよね。

また型クラスなどはどうでしょうか。型クラスは型クラスとはデータ型をグループ化し共通の関数を実装する仕組みです。 データ型同士に関係性を持たせるための機能となっています。Num型クラスでは計算に使えるデータ型をグルーピングできます。

・そこに属する値がどのように振る舞うのか?
・型によってデータをどのように分類するか?
といった抽象的にデータ型を扱う場面が増えると、集合として考えるとスッキリ理解できることも増えるかと思います。(こんな捉え方もあるよ!などアドバイスありましたら教えて頂けますと幸いです。)

Discussion