htsign's blog

ノンジャンルで書くつもりだけど技術系が多いんじゃないかと思います

F#のべき乗計算

現在F#の勉強を始めたところで、基礎的なところをぼちぼち習得している段階です。

演算子の話なんですが、F#にはOCamlの系譜だからなのか**演算子(べき乗)があります。
RubyPythonなど、関数型の血を引いたいくつかの言語にも備わっている珍しくもない演算子なんですが、
なんとこの演算子、F#においては浮動小数点型でしか使えないのです…。
コンパイルするとMath.Pow : float * float -> floatになるようなので、当然と言えば当然ですね…)
追記: コンパイル後に Math.Pow になるのはインライン関数だからで、実際は Pow 静的メソッドを持つ任意の型に対して使える模様。
つまり BigInteger とかでも使えます。

なので整数計算で**演算子を使用したい場合は、

let i = 2 ** 3 // ここでコンパイルエラー
printfn "%i" i

ではダメで、

let i = 2.0 ** 3.0 |> int
printfn "%i" i // 8

などとしなくてはならず、少々面倒くさいです。

どうしてもという場合にはpown関数がありますが、あくまで関数なので演算子のように中置はできない模様。

let i = pown 2 3
printfn "%i" i // 8

// パイプ演算子を使うと中置っぽくなるが、アホっぽい
let i2 = 2 |> pown <| 3
printfn "%i" i2 // 8

ぐぬぬ