実行せずに読む、もうひとりの読み手
読む係を、機械にする
前のレッスンの終わりに、約束をしました。型の表を引きながらプログラムを読む係——あれを、機械にやらせる。その機械の名前が型検査器です。
このレッスンから、minilangの実験室に新しいパネルがつきます。名前は「型の目(実行する前の検査)」。さっそく、見覚えのある式を見せてみましょう。
型の目、はじめての仕事
「+」の右には数が来るはずですが、真偽 が来ています。実行する前から、これは分かります——それが型の目です。
(型の目が止めたので、実行していません)
「「+」の右には数が来るはずですが、真偽 が来ています。」——止まりました。前のレッスンで同じ式を動かしたときも、たしかにエラーは返ってきました。でも今回は、決定的にちがうところがあります。
値の欄を見てください。「(型の目が止めたので、実行していません)」とあります。前回のエラーは、実行が転んでからの報告——今回のは、実行する前の予告で、この式はまだ一度も動いていないのです。
どの道も歩かずに、すべての道を
実行前に分かると、何がうれしいのか。レッスン1の「隠れたまちがい」を思い出してください——f(10) を渡したときだけ転ぶ、あの関数です。同じまちがいを、今度は関数を外したかたちで埋めてみます(関数を型の目に見せるには「型注釈」という道具が要るので、それはレッスン5のお楽しみです)。
まず、型の目のない実験室で動かします。
x は 1 なので else の道を通り、エラーは出ずに終わります(値の欄に出るのは x = 1 の 1 だけ)。レッスン1の f(1) と同じく、まちがいは沈黙したままです。では、まったく同じプログラムを型の目に見せます。
「+」の右には数が来るはずですが、真偽 が来ています。実行する前から、これは分かります——それが型の目です。
(型の目が止めたので、実行していません)
止まりました——実行なら無事に通る入力なのに、です。実行は x > 5 の答えを見てから片方の道を選びますが、型の目はどの道も歩きません。歩かずに、両方の道を読む——だから x が何であろうと、ifのどちら側に埋まったまちがいも見つかります。
レッスン1の「通った道しか調べられない」問題への、これが答えです。
2.5番目の工程
この機械は、どこで仕事をしているのでしょう。コース2で、ことばの処理は3つの工程でした——粒にする、木にする、意味にする。型検査器が割りこむのは、木はできたが、意味にする前です。
4つめの工程というより、2と3のあいだに入る「2.5番目」と呼ぶのが正確です。受け取る材料は評価器と同じ構造の木で、やることもよく似ています。木をたどって畳んでいく——ただし、値の代わりに型を。
1 + (2 == 3) で見くらべてみます。評価器なら 2 == 3 を false という値にしてから、足し算のところで転びます。型の目は 2 == 3 に「真偽」という札だけをつけ、+ の表を引いて「数ではない」とそこで止まる——前のレッスンであなたが頭の中でやった「計算せずに種類だけ追う」読みを、木の上でそのまま機械にしたものです。
通したものは、実行される
ここまで、止める場面ばかり見てきました。門番が通すときの顔も見ておきましょう。
型のまちがいは、見つかりませんでした。
x数y数z真偽緑の「型のまちがいは、見つかりませんでした。」のあと、実行に進んで値が並びます。そして検査の結果に、おまけがついています——x は数、y は数、z は真偽。
型の目は読みながら、名前と型の名簿を作っていたのです。y = x * 2 の型を出すには x の型を覚えていなければならないから、名簿は読みの途中でどうしても必要になります。この名簿が、次のレッスンの主役です。
型の目が、知らないこと
最後に、正直な注意をひとつ。型の目は強い読み手ですが、実行したときの値を知りません。
型のまちがいは、見つかりませんでした。
0では割れませんでした。
1 / 0 は、表の上では「数 ÷ 数」——つじつまは合っています。だから型の目は素通しにして、実行が「0では割れませんでした。」と転びます。型の目をすりぬけるまちがいに何があり、ではどこまで頼ってよいのか——それはレッスン7で、じっくり向き合います。
✎ 演習:型の目の予想を立てる
次の3つについて、「型の目は止めるか」「(型の目がなければ)実行はどうなるか」を先に予想してください。それから上の実験室(型の目つきのもの)に打ちこんで確かめます。
-
x = 3if x < 10 { x * 2 } else { x + (x == 3) }
if 1 + 2 { 1 } else { 0 }10 / (5 - 5)
ヒント1(考え方)
「型の目はどの道も歩かない」「型の目は値を知らない」——この2つを物差しにしてください。3は、5 - 5 の型と値を分けて考えます。
こたえ
1は型の目が止めます——else の道の x + (x == 3) で、数に真偽を足しているからです。実行なら x = 3 は then の道を通って、無事に終わってしまいます。
2も止めます。ただし今度は + ではなく、ifの条件が問題です——「もしもの条件は 真偽 で答えられる式のはずですが、数 が来ています。」と返ります。
3は型の目が通します。5 - 5 は型の上では立派な数で、値が 0 になることまでは読めないからです——実行に進んで「0では割れませんでした。」と転びます。これが、型の目の知らない種類のまちがいです。
このレッスンで分かったこと
- 型の表を引きながら読む係を機械にしたものが型検査器——実験室では「型の目」パネル
- 型の目は実行する前に止める。止まったとき、プログラムは一度も動いていない
- 実行は一本の道しか調べないが、型の目はどの道も歩かずに、すべての道を読む
- 工程としては、木ができたあと・意味にする前の「2.5番目」。値の代わりに型を木の上で畳む
- 通ったプログラムには「名前と型の名簿」がつく。ただし型の目は実行時の値(0で割る、など)を知らない