F# 中的数组内比较

In-array comparison in F#

假设我想在 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

但是,我想知道是否有一种更简洁的 "functional" 方法可以在不使用 Array.mapiif-else 的情况下进行此类数组内比较?

一个简单的方法:

let isincr arr = 
   arr 
   |> Array.fold (fun (a,b) (c) -> ((b<c && a)),c) (true,System.Int32.MinValue) 
   |> 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