Решения, использующие унарный минус: (fun x -> -x - 1)
и (fun x -> -x)
, не работают, если у вас есть неподписанные типы:
let a = [| 0uy; 255uy; 254uy; 1uy |]
printfn "%A" (a |> Array.sortBy (fun x -> -x - 1))
// error FS0001: The type 'byte' does not support the operator '~-'
Вместо этого мы можем использовать тот факт, что -x = ~~~x + 1
, где ~~~
- оператор побитового отрицания и, следовательно, -x - 1 = ~~~x
. Итак, короткое решение, которое работает как со знаком, так и без знака:
Array.sortBy (~~~) // equivalent to Array.sortBy (fun x -> ~~~x)
Примеры:
let a = [| 0uy; 255uy; 254uy; 1uy |]
printfn "%A" (a |> Array.sortBy (~~~))
// [|255uy; 254uy; 1uy; 0uy|]
let a = [| 1; -1; System.Int32.MinValue; 0; System.Int32.MaxValue; 1 |]
printfn "%A" (a |> Array.sortBy (~~~))
// [|2147483647; 1; 1; 0; -1; -2147483648|]