我在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;
}
视为隐式函数。
有人可以解释一下吗?
答案 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"