F# 为什么活动模式会有这种行为?
我在Gene Belitski的优秀著作《设计模式》中找到了这段代码: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绑定是基于模式匹配的数据反汇编的一个极端情况,那么这是一个稍
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中的值。