F# 为什么活动模式会有这种行为?

F# 为什么活动模式会有这种行为?,f#,active-pattern,F#,Active Pattern,我在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绑定是基于模式匹配的数据反汇编的一个极端情况,那么这是一个稍

我在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。”

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


有人能解释一下吗

这就是活动模式的特殊之处;对于正常函数,定义
let f x=…
反映了
f
的应用:您可以通过在定义中用
e
替换
x
在心理上评估
f e

相反,对于活动模式
let(| p |)x=…
,当您看到
let(py)=e
时,新标识符
y
将得到将定义主体应用于
e
的结果

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

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

let (StringValue s) = 1 // s is of type string, with value "1"

OP中的示例有点做作,但这种类型的活动模式通常用于将某些输入转换为某些输出(例如字符串日期到日期时间等)。因为让模式匹配,你会得到这种行为。这类似于使用
let
解构DU。例如,
let(Foo x)=Foo
将取出封装在Foo DU中的值。