F# Advent Calendar 2020の11日目のエントリーです。
5日目に続いてまた nameof の話です。
nameof にはF#のプログラムとしては当然だけど忘れがちな制約があります。
何の問題もないように見えますが、これはコンパイルエラーです。
let f () = nameof f
これがダメなのは、 f は f の定義本体ではまだ見えないのに参照しようとしているからです。
let f x = match x with | 0 -> 0 | x -> f (x - 1) + x
これがダメなのと同じ理由ですね。
なので、もしこういうことがしたければ、
let rec f () = nameof f
のように rec を付ける必要があります。
再帰していないのに rec を付けるのは気持ち悪い気もしますが、これは仕方ないでしょう。
ちなみに、メソッドは定義本体で自分自身が見えるので、次のコードはコンパイルが通ります。
type t () = static member F() = nameof t.F