3

F# Design Patterns我在Gene Belitski的优秀书中找到了这段代码:

let (| `` I'm active pattern `` |) x = x + 2
let (`` I'm active pattern `` y) = 40
(*
val ( |`` I'm active pattern ``| ) : x:int -> int
val y : int = 42
*)

作者承认这是

“如果您还记得值的 let 绑定是基于模式匹配的数据反汇编的极端情况,那么这个稍微令人难以置信的示例就会变得清晰,因此I'm active pattern应用于输入参数 40 并将结果 42 绑定到 x。”

我不明白。I'm active pattern鉴于 40 在右侧,为什么会应用于 40?直觉上,我猜 y = 38,而不是 42,将表达式let (`` I'm active pattern `` y) = 40视为隐式函数。

谁能解释一下?

4

1 回答 1

7

这就是主动模式的特别之处;对于正常功能,定义let f x = ...反映了 的应用:您可以通过在定义中替换来进行f心理评估。f eex

相比之下,使用活动模式let (|P|) x = ...时,当您看到let (P y) = e新标识符时y,将获得将定义主体应用于 的结果e

对于结果类型与输入类型不同的活动模式,这可能更容易看到:

let (|StringValue|) (i:int) = sprintf "%i" i

let (StringValue s) = 1 // s is of type string, with value "1"
于 2017-02-09T17:52:12.517 回答