実行せずに読む、もうひとりの読み手

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

読む係を、機械にする

前のレッスンの終わりに、約束をしました。型の表を引きながらプログラムを読む係——あれを、機械にやらせる。その機械の名前が型検査器です。

このレッスンから、minilangの実験室に新しいパネルがつきます。名前は「型の目(実行する前の検査)」。さっそく、見覚えのある式を見せてみましょう。

型の目、はじめての仕事

型の目(実行する前の検査)

「+」の右には数が来るはずですが、真偽 が来ています。実行する前から、これは分かります——それが型の目です。

評価された値

(型の目が止めたので、実行していません)

「「+」の右には数が来るはずですが、真偽 が来ています。」——止まりました。前のレッスンで同じ式を動かしたときも、たしかにエラーは返ってきました。でも今回は、決定的にちがうところがあります。

値の欄を見てください。「(型の目が止めたので、実行していません)」とあります。前回のエラーは、実行が転んでからの報告——今回のは、実行する前の予告で、この式はまだ一度も動いていないのです。

どの道も歩かずに、すべての道を

実行前に分かると、何がうれしいのか。レッスン1の「隠れたまちがい」を思い出してください——f(10) を渡したときだけ転ぶ、あの関数です。同じまちがいを、今度は関数を外したかたちで埋めてみます(関数を型の目に見せるには「型注釈」という道具が要るので、それはレッスン5のお楽しみです)。

まず、型の目のない実験室で動かします。

③ 評価された値
1

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 に「真偽」というだけをつけ、+ の表を引いて「数ではない」とそこで止まる——前のレッスンであなたが頭の中でやった「計算せずに種類だけ追う」読みを、木の上でそのまま機械にしたものです。

通したものは、実行される

ここまで、止める場面ばかり見てきました。門番が通すときの顔も見ておきましょう。

型の目(実行する前の検査)

型のまちがいは、見つかりませんでした。

xyz真偽
評価された値
1020true

緑の「型のまちがいは、見つかりませんでした。」のあと、実行に進んで値が並びます。そして検査の結果に、おまけがついています——x は数、y は数、z は真偽。

型の目は読みながら、名前と型の名簿を作っていたのです。y = x * 2 の型を出すには x の型を覚えていなければならないから、名簿は読みの途中でどうしても必要になります。この名簿が、次のレッスンの主役です。

型の目が、知らないこと

最後に、正直な注意をひとつ。型の目は強い読み手ですが、実行したときの値を知りません。

型の目(実行する前の検査)

型のまちがいは、見つかりませんでした。

評価された値

0では割れませんでした。

1 / 0 は、表の上では「数 ÷ 数」——つじつまは合っています。だから型の目は素通しにして、実行が「0では割れませんでした。」と転びます。型の目をすりぬけるまちがいに何があり、ではどこまで頼ってよいのか——それはレッスン7で、じっくり向き合います。

演習:型の目の予想を立てる

次の3つについて、「型の目は止めるか」「(型の目がなければ)実行はどうなるか」を先に予想してください。それから上の実験室(型の目つきのもの)に打ちこんで確かめます。

  1. x = 3
    if x < 10 { x * 2 } else { x + (x == 3) }
  2. if 1 + 2 { 1 } else { 0 }
  3. 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で割る、など)を知らない