为什么活动模式会以这种方式运行?

时间:2017-02-09 17:07:53

标签: 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 *) 中找到了这段代码:

I'm active pattern

作者认识到这是

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

我不明白。为什么let (`` I'm active pattern `` y) = 40适用于40,假设40在右侧?我直觉地猜测y = 38而不是42,将表达式.btn-default:hover { background: #333; } 视为隐式函数。

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:7)

是什么让活动模式变得特别;使用正常函数,定义let f x = ...反映了f的应用:您可以通过在定义中用f e代替e来精神评估x

相比之下,对于活动模式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"