Почему активные шаблоны ведут себя так?
Я нашел этот код в отличной книге F# Design Patterns
Джин Белицкий:
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 находится на правой стороне? Интуитивно я бы догадался, что у = 38, а не 42, глядя на выражение let (`` I'm active pattern `` y) = 40
как неявная функция.
Кто-нибудь может объяснить?
1 ответ
Вот что делает активные шаблоны особенными; с нормальной функцией определения 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"