计算F#中元组列表的最小值和最大值

sth*_*ers 2 f#

在F#中,给定 game: (int*int) list 我想计算minx,maxx,miny,maxy每个元组维度的最小值和最大值.

这段代码有效,但看起来有点笨拙:

let minX (game: (int*int) list) =  game |> List.map (fun (x,y) -> x) |> Seq.min 
let maxX (game: (int*int) list) =  game |> List.map (fun (x,y) -> x) |> Seq.max 
let minY (game: (int*int) list) =  game |> List.map (fun (x,y) -> y) |> Seq.min 
let maxY (game: (int*int) list) =  game |> List.map (fun (x,y) -> y) |> Seq.max 
Run Code Online (Sandbox Code Playgroud)

有任何改进的暗示吗?

pad*_*pad 7

let minX game = List.minBy fst game |> fst
let maxX game = List.maxBy fst game |> fst
let minY game = List.minBy snd game |> snd
let maxY game = List.maxBy snd game |> snd
Run Code Online (Sandbox Code Playgroud)

  • @sthiers:如果您只想遍历列表一次,请使用折叠. (3认同)

Rob*_*sen 5

像约翰一样,但更容易阅读:

let game = [(1,4);(2,1)]
let minx,miny,maxx,maxy = 
   game |> List.fold (fun (mx,my,Mx,My) (ax,ay) -> 
             min mx ax, min my ay,
             max Mx ax, max My ay) (Int32.MaxValue,Int32.MaxValue,Int32.MinValue,Int32.MinValue)
Run Code Online (Sandbox Code Playgroud)