値には、種類がある
手がかりの正体
前のレッスンであなたは、1 + (1 == 2) を読んだだけで「おかしい」と見抜きました。手がかりは何だったのか。値の種類です。
minilangの世界の値を、ぜんぶ数え上げてみます。1 や 42 のような数。1 == 2 の答えである真偽(true / false)。そして実は、コース2で学んだとおり関数も値でした。種類は、この3つで全部です。
種類がちがうと、できることがちがう
「値に種類がある」だけなら、ただの分類です。大事なのはその先——種類によって、できる操作がちがうことです。
ここには数が要りますが、true/falseが来ました。
数どうしは足せます。真偽どうしは == でくらべられます。でも数に真偽は足せません。この「できる・できない」の地図を、ことばの世界では型と呼びます。型とは、値の種類と、その種類にゆるされた操作の決まりのことです。
操作にも、型がある
「できる・できない」を、もう一段はっきり書けます。操作のほうに「何を受け取り、何を返すか」の札をつけるのです。
| 操作 | 受け取るもの | 返すもの |
|---|---|---|
+ - * / | 数 と 数 | 数 |
< > <= >= | 数 と 数 | 真偽 |
== != | 同じ型どうし | 真偽 |
if の条件 | 真偽 | — |
この表が引ければ、式の型は中身を計算しなくてもたどれます。(1 + 2) == 3 なら——1 + 2 は表から数、数 == 数 は表から真偽。答えの true を出すまでもなく、「この式は真偽になる」と言い切れるのです。
⟡ よりみち:計算せずに、種類だけ追う
「中身は知らないが、種類は分かる」——これは日常でもやっています。封筒の宛名を見れば、開けなくても請求書か年賀状かの見当がつく。型をたどる読みは、プログラムを封を切らずに仕分ける読み方です。
つじつまの合う式、合わない式
表の練習をひとつ。(1 == 2) == (3 == 4) は、まちがいでしょうか。
読んでみます。左は真偽、右も真偽。== は同じ型どうしなら受け取れるので、これは合法で、答えは真偽(実行すると true——「両方ともまちがい」は当たっているので)。一方 (1 < 2) + 10 は、真偽に数を足すのでつじつまが合いません。上の実験室で、どちらも確かめてください。
ここで気づいてほしいのは、いまあなたが頭の中で表を引きながら読んだことです。式が10行になっても、関数がまたがっても、これを正確にやり続けられますか。人間は飽きるし、見落とします——だからこの仕事は、機械の出番なのです。
✎ 演習:型だけで読む
実行せずに、次の式それぞれの「型」を答えてください(数/真偽/つじつまが合わない、の三択)。答えてから実験室で確かめます。
1 + 2 == 3(1 == 2) + (3 == 4)(1 + 2) * (3 - 4)
ヒント1(考え方)
1は、たし算が先にまとまって 3 == 3 のかたちになります(コース2でやった優先順位です)。表を1段ずつ引いてください。
こたえ
1は真偽(数 == 数)。2はつじつまが合いません(真偽 + 真偽——+ の表に真偽の行はありません)。3は数(数 * 数)。実行すると、1は true、2はエラー、3は -3 になります。型の読みは、答えの値までは教えてくれません——でも「答えがどの種類か」と「そもそも答えが出るか」を、実行より先に教えてくれます。
このレッスンで分かったこと
- minilangの値の種類は数・真偽・関数の3つ
- 型とは、値の種類と、その種類にゆるされた操作の決まり
- 操作には「何を受け取り、何を返すか」の札がある——表が引ければ、計算せずに型がたどれる
- この読みを正確にやり続けるのは人間には向かない。次は機械に任せる