私は明らかにここでのパーティーに遅れていますが、なぜdivBy2
関数を作成したいのかを知ることは興味深いでしょう. ここには 2 つの問題があり、ニーズによっては、そのうちの 1 つを解決するだけで十分な場合があります。
最初の問題は、 がないことLanguagePrimitives.GenericTwo
です。これは簡単に修正できますが、2 以外の除数に対して特定の除算関数を定義したい場合、このソリューションの使用は限定されます。
let inline divBy2 n =
n / (LanguagePrimitives.GenericOne + LanguagePrimitives.GenericOne)
入力を減らすために、変数に割り当てることができLanguagePrimitives.GenericOne
ます。これは、除数の大きさが大きくなるにつれてより便利になります。
let inline divBy4 n =
let one = LanguagePrimitives.GenericOne
let two = one + one
n / (two + two)
このソリューションは、一般的な関数を作成する場合にも役に立ちません。「カスタム」の方法は
let inline divBy divisor dividend = dividend / divisor
これを部分関数アプリケーションで使用して、たとえば次のようにバイトのリストを半分にすることができます。
let halfBytes = [ 1uy .. 10uy ] |> List.map (divBy 2uy)
しかし、もっとうまくやることができます。この問題は、減算を含むすべての非可換演算子に適用されます。それを回避するために、定義できます
let flip f a b = f b a
これにより、たとえば
let scaledInThousands = [ 0m .. 500m .. 3000m ] |> List.map (flip (/) 1000m)
let decrementedIntegers = [ 1 .. 10 ] |> List.map (flip (-) 1)
必要に応じて、divBy 関数を定義することもできます。
let inline divBy n = flip (/) n
let halfInts = [ 1 .. 10 ] |> List.map (divBy 2)
let halfLongs = [ 1L .. 10L ] |> List.map (divBy 2L)
let fifthLongs = [ 1L .. 10L ] |> List.map (divBy 5L)
let oneThroughTenOverPi = [ 1.0 .. 10.0 ] |> List.map (divBy System.Math.PI)