F#のパーサーに対する改良が入るかも?

F# Advent Calendar 2020の14日目のエントリーです。

そろそろネタ切れですが、今後入るかもしれない改良の紹介です。

RFC FS-1083

すごい地味なRFCですが、今年のF# Advent CalendarでもあったSRTP(Statically Resolved Type Parameters: 静的に解決される型パラメーター)に関わる改良です。

現状、次のコードはコンパイルできません。

let inline f<^a>: ^a = failwith "error"

現状のF#でコンパイルを通すためには、まず < と ^ の間に空白を入れ、 < ^a> とする必要があります。 おさまりが悪いので、 > の前にも空白を入れ、 < ^a > などとします。

次に、 > と : の間にも空白を入れる必要があります。

つまり、これならコンパイルが通ります。

let inline f< ^a > : ^a = failwith "error"

// 普通の型パラメーターの場合は最初の空白は不要
let g<'a> : 'a = failwith "error"

最初の空白の問題は、 <^ という演算子を定義できるようにするため <^ を一つのトークンとして扱ってしまうのが原因です。 これを、型パラメーターの位置では分割して扱えるようにパーサーを直そう、というのがRFC FS-1083です。

二つ目の問題も >: という一つのトークンとして扱ってしまう点では同じ原因*1ですが、RFC FS-1083の範囲には入っていないようにも見えます。

こういう地味に面倒な問題も解消されていくと嬉しいですね。

*1:なんだけど、実際には「コロンが演算子に含められなくなったよ」という別のエラーに先に引っかかる