Сопоставление с образцом может проверять только структуру значений , оно не может обратить вспять произвольные выражения. 5
является значением. Но 3 + 2
это не так, это выражение, которое создает значение.
Аналогично, C(x, y)
- это значение для любого C
, который является конструктором типа данных, и любого x
, y
которые сами являются ценностями. Списки являются просто примером этого случая: ::
является конструктором типа данных, тип списка предопределен как
datatype 'a list = nil | :: of 'a * 'a list
(а запись [x,y,z]
является просто сокращением для x :: y :: z :: nil
.)
Опять же, x @ y
отличается, потому что @
- это функция, которая выполняет вычисления, а не конструктор. Сопоставление с образцом не может запускать функции в обратном направлении.
Концептуально значения образуют деревья, например, 5 :: nil
- это дерево, root - конструктор ::
и два листа которого 5
и * 1028. *. Сопоставление с образцом описывает только возможные разрушения этих деревьев, а не вычисления на деревьях. В результате каждый шаблон является однозначным и соответствует производительности линейно по размеру шаблона.
И да, это относится ко всем языкам.