Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net F中类型的最大/最小值#_.net_F#_Max_Minimum_Unchecked - Fatal编程技术网

.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)| maxmax如果你必须走这条路,总会有反射。但是,我建议不要将
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