名前の型は、変わらない
名前に、ちがう種類を入れたら
前のレッスンで雇った型の目は、名前と型の対応を名簿に控えていました。x = 10 と書けば、名簿に「x は数」と載ります。では、そのあとで x = (1 == 2) と書いたら、どうなるのでしょう。
「x」は 数 として名づけられていますが、真偽 を入れようとしています。ひとつの名前には、ひとつの型。別の種類の値には、別の名前をつけてください。
(型の目が止めたので、実行していません)
止まりました。「「x」は 数 として名づけられていますが、真偽 を入れようとしています。」——数として名簿に載った名前に、真偽をあてがい直すことは、ゆるされないようです。
実行するだけなら、これは動く
ここで、立ち止まってほしいことがあります。このプログラム、実行するだけなら動くのです。 型の目を雇っていない実験室で、同じコードを動かしてください。
10 と false が、何ごともなく出てきます。評価器にとって、名前のあてがい先が数だろうと真偽だろうと、困ることは何もありません。つまりさっきのエラーは「壊れているから止めた」のではなく、型の目が、そういう約束を選んで止めたのです。
どの行から読んでも、x は数
理由は、レッスン1のことばで説明できます。読む検査の強みは、すべての道をいっぺんに調べられることでした。
もし名前の型が途中で変わってよいなら、「いまこの行の x は何者か」を知るには、上から実行のとおりになぞるしかありません。それでは読む検査が、一本道をたどる実行に逆戻りしてしまいます。読むのは、機械だけではなく、あなたの隣の人間もです。
型が名前に固定されていれば、名簿を一度引くだけで済みます。100行目だけを開いた人も、機械も、「x は数」と言い切れる。名前の型は変わらないという約束は、この読みやすさと引きかえに選ばれた決まりなのです。
あだ名は、種類ごとにつける
コース1で、変数は「箱」ではなく値へのあだ名だと学びました。型の目の世界では、そこに一言だけ足します。あだ名は、種類ごとにつける。
あだ名の相手が変わるのは、かまいません。
型のまちがいは、見つかりませんでした。
x数x のあだ名の相手は 10 から 20 に変わりましたが、どちらも数——種類は変わっていないので、型の目は黙って通します。名簿に載っているのは「数の x」のように種類つきの名前で、相手の数が何であるかまでは書いていない、と考えてください。
枝の中の代入も、同じ名簿で
if の枝の中で代入したら、どうなるでしょう。minilangの名簿は、枝の中も外も同じ一冊です。
型のまちがいは、見つかりませんでした。
x数x = 5 は数なので、これは通って 6 が出ます。では枝の中を x = 1 == 2 に書きかえてみてください。型の目は、最初の実験とまったく同じ文言で止めます。
ここが、この約束の効きどころです。実行は、その枝を通ったときにしか転びません。読む検査は、通るかどうかに関係なく「この枝に入ると x の種類が変わる」ことを、いまこの場で指摘できます。
⟡ よりみち:言語によって、約束はちがう
この決まりは、本物の言語でも分かれ道になっています。Pythonは名前の型替えを自由にゆるし、JavaやTypeScriptは(おおむね)ゆるしません。どちらかが正しいのではなく、何と引きかえに何を得るかの選択がちがう——設計とは、そういうものです。
✎ 演習:使い回した名前を、ほどく
温度を計算して、最後に「暑いかどうか」を出すプログラムです。書いた人は、名前 t をぜんぶに使い回しました。型の目なしの実験室なら動き、型の目つきなら止まる——両方で確かめてから、型の目を通るように直してください。
t = 20t = t + 5t = t > 30ヒント1(考え方)
3行目の t > 30 の型は何でしょう。2行目までの t の型と、くらべてください。
こたえ
3行目だけ、t を真偽にあてがい直そうとしています。最後を atsui = t > 30 のように別の名前にすれば通ります(名簿には「数の t」と「真偽の atsui」が並びます)。温度と「暑いか」は種類のちがう情報なので、別の名前がつくほうが、読む人にも親切です。
このレッスンで分かったこと
- 最初の代入が、名前の型を決める。 以後、その名前の型は変わらない
- このコードは実行だけなら動く——止めたのは型の目が選んだ約束。検査器の決まりも、言語と同じく設計である
- 型が名前に固定されていると、どの行から読んでも名前の型を言い切れる。読む検査の強みが守られる
- あだ名の相手(値)は変わってよいが、種類は変わらない。種類のちがう値には、別の名前