数値型のMinValue
とMaxValue
にアクセスできる数値ジェネリック関数が必要でした。すべてのBCLタイプはこれらのメンバーを持っているので、私はこのようなものを書いて逃げることができると思った:数値ジェネリックを使用してネイティブ数値型の最小値/最大値を取得すると、Int32.MaxValueが存在しないように見える
let inline zeroOrMax(x: ^a) =
match x with
| a when a = LanguagePrimitives.GenericZero -> x
| a when a = LanguagePrimitives.GenericOne ->
let maxVal = (^a: (static member MaxValue : ^a)())
maxVal
| a when -a = LanguagePrimitives.GenericOne ->
let maxVal = (^a: (static member MaxValue : ^a)())
-maxVal
| _ -> ...
この機能はあなたにゼロまたは基になる型の(ネガ/ポジ)の最大値を与えるだろう。
let test (x: int64) =
// error FS0001: The type 'int64' does not support the operator 'get_MaxValue'
zeroOrMax x
:
これは、パラメータが静的メンバ言っていないことを私は静的コンパイルエラーを得続ける、私はMaxValue
を実装して自分のタイプを作成するときに見つけ動作しますが、Int32
、Int64
などしながら、静的メンバMaxValue
とMinValue
を持っています
これは、F#がこれらのタイプを特別に扱うためです。あるいは、私は単に異なる構文が必要なだけかもしれません。数値的な一般性を維持しながら、これを回避する方法はありますか?とは、基本となる型の最小値/最大値にアクセスしますか?
'int64.MaxValue'は_memberのconstant_、ない_property_です。 –
@fyodor ouch、dejavu、私は以前のことを見たように感じます。些細な回避策はないと思いますか? – Abel
いいえ、方法はありません。 [FsControl](https://github.com/gmpl/FsControl)の[汎用関数](https://github.com/gmpl/FsControl/blob/615f86cbce90596740efdc717cb863a57cefeee4/FsControl.Core/Operators.fs#L397)を作成しました。これは、さまざまな種類のオーバーロードがあります(https://github.com/gmpl/FsControl/blob/615f86cbce90596740efdc717cb863a57cefeee4/FsControl.Core/Numeric.fs#L476)。コードを使用するか、そこにコードをコピーすることができます。 – Gustavo