我正在玩一个玩具问题(凸壳识别),并且已经需要字典排序两次。其中一个案例给出了一个列表type Point = { X: float; Y: float }
,我想按 X 坐标排序,如果相等,则按 Y 坐标排序。
我最终写了以下内容:
let rec lexiCompare comparers a b =
match comparers with
[ ] -> 0
| head :: tail ->
if not (head a b = 0) then head a b else
lexiCompare tail a b
let xComparer p1 p2 =
if p1.X > p2.X then 1 else
if p1.X < p2.X then -1 else
0
let yComparer p1 p2 =
if p1.Y > p2.Y then 1 else
if p1.Y < p2.Y then -1 else
0
let coordCompare =
lexiCompare [ yComparer; xComparer ]
这让我可以做
let lowest (points: Point list) =
List.sortWith coordCompare points
|> List.head
到目前为止,一切都很好。但是,这感觉有点重。我必须创建返回 -1、0 或 1 的特定比较器,到目前为止,在 List.minBy 之类的情况下,我还看不到直接使用它的方法。理想情况下,我想做一些事情,提供一个可以比较的函数列表(比如 [(fun p -> pX); (fun p -> pY)]),并做一些类似列表的字典最小的事情支持该功能列表的项目。
有没有办法在 F# 中实现这一点?还是我想错了?