模式匹配记录类型

dev*_*ium 2 .net f# functional-programming pattern-matching

我们考虑以下Point记录类型:

type Point = { x:int; y:int }
Run Code Online (Sandbox Code Playgroud)

我想创建一个谓词,告诉我一个给定的点是否在一个有效的区域.

let insideBounds p =
  let notInside c = c < 0 || c > 100
  match p with
  | {x=i; y=_} when notInside i -> false
  | {x=_; y=j} when notInside j -> false
  | _                           -> true
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我想知道是否有另一种方法可以实现与insideBounds签名相同的结果

let insideBounds {x=i; y=j}
Run Code Online (Sandbox Code Playgroud)

相反,仍然使用模式匹配?

Tom*_*cek 6

您可以定义一个活动模式,用于测试值是否在指定为参数的范围内:

let (|InRange|_|) (min, max) v = 
  if v >= min && v <= max then Some () else None
Run Code Online (Sandbox Code Playgroud)

然后你可以这样定义insideBounds:

let insideBounds = function
  | { x = InRange (0, 100); y = InRange (0, 100) } -> true
  | _ -> false
Run Code Online (Sandbox Code Playgroud)

当两个xanad y成员都在指定范围内时,第一个案例匹配.活动模式返回option unit,这意味着它不绑定任何值.这(0, 100)是一个输入参数,当值(xy)在范围内时,模式匹配.

(在其他情况下`匹配10与InRange(0