Типы в языке формул 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≤n ⟨i, Pi⟩
Pn — это набор всех упорядоченных последовательностей параметров функции.
(5) P := ⋃0≤i≤∞P i*
P* — это набор всех возможных последовательностей параметров функции от длины 0 вверх.
(6) F := ⟨B, N, T⟩
F — это набор всех полей записей. Каждое поле может быть не обязательным, а также имеет имя и тип.
(7) Fn := ∏0≤i≤n F
Fn — это набор всех наборов полей записи n.
(8) F := ( ⋃0≤i≤∞ Fi ) ∖ { F | ⟨b1, n 1, t1⟩, ⟨b2, n 2, t2⟩ ∈ F ⋀ n1 = n2 }*
F* — это набор всех наборов (любой длины) полей записи, за исключением наборов, в которых несколько полей имеют одинаковое имя.
(9) C := ⟨N,T⟩
C — это набор типов столбцов для таблиц. У каждого столбца есть имя и тип.
(10) Cn ⊂ ⋃0≤i≤n ⟨i, C⟩
Cn — это набор всех упорядоченных последовательностей типов столбцов n.
(11) C* := ( ⋃0≤i≤∞ Ci ) ∖ { C | ⟨a, ⟨n1, t1⟩⟩, ⟨b, ⟨n2, t2⟩⟩ ∈ Cm ⋀ n 1 = 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, используя ключевое слово NULL .
(20) T := TF ∪ TL ∪ TR ∪ TT ∪ TP ∪ TN
Набор всех типов M является объединением этих шести наборов типов:
Типы функций, типы списков, типы записей, типы таблиц, примитивные типы и типы, допускающие значение NULL.
ФУНКЦИИ
Необходимо определить одну функцию: NonNullable : T ← T
Эта функция принимает тип и возвращает тип, эквивалентный, за исключением того, что он не соответствует значению NULL.
УДОСТОВЕРЕНИЯ
Некоторые удостоверения необходимы для определения некоторых особых случаев, а также могут помочь в определении указанных выше удостоверений.
(21) Nullable any = any
(22) Nullable anynonnull = any
(23) NULL = NULL
(24) Nullable none = NULL
(25) nullable nullable t ∈ T = nullable t
(26) NonNullable(nullable t ∈ T) = NonNullable(t)
(27) NonNullable(any) = anynonnull
СОВМЕСТИМОСТЬ ТИПОВ
Как определено в другом месте, тип M соответствует другому типу M, если и только если все значения, соответствующие первому типу, также соответствуют второму типу.
Здесь определяется отношение совместимости, которое не зависит от значений согласованности и основано на свойствах самих типов. Ожидается, что это отношение, как определено в этом документе, полностью эквивалентно исходному семантическому определению.
Отношение "совместимо с": ≤ : B ← T × T
В приведенном ниже разделе нижний регистр t всегда будет представлять тип M, элемент T.
A Φ будет представлять подмножество F* или C*.
(28) t ≤ t
Это отношение рефлексивно.
(29) ta ≤ tb ∧ tb ≤ tc → ta ≤ tc
Это отношение транзитивно.
(30) нет ≤ t ≤ любой тип
Типы M образуют решетку по этому отношению; нет нижнего, и любой из них является верхней.
(31) ta, tb ∈ TN ∧ ta ≤ ta → NonNullable(ta) ≤ NonNullable(tb)
Если два типа совместимы, эквиваленты NonNullable также совместимы.
(32) null ≤ t ∈ TN
Примитивный тип NULL совместим со всеми типами, допускаемыми значением NULL .
(33) t ∉ TN ≤ любое отличное от NULL значение
Все ненуклюжие типы совместимы с anynonnull.
(34) NonNullable(t) ≤ t
Тип NonNullible совместим с эквивалентом null.
(35) t ∈ TF → t ≤ функция
Все типы функций совместимы с функцией.
(36) t ∈ TL → t ≤ список
Все типы списков совместимы со списком.
(37) t ∈ TR → t ≤ запись
Все типы записей совместимы с записью.
(38) t ∈ TT → t ≤ таблица
Все типы таблиц совместимы с таблицей.
(39) ta ≤ tb ↔ 〖ta〗≤〖tb〗
Тип списка соответствует другому типу списка, если типы элементов совместимы и наоборот.
(40) ta ∈ TF = ⟨ pa, p* ⟩, tb ∈ TF = ⟨ pb, p* ⟩ ∧ pa ≤ pb → ta ≤ tb
Тип функции совместим с другим типом функции, если возвращаемые типы совместимы, а списки параметров идентичны.
(41) ta ∈ TRo, tb ∈ TR• → ta ≰ tb
Открытый тип записи никогда не совместим с типом закрытой записи.
(42) ta ∈ TR• = ⟨false, Φ⟩, tb ∈ TRo = ⟨true, Φ⟩ → ta ≤ tb
Тип закрытой записи совместим с другим открытым типом записи.
(43) ta ∈ TRo = ⟨true, (Φ, ⟨true, n, any⟩)⟩, tb ∈ TRo = ⟨true, Φ⟩ → ta ≤ tb ∧ tb ≤ ta
Необязательное поле с типом любого типа может игнорироваться при сравнении двух открытых типов записей.
(44) ta ∈ TR = ⟨b, (Φ, ⟨β, n, ua⟩)⟩, tb ∈ TR = ⟨b, (Φ, ⟨β, n, ub⟩)⟩ ∧ ua ≤ ub → ta ≤ tb
Два типа записей, которые отличаются только по одному полю, совместимы, если имя и необязательность поля идентичны, а типы указанного поля совместимы.
(45) ta ∈ TR = ⟨b, (Φ, ⟨false, n, u⟩)⟩, tb ∈ TR = ⟨b, (Φ, ⟨true, n, u⟩)⟩ → ta ≤ tb
Тип записи с необязательным полем совместим с типом записи идентичным, но для этого поля является необязательным.
(46) ta ∈ TRo = ⟨true, (Φ, ⟨b, n, u⟩)⟩, tb ∈ TRo = ⟨true, Φ⟩ → ta ≤ tb
Открытый тип записи совместим с другим открытым типом записи с одним меньшем полем.
(47) ta ∈ TT = (Φ, ⟨i, ⟨n, ua⟩⟩), tb ∈ TT = (Φ, ⟨i, ⟨n, ub⟩⟩) ∧ ua ≤ ub → ta ≤ tb
Тип таблицы совместим со вторым типом таблицы, который идентичен одному столбцу с разными типами, если типы для этого столбца совместимы.
ССЫЛКИ
Корпорация Майкрософт (август 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