名前の型は、変わらない

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

名前に、ちがう種類を入れたら

前のレッスンで雇った型の目は、名前と型の対応を名簿に控えていました。x = 10 と書けば、名簿に「x は数」と載ります。では、そのあとで x = (1 == 2) と書いたら、どうなるのでしょう。

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

「x」は 数 として名づけられていますが、真偽 を入れようとしています。ひとつの名前には、ひとつの型。別の種類の値には、別の名前をつけてください。

評価された値

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

止まりました。「「x」は 数 として名づけられていますが、真偽 を入れようとしています。」——数として名簿に載った名前に、真偽をあてがい直すことは、ゆるされないようです。

実行するだけなら、これは動く

ここで、立ち止まってほしいことがあります。このプログラム、実行するだけなら動くのです。 型の目を雇っていない実験室で、同じコードを動かしてください。

③ 評価された値
10false

10 と false が、何ごともなく出てきます。評価器にとって、名前のあてがい先が数だろうと真偽だろうと、困ることは何もありません。つまりさっきのエラーは「壊れているから止めた」のではなく、型の目が、そういう約束を選んで止めたのです。

どの行から読んでも、x は数

理由は、レッスン1のことばで説明できます。読む検査の強みは、すべての道をいっぺんに調べられることでした。

もし名前の型が途中で変わってよいなら、「いまこの行の x は何者か」を知るには、上から実行のとおりになぞるしかありません。それでは読む検査が、一本道をたどる実行に逆戻りしてしまいます。読むのは、機械だけではなく、あなたの隣の人間もです。

型が名前に固定されていれば、名簿を一度引くだけで済みます。100行目だけを開いた人も、機械も、「x は数」と言い切れる。名前の型は変わらないという約束は、この読みやすさと引きかえに選ばれた決まりなのです。

あだ名は、種類ごとにつける

コース1で、変数は「箱」ではなく値へのあだ名だと学びました。型の目の世界では、そこに一言だけ足します。あだ名は、種類ごとにつける。

あだ名の相手が変わるのは、かまいません。

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

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

x
評価された値
102021

x のあだ名の相手は 10 から 20 に変わりましたが、どちらも数——種類は変わっていないので、型の目は黙って通します。名簿に載っているのは「数の x」のように種類つきの名前で、相手の数が何であるかまでは書いていない、と考えてください。

枝の中の代入も、同じ名簿で

if の枝の中で代入したら、どうなるでしょう。minilangの名簿は、枝の中も外も同じ一冊です。

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

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

x
評価された値
16

x = 5 は数なので、これは通って 6 が出ます。では枝の中を x = 1 == 2 に書きかえてみてください。型の目は、最初の実験とまったく同じ文言で止めます。

ここが、この約束の効きどころです。実行は、その枝を通ったときにしか転びません。読む検査は、通るかどうかに関係なく「この枝に入ると x の種類が変わる」ことを、いまこの場で指摘できます。

よりみち:言語によって、約束はちがう

この決まりは、本物の言語でも分かれ道になっています。Pythonは名前の型替えを自由にゆるし、JavaやTypeScriptは(おおむね)ゆるしません。どちらかが正しいのではなく、何と引きかえに何を得るかの選択がちがう——設計とは、そういうものです。

演習:使い回した名前を、ほどく

温度を計算して、最後に「暑いかどうか」を出すプログラムです。書いた人は、名前 t をぜんぶに使い回しました。型の目なしの実験室なら動き、型の目つきなら止まる——両方で確かめてから、型の目を通るように直してください。

t = 20
t = t + 5
t = t > 30
ヒント1(考え方)

3行目の t > 30 の型は何でしょう。2行目までの t の型と、くらべてください。

こたえ

3行目だけ、t を真偽にあてがい直そうとしています。最後を atsui = t > 30 のように別の名前にすれば通ります(名簿には「数の t」と「真偽の atsui」が並びます)。温度と「暑いか」は種類のちがう情報なので、別の名前がつくほうが、読む人にも親切です。

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

  • 最初の代入が、名前の型を決める。 以後、その名前の型は変わらない
  • このコードは実行だけなら動く——止めたのは型の目が選んだ約束。検査器の決まりも、言語と同じく設計である
  • 型が名前に固定されていると、どの行から読んでも名前の型を言い切れる。読む検査の強みが守られる
  • あだ名の相手(値)は変わってよいが、種類は変わらない。種類のちがう値には、別の名前