Arrays F中的数组内比较#

Arrays F中的数组内比较#,arrays,f#,comparison,Arrays,F#,Comparison,假设我想在F#中进行一些数组内比较,例如,确定给定的整数数组arr是否包含严格递增顺序的整数。我会这样做: let arri = arr |> Array.mapi (fun i e -> i, e) let isArrStrictlyIncreasing = arri |> Array.tryFind (fun e -> if fst e = arri.Length - 1 then fal

假设我想在F#中进行一些数组内比较,例如,确定给定的整数数组
arr
是否包含严格递增顺序的整数。我会这样做:

let arri = 
    arr
    |> Array.mapi (fun i e -> i, e)

let isArrStrictlyIncreasing =
    arri
    |> Array.tryFind (fun e -> 
        if fst e = arri.Length - 1 then 
            false 
        else 
            snd e >= snd arri.[1 + fst e])
    |> Option.isNone
但是,我想知道是否有一种更简洁、更实用的方法来进行数组内比较,而不必使用
array.mapi
if else

一种简单的方法:

let isincr arr = 
   arr 
   |> Array.fold (fun (a,b) (c) -> ((b<c && a)),c) (true,System.Int32.MinValue) 
   |> fst
让isincr arr=
啊
|>数组.fold(fun(a,b)(c)->(b fst

您不能只执行以下操作吗

let expected = [| candidate.[0] .. candidate.[0] + candidate.Length - 1 |]
candidate = expected
这只是构建您期望的数组,并使用F#的结构相等性来比较这两个数组


一个更普遍的选择可能是:

let isOrdered arr = arr |> Array.sort = arr

let hasDistinctMembers (arr : 'a array) = 
    let distinct = arr |> Seq.distinct |> Seq.toArray
    distinct.Length = arr.Length

let isStrictlyIncreasing arr = arr |> isOrdered && arr |> hasDistinctMembers
用法:

> isStrictlyIncreasing [| 7; 11; 8 |];;
val it : bool = false
> isStrictlyIncreasing [| 7..33 |];;
val it : bool = true
> isStrictlyIncreasing [| 7; 8; 11 |];;
val it : bool = true
> isStrictlyIncreasing [| 7; 7; 8; 11 |];;
val it : bool = false

我的FSI为
系统.Int32.MinValue
抛出了一个“此表达式应具有bool类型,但此处具有int类型”。抱歉,忘记了保持累加器-修复。我认为如果输入中存在间隙(即
[|1;4 |]
)可能会失败。啊,您不想要严格单调递增的序列:)