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の範囲には入っていないようにも見えます。
こういう地味に面倒な問題も解消されていくと嬉しいですね。