.net F中类型的最大/最小值#
.net F中类型的最大/最小值#,.net,f#,max,minimum,unchecked,.net,F#,Max,Minimum,Unchecked,Unchecked.defaultof'T->'C)= 让可变最大值:'C=//通用最大值'C(如果有意义的话) 因为我在0。。s、 长度-1 do 对于i+1中的j。。s、 长度-1 do 设diff=diffFun s[i]s[j] 如果(i=0&&j=1)| max无 |fieldInfo->fieldInfo.GetValue()|>取消某些 让maxvi=tryGetMaxValue()//val maxvi:int option=Some 2147483647 让maxvf:floa
Unchecked.defaultof'T->'C)=
让可变最大值:'C=//通用最大值'C(如果有意义的话)
因为我在0。。s、 长度-1 do
对于i+1中的j。。s、 长度-1 do
设diff=diffFun s[i]s[j]
如果(i=0&&j=1)| max max如果你必须走这条路,总会有反射。但是,我建议不要将MaxValue
用作带外或特殊值
let inline tryGetMaxValue< ^a> () =
match typeof< ^a>.GetField("MaxValue") with
| null -> None
| fieldInfo -> fieldInfo.GetValue() |> unbox< ^a> |> Some
let maxvi = tryGetMaxValue<int>() // val maxvi : int option = Some 2147483647
let maxvf : float option = tryGetMaxValue() // val maxvf : float option = Some 1.797693135e+308
let maxvs : string option = tryGetMaxValue() // val maxvs : string option = None
让内联tryGetMaxValue<^a>()=
将<^a>.GetField(“MaxValue”)的类型与
|空->无
|fieldInfo->fieldInfo.GetValue()|>取消某些
让maxvi=tryGetMaxValue()//val maxvi:int option=Some 2147483647
让maxvf:float option=tryGetMaxValue()//val maxvf:float option=Some 1.797693135e+308
让maxvs:string option=tryGetMaxValue()//val maxvs:string option=None
@kaefer的答案为您提供了一个获得最大/最小值的好方法,但对于您的特定用例,我建议您将可变变量'C选项改为,并将其初始化为无
。这样就不需要魔法数字了
let InternalArrDiffMax (s : 'T []) (diffFun : 'T -> 'T -> 'C) =
let mutable max : 'C option = None
for i in 0 .. s.Length - 1 do
for j in i + 1 .. s.Length - 1 do
let diff = diffFun s.[i] s.[j]
match max with
| None ->
max <- Some diff
| Some v when v < diff ->
max <- Some diff
| _ -> ()
max
let InternalArrDiffMax(s:'T[])(diffFun:'T->'T->'C)=
设可变最大值:'C option=None
因为我在0。。s、 长度-1 do
对于i+1中的j。。s、 长度-1 do
设diff=diffFun s[i]s[j]
将max与
|无->
最大值
最大值()
最大值
一种无反射的方法
let maxOfT (x:'t) : 't =
match typedefof<'t> with
| u when u=typedefof<Int16> -> Int16.MaxValue :> obj
| u when u=typedefof<Int32> -> Int32.MaxValue :> obj
// ... repeat for each type
| _ -> failwith "unrecognised"
:?> 't
let minOfT (x:'t) : 't =
match typedefof<'t> with
| u when u=typedefof<Int16> -> Int16.MinValue :> obj
| u when u=typedefof<Int32> -> Int32.MinValue :> obj
// ... repeat for each type
| _ -> failwith "unrecognised"
:?> 't
让maxOfT(x:'t):'t=
match typedefofI不这么认为(我们从未见过类似的东西-也许有一个)-在我看来,这没有多大意义,因为所有类型都没有最大值。你到底想做什么?以一般方式获取最大值可能不是特别有用。请参见,按照中的定义实现Bounded
,然后发送请求。@MauricioScheffer很好的建议。我只是把它用到了FsControl。@Gustavo:你能举例说明FsControl.Core中的Bounded用法吗?这是解决我潜在问题的一个很好的方法,但我必须把@kaefer的回答标记为答案。我想投你一票,但我甚至没有足够的声誉这么做。。。无论如何谢谢:-)@bugfoot:当然,我不介意。他回答了这个问题。你随时可以回来投票;)这是局部的,打破了参数化。不推荐使用。@MauricioScheffer:.Net中的MaxValue/MinValue是一种静态约定。请告知哪些解决方案不会破坏参数。请参阅Gustavo的评论和上面的链接。@MauricioScheffer:谢谢你的提醒。有益的补充。我同意“有界”的需要,但我也希望使用函数方法来检索minValue或maxValue。“我会用ping Gustavo”。@MauricioScheffer:事实上,经过思考,在大多数情况下,我更喜欢你的建议+Gustavo的实现。感谢您将类型安全性放在首位,从而错误地将负载放在编译器上。这就是你对护理人员的理解,对吗?
let InternalArrDiffMax (s : 'T []) (diffFun : 'T -> 'T -> 'C) =
let mutable max : 'C option = None
for i in 0 .. s.Length - 1 do
for j in i + 1 .. s.Length - 1 do
let diff = diffFun s.[i] s.[j]
match max with
| None ->
max <- Some diff
| Some v when v < diff ->
max <- Some diff
| _ -> ()
max
let maxOfT (x:'t) : 't =
match typedefof<'t> with
| u when u=typedefof<Int16> -> Int16.MaxValue :> obj
| u when u=typedefof<Int32> -> Int32.MaxValue :> obj
// ... repeat for each type
| _ -> failwith "unrecognised"
:?> 't
let minOfT (x:'t) : 't =
match typedefof<'t> with
| u when u=typedefof<Int16> -> Int16.MinValue :> obj
| u when u=typedefof<Int32> -> Int32.MinValue :> obj
// ... repeat for each type
| _ -> failwith "unrecognised"
:?> 't