Arantium Maestum

プログラミング、囲碁、読書の話題

merlinサポートのあるエディタでOCamlを書いていて微妙にイラっとくること

私は現在Visual Studio CodeOCaml & Reason IDEを使っている。

全般的に非常に気に入っているのだが、一つ頻繁に起きて心をすこしだけささくれ立たせることがあるので書き出しておく。OCaml & Reason IDEプラグインはエラー検出などにmerlinを使っているのでこれは多分VS Code特有の挙動ではないと思う。

ちなみにこれはプラグインやmerlinに対する批判を意図するものではないことは先に断っておく。

例えばこんな型があるとして:

type t =
| Int of int
| Var of string
| Let of (string * t) list * t
| Add of t * t

この型に対するパターンマッチを書くとする:

let rec eval = function
| Int n -> n

とここまで書くとfunctionから-> nまで全部赤線でエラーだと注意される。

This pattern match is not exhaustive...

云々。

もちろん言いたいことはわかるし、コンパイル前にパターンマッチが網羅的でないことを教えてくれるのはありがたい、のだが。

「今書いてるところだから!さらに他のエラーはないのか?!」と強く言いたくなる。

let rec eval env = function
| Int n -> n
| Var s -> find env s
| Let sts e -> eval (sts :: env) e

とここまで書いてもfunction以降は全部赤線である。本当はsts :: envじゃなくてsts @ envであるべき、などの型エラーも隠してくれたりする。書いた瞬間に教えてくれるのがエディタによるエラーハイライトの利点じゃないのか・・・

なのでちょっと大きめのパターンマッチを書くときは必ず:

let rec eval env = function
| _ -> failwith ""

とすべてのパターンにマッチし、どんな型とも整合性の取れるケースを追加しておく。

そしてすべてのケースを書き終わったと思ったら取り除いて網羅的かどうか確認する。

これで挙動としてはいいのだが、毎回毎回同じ行を書いては消し、書いては消しとやっているのもなんだか癪で、他によりスマートな方法があるのでは?と考えてしまう。

もしご存知のかたがいたらぜひ教えてほしい。