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)
相反,仍然使用模式匹配?
您可以定义一个活动模式,用于测试值是否在指定为参数的范围内:
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)是一个输入参数,当值(x或y)在范围内时,模式匹配.
(在其他情况下`匹配10与InRange(0
| 归档时间: |
|
| 查看次数: |
443 次 |
| 最近记录: |