値には、種類がある

よみもの+手を動かす時間:およそ20分

手がかりの正体

前のレッスンであなたは、1 + (1 == 2) を読んだだけで「おかしい」と見抜きました。手がかりは何だったのか。値の種類です。

minilangの世界の値を、ぜんぶ数え上げてみます。142 のような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. 1 + 2 == 3
  2. (1 == 2) + (3 == 4)
  3. (1 + 2) * (3 - 4)
ヒント1(考え方)

1は、たし算が先にまとまって 3 == 3 のかたちになります(コース2でやった優先順位です)。表を1段ずつ引いてください。

こたえ

1は真偽(数 == 数)。2はつじつまが合いません(真偽 + 真偽——+ の表に真偽の行はありません)。3は数(数 * 数)。実行すると、1は true、2はエラー、3は -3 になります。型の読みは、答えの値までは教えてくれません——でも「答えがどの種類か」と「そもそも答えが出るか」を、実行より先に教えてくれます。

このレッスンで分かったこと

  • minilangの値の種類は数・真偽・関数の3つ
  • とは、値の種類と、その種類にゆるされた操作の決まり
  • 操作には「何を受け取り、何を返すか」の札がある——表が引ければ、計算せずに型がたどれる
  • この読みを正確にやり続けるのは人間には向かない。次は機械に任せる