私はトイプロブレム(凸包の識別)で遊んでいて、辞書式順序付けがすでに2回必要でした。ケースの1つにリストが表示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#でこれを実現する方法はありますか?それとも私はこれについて間違って考えていますか?