将点转换为fsharp中的线

时间:2019-12-07 23:24:30

标签: f#

我有几点要转换为线。例如[{x=0; y=0}; {x=1; y=1}; {x=2; y=2}; {x=3; y3}]应该转换为[({x=0; y=0}, {x=1; y=1}); ({x=1; y=1}, {x=2; y=2}); ({x=2; y=2}, {x=3; y=3})]

我目前的方法是这样的:

type Point = { x: int; y: int }

type Line = Point * Point

let rec pointsToLines lines points =
    if (List.length points) < 2 then
        lines
    else
        let line = points.[1], points.[0]
        let lines = line :: lines
        pointsToLines lines (List.tail points)

所以我的问题是,有没有一种单行的或惯用的方式来实现同一件事?

1 个答案:

答案 0 :(得分:2)

您可以这样写,以获得更惯用的F#:

let rec pointsToLines points =
    let rec loop lines points =
        match points with
        | x::y::rest -> loop ((x,y)::lines) rest
        | _ -> lines
    loop [] points

但是,这已经是您怀疑的内置功能之一:

List.pairwise

两者都会给您相同的结果。