Типы в языке формул Power Query M

Язык формул Power Query M — это полезный и экспрессивный язык машинного анализа данных. Но у него есть некоторые ограничения. Например, нет строгого применения системы типов. В некоторых случаях требуется более строгая проверка. К счастью, M предоставляет встроенную библиотеку с поддержкой типов, чтобы сделать более надежную проверку возможной.

Разработчикам следует тщательно понять систему типов, чтобы сделать это с любой общей. И, хотя спецификация языка Power Query M хорошо объясняет систему типов, она оставляет несколько сюрпризов. Например, для проверки экземпляров функций требуется способ сравнения типов для совместимости.

Изучая систему типов M более тщательно, многие из этих проблем можно уточнить, и разработчики смогут создавать необходимые решения.

Чтобы понять используемые обозначения, достаточно иметь представление об исчислении предикатов и наивной теории множеств.

ОТБОРОЧНЫЕ

(1) B := { true; false }
B — типичный набор логических значений

(2) N := { допустимые идентификаторы M }
N — это набор всех допустимых имен в M. Это определено в другом месте.

(3) P := ⟨B, T
P — это набор параметров функции. Каждый из них может быть необязательным и имеет тип. Имена параметров не имеют значения.

(4) Pn := ⋃0≤i≤ni, Pi
Pn — это набор всех упорядоченных последовательностей параметров функции.

(5) P* := ⋃0≤i≤∞Pi
P* — это набор всех возможных последовательностей параметров функции от длины 0 вверх.

(6) F := ⟨B, N, T
F — это набор всех полей записей. Каждое поле может быть не обязательным, а также имеет имя и тип.

(7) Fn := ∏0≤i≤nF
Fn — это набор всех наборов полей записи n.

(8) F* := ( ⋃0≤i≤∞Fi ) ∖ { F | ⟨b1, n1, t1⟩, ⟨b2, n2, t2⟩ ∈ Fn1 = n2 }
F* — это набор всех наборов (любой длины) полей записи, за исключением наборов, в которых несколько полей имеют одинаковое имя.

(9) C := ⟨N,T
C — это набор типов столбцов для таблиц. У каждого столбца есть имя и тип.

(10) Cn ⊂ ⋃0≤i≤ni, C
Cn — это набор всех упорядоченных последовательностей типов столбцов n.

(11) C* := ( ⋃0≤i≤∞Ci ) ∖ { Cm | ⟨a, ⟨n1, t1⟩⟩, ⟨b, ⟨n2, t2⟩⟩ ∈ Cmn1 = n2 }
C* — это набор всех сочетаний (любой длины) типов столбцов, за исключением тех, где несколько столбцов имеют одно и то же имя.

Типы M

(12) TF := ⟨P, P*
Тип функции состоит из возвращаемого типа и упорядоченного списка параметров функции нулевого или большего числа.

(13) TL :=〖T
Тип списка обозначается заданным типом (называемым "типом элемента"), заключенным в фигурные скобки. Так как фигурные скобки используются в метаязыке, в этом документе используются скобки 〖 〗.

(14) TR := ⟨B, F*
Тип записи имеет флаг, указывающий, является ли он открытым и неупорядоченными полями записи.

(15) TRo := ⟨true, F

(16) TR := ⟨false, F
TRo and TR — это сокращенные нотации для открытых и закрытых записей соответственно.

(17) TT := C*
Тип таблицы — это упорядоченная последовательность типов столбцов нулевого или более, где нет конфликтов имен.

(18) TP := { любой тип; нет; NULL; логическое значение; числовое значение; значение времени; значение даты; значение datetime; значение datetimezone; значение длительности; текстовое значение; двоичное значение; тип; список; запись; таблица; функция; любое отличное от NULL значение }
Примитивный тип является одним из этого списка ключевое слово M.

(19) TN := { tn, u ∈ T | tn = u+null } = nullable t
Любой тип можно также пометить как допускающий значение NULL, используя ключевое слово "nullable".

(20) T := TFTLTRTTTPTN
Набор всех типов M является объединением этих шести наборов типов:
Типы функций, типы списков, типы записей, типы таблиц, примитивные типы и типы, допускающие значение NULL.

ФУНКЦИИ

Необходимо определить одну функцию: NonNullable : TT
Эта функция принимает тип и возвращает тип, эквивалентный, за исключением того, что он не соответствует значению NULL.

УДОСТОВЕРЕНИЯ

Некоторые удостоверения необходимы для определения некоторых особых случаев, а также могут помочь в определении указанных выше удостоверений.

(21) Nullable any = any
(22) Nullable anynonnull = any
(23) NULL = NULL
(24) Nullable none = NULL
(25) nullable nullable tT = nullable t
(26) NonNullable(nullable tT) = NonNullable(t)
(27) NonNullable(any) = anynonnull

СОВМЕСТИМОСТЬ ТИПОВ

Как определено в другом месте, тип M соответствует другому типу M, если и только если все значения, соответствующие первому типу, также соответствуют второму типу.

Здесь определяется отношение совместимости, которое не зависит от значений согласованности и основано на свойствах самих типов. Ожидается, что это отношение, как определено в этом документе, полностью эквивалентно исходному семантическому определению.

Отношение "совместимо с": ≤ : BT × T
В приведенном ниже разделе нижний регистр t всегда будет представлять тип M, элемент T.

A Φ будет представлять подмножество F* или C*.

(28) tt
Это отношение рефлексивно.

(29) tatbtbtctatc
Это отношение транзитивно.

(30) нет ≤ t ≤ любой тип
Типы M образуют решетку по этому отношению; нет нижнего, и любой из них является верхней.

(31) ta, tbTNtataNonNullable(ta) ≤ NonNullable(tb)
Если два типа совместимы, эквиваленты NonNullable также совместимы.

(32) null ≤ tTN
Примитивный тип NULL совместим со всеми типами, допускаемыми значением NULL .

(33) tTN ≤ любое отличное от NULL значение
Все ненуклюжие типы совместимы с anynonnull.

(34) NonNullable(t) ≤ t
Тип NonNullible совместим с эквивалентом null.

(35) tTFt ≤ функция
Все типы функций совместимы с функцией.

(36) tTLt ≤ список
Все типы списков совместимы со списком.

(37) tTRt ≤ запись
Все типы записей совместимы с записью.

(38) tTTt ≤ таблица
Все типы таблиц совместимы с таблицей.

(39) tatb ↔ 〖ta〗≤〖tb
Тип списка соответствует другому типу списка, если типы элементов совместимы и наоборот.

(40) taTF = ⟨ pa, p* ⟩, tbTF = ⟨ pb, p* ⟩ ∧ papbtatb
Тип функции совместим с другим типом функции, если возвращаемые типы совместимы, а списки параметров идентичны.

(41) taTRo, tbTRtatb
Открытый тип записи никогда не совместим с типом закрытой записи.

(42) taTR = ⟨false, Φ⟩, tbTRo = ⟨true, Φ⟩ → tatb
Тип закрытой записи совместим с другим открытым типом записи.

(43) taTRo = ⟨true, (Φ, ⟨true, n, any⟩)⟩, tbTRo = ⟨true, Φ⟩ → tatbtbta
Необязательное поле с типом любого типа может игнорироваться при сравнении двух открытых типов записей.

(44) taTR = ⟨b, (Φ, ⟨β, n, ua⟩)⟩, tbTR = ⟨b, (Φ, ⟨β, n, ub⟩)⟩ ∧ uaubtatb
Два типа записей, которые отличаются только по одному полю, совместимы, если имя и необязательность поля идентичны, а типы указанного поля совместимы.

(45) taTR = ⟨b, (Φ, ⟨false, n, u⟩)⟩, tbTR = ⟨b, (Φ, ⟨true, n, u⟩)⟩ → tatb
Тип записи с необязательным полем совместим с типом записи идентичным, но для этого поля является необязательным.

(46) taTRo = ⟨true, (Φ, ⟨b, n, u⟩)⟩, tbTRo = ⟨true, Φ⟩ → tatb
Открытый тип записи совместим с другим открытым типом записи с одним меньшем полем.

(47) taTT = (Φ, ⟨i, ⟨n, ua⟩⟩), tbTT = (Φ, ⟨i, ⟨n, ub⟩⟩) ∧ uaubtatb
Тип таблицы совместим со вторым типом таблицы, который идентичен одному столбцу с разными типами, если типы для этого столбца совместимы.

ССЫЛКИ

Корпорация Майкрософт (август 2015 г.)
Спецификация языка формул Microsoft Power Query для Excel [PDF]
Извлекается из https://msdn.microsoft.com/library/mt807488.aspx

Корпорация Майкрософт (n.d.)
Справочник по функции Power Query M [веб-страница]
Извлекается из https://msdn.microsoft.com/library/mt779182.aspx