对数组进行排序,以便所有带有Some的元素都在前面

Cho*_*890 1 .net arrays sorting f# optional

我有一个F#record type(Request<'a>)定义了一个字段作为('a -> bool) option.在某些时候,我有一个这种记录类型的数组,并希望对它进行排序,以便所有的那些Some ('a -> bool)都是第一个(最低索引),并且所有那些None将是最后一个(最高索引).

我尝试过以下操作,但这似乎不起作用,因为我有一些位于数组的中间/末尾:

let sort (req1:Request<'a>) (req2:Request<'a>) =
    if req1.ResourceCondition.IsSome
    then
        -1
    else if req2.ResourceCondition.IsSome
    then
        1
    else
        0

let reqArray = Array.sortWith sort fifoArray
Run Code Online (Sandbox Code Playgroud)

Fyo*_*kin 11

您的比较功能有错误的逻辑.尝试一步一步地运行它.你看:如果两个req1req2Some,那么你的函数将返回-1.不是你期望的,是吗?

我宁愿用模式匹配来表达它:

let sort (req1:Request<_>) (req2:Request<_>) =
    match req1.ResourceCondition, req2.ResourceCondition with
    | None, Some _ -> 1
    | Some _, None -> -1
    | _ -> 0
Run Code Online (Sandbox Code Playgroud)