型システムの勉強なんかどうでもいいから、それにカバーされ無いところに気をつけて欲しい

コードがあった:

match (modeA opts, modeB opts, modeC opts ..., modeG opts) with
  | (true, _, _, _, _, _, _) -> Opt.setMode A
  | (_, true, _, _, _, _, _) -> Opt.setMode B
  | (_, _, true, _, _, _, _) -> Opt.setMode C
  | (_, _, _, true, _, _, _) -> Opt.setMode D
  | (_, _, _, _, true, _, _) -> Opt.setMode E
  | (_, _, _, _, _, true, _) -> Opt.setMode F
  | (_, _, _, _, _, _, true) -> Opt.setMode G
  | (_, _, _, _, _, _, _) -> Opt.setMode Default

opts はコマンドラインで指定したオプションの結果が入っていると思ってくださいな。

modeA opts == True & modeB opts == True の時はどうなるんですかぁ?なんで黙って A が選ばれるんですかぁ?

問題のコードは Haskell で書いてあったが、OCaml に書き直した。別に Haskell を dis る為に記事を書いたわけではないので。Haskell の人でも読めるだろJK。

関数型言語やその型システムの利点は、まあいろいろざっくり省略して、バグが入りにくい言語仕様にあります。じゃあ、その言語を使えば誰でもバグが減るかというとそうではなくて、当然、仕様で担保できない部分はプログラムを書く人が気をつけなきゃいけない。それは、その他の言語と何も違いはありません。ただ、関数型や静的型システムだと気をつけなきゃいけないところが減りますよー良かったですねーという事です。

そういうのを踏まえたうえで、いろんな人が関数型言語イイよ、静的型イイよ、と言っていたと思っていたのです…当然のプログラム作法は常識だし、いまさら語る必要もないよね?というコンセサンスがあるとばかり今まで私は思っていた。

どうやらそうではないらしい。唯単に、基本的なプログラミングの素養に興味が無かったか、軽視しているか、身に着ける機会が無かった人がこの世界にはそれなりにいるらしい…

型システムなんか正直判って無くてもいいんです。どうせ判っていようがいまいが強い静的型なら型のあったプログラムしか書けない。力学を知らなくても縄に縛られる事はできる。そういうことです。

上のコードは次のように書くのが(元のコードのふいんきを保存するなら)正しいです:

match (modeA opts, modeB opts, modeC opts ..., modeG opts) with
  | (true, false, false, false, false, false, false) -> Opt.setMode A
  | (false, true, false, false, false, false, false) -> Opt.setMode B
  | (false, false, true, false, false, false, false) -> Opt.setMode C
  | (false, false, false, true, false, false, false) -> Opt.setMode D
  | (false, false, false, false, true, false, false) -> Opt.setMode E
  | (false, false, false, false, false, true, false) -> Opt.setMode F
  | (false, false, false, false, false, false, true) -> Opt.setMode G
  | (false, false, false, false, false, false, false) -> Opt.setMode Default
  | _ -> failwith "More than one mode options cannot be specified at a time."