Типы в языке формул Power Query MTypes in the Power Query M formula language

Язык формул Power Query M — это полезный и выразительный язык агрегирования данных.The Power Query M Formula Language is a useful and expressive data mashup language. Но у него есть некоторые ограничения.But it does have some limitations. Например, не существует строгой принудительной реализации системы типов.For example, there is no strong enforcement of the type system. В некоторых случаях требуется более строгая проверка.In some cases, a more rigorous validation is needed. К счастью, M предоставляет встроенную библиотеку с поддержкой типов, чтобы обеспечить более надежную проверку.Fortunately, M provides a built-in library with support for types to make stronger validation feasible.

Разработчики должны иметь полное представление о системе типов, чтобы применять этот метод во всех случаях.Developers should have a thorough understanding of the type system in-order to do this with any generality. Кроме того, хотя спецификация языка Power Query M хорошо объясняет систему типов, встречаются некоторые неожиданности.And, while the Power Query M language specification explains the type system well, it does leave a few surprises. Например, для проверки экземпляров функций требуется способ сравнения типов для обеспечения совместимости.For example, validation of function instances requires a way to compare types for compatibility.

Если внимательно изучить систему типов M, можно увидеть, что многие из этих проблем прояснены и разработчики смогут создавать необходимые решения.By exploring the M type system more carefully, many of these issues can be clarified, and developers will be empowered to craft the solutions they need.

Чтобы понять используемые обозначения, достаточно иметь представление об исчислении предикатов и наивной теории множеств.Knowledge of predicate calculus and naïve set theory should be adequate to understand the notation used.

ПРЕДВАРИТЕЛЬНЫЕ ТРЕБОВАНИЯPRELIMINARIES

(1) B := { true; false }(1) B := { true; false }
B — это типичный набор логических значенийB is the typical set of Boolean values

(2) N := { допустимые идентификаторы M }(2) N := { valid M identifiers }
N — это набор всех допустимых имен в M. Он определяется в другом месте.N is the set of all valid names in M. This is defined elsewhere.

(3) P := ⟨B, T(3) P := ⟨B, T
P — это набор параметров функции. Каждый из них может быть необязательным и имеет тип. Имена параметров несущественны.P is the set of function parameters. Each one is possibly optional, and has a type. Parameter names are irrelevant.

(4) Pn := 0≤i≤ni, Pi(4) Pn := 0≤i≤ni, Pi
Pn — это набор всех упорядоченных последовательностей параметров функции n.Pn is the set of all ordered sequences of n function parameters.

(5) P* := 0≤i≤∞ Pi(5) P* := 0≤i≤∞ Pi
P* — это набор всех возможных последовательностей параметров функции, от 0 и более.P* is the set of all possible sequences of function parameters, from length 0 on up.

(6) F := ⟨B, N, T(6) F := ⟨B, N, T
F — это набор всех полей записей. Каждое поле может быть необязательным, имеет имя и тип.F is the set of all record fields. Each field is possibly optional, has a name, and a type.

(7) Fn := 0≤i≤n F(7) Fn := 0≤i≤n F
Fn — это набор всех наборов из n полей записи.Fn is the set of all sets of n record fields.

(8) F* := ( ⋃0≤i≤∞ Fi ) ∖ { F | ⟨b1 , n1 , t1 ⟩, ⟨b2 , n2 , t2 ⟩ ∈ Fn1 = n2 }(8) F* := ( ⋃0≤i≤∞ Fi ) ∖ { F | ⟨b1, n1, t1⟩, ⟨b2, n2, t2⟩ ∈ Fn1 = n2 }
F* — это набор всех наборов (любой длины) полей записей, за исключением наборов, в которых несколько полей имеют одно и то же имя.F* is the set of all sets (of any length) of record fields, except for the sets where more than one field has the same name.

(9) C := ⟨N,T(9) C := ⟨N,T
C — это набор типов столбцов для таблиц. У каждого столбца есть имя и тип.C is the set of column types, for tables. Each column has a name and a type.

(10) Cn0≤i≤ni, C(10) Cn0≤i≤ni, C
Cn — это набор всех упорядоченных последовательностей типов столбцов n.Cn is the set of all ordered sequences of n column types.

(11) C* := ( ⋃0≤i≤∞ Ci ) ∖ { Cm | ⟨a, ⟨n1 , t1 ⟩⟩, ⟨b, ⟨n2 , t2 ⟩⟩ ∈ Cmn1 = n2 }(11) C* := ( ⋃0≤i≤∞ Ci ) ∖ { Cm | ⟨a, ⟨n1, t1⟩⟩, ⟨b, ⟨n2, t2⟩⟩ ∈ Cmn1 = n2 }
C* — это набор всех комбинаций (любой длины) типов столбцов, за исключением тех, где несколько столбцов имеют одно и то же имя.C* is the set of all combinations (of any length) of column types, except for those where more than one column has the same name.

ТИПЫ MM TYPES

(12) TF := ⟨P, P*(12) TF := ⟨P, P*
Тип функции состоит из типа возвращаемого значения и упорядоченного списка, состоящего из нуля или более параметров функции.A Function Type consists of a return type, and an ordered list of zero-or-more function parameters.

(13) TL :=〖T(13) TL :=〖T
Тип списка обозначается заданным типом (называемым "типом элемента"), заключенным в фигурные скобки. Так как фигурные скобки используются в метаязыке, в этом документе используются скобки 〖 〗 .A List type is indicated by a given type (called the "item type") wrapped in curly braces. Since curly braces are used in the metalanguage, 〖 〗 brackets are used in this document.

(14) TR := ⟨B, F*(14) TR := ⟨B, F*
Тип записи имеет флаг, указывающий, является ли он "открытым", и ноль или более неупорядоченных полей записи.A Record Type has a flag indicating whether it's "open", and zero-or-more unordered record fields.

(15) TRo := ⟨true, F(15) TRo := ⟨true, F

(16) TR := ⟨false, F(16) TR := ⟨false, F
TRo и TR — это сокращенные нотации для открытых и закрытых типов записей соответственно. TRo and TR are notational shortcuts for open and closed record types, respectively.

(17) TT := C*(17) TT := C*
Табличный тип является упорядоченной последовательностью нуля и более типов столбцов, где нет конфликтов имен.A Table Type is an ordered sequence of zero-or-more column types, where there are no name collisions.

(18) TP := { any; none; null; logical; number; time; date; datetime; datetimezone; duration; text; binary; type; list; record; table; function; anynonnull }(18) TP := { any; none; null; logical; number; time; date; datetime; datetimezone; duration; text; binary; type; list; record; table; function; anynonnull }
Примитивный тип берется из списка ключевых слов M.A Primitive Type is one from this list of M keywords.

(19) TN := { tn , u ∈ T | tn = u+null } = nullable t(19) TN := { tn, u ∈ T | tn = u+null } = nullable t
Любой тип можно дополнительно пометить как допускающий значение NULL, используя ключевое слово "nullable" .Any type can additionally be marked as being nullable, by using the "nullable" keyword.

(20) T := TF TL TR TT TP TN(20) T := TF TL TR TT TP TN
Набор всех типов M является объединением этих шести наборов типов: типы функций, типы списков, типы записей, типы таблиц, примитивные типы и типы, допускающие значение NULL.The set of all M types is the union of these six sets of types: Function Types, List Types, Record Types, Table Types, Primitive Types, and Nullable Types.

ФУНКЦИИFUNCTIONS

Необходимо определить одну функцию: NonNullable : TTOne function needs to be defined: NonNullable : TT
Эта функция принимает тип и возвращает эквивалентный тип, которые не соответствует значению NULL.This function takes a type, and returns a type that is equivalent except it does not conform with the null value.

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

Некоторые удостоверения необходимы для определения особых случаев, а также могут помочь прояснить указанные выше элементы.Some identities are needed to define some special cases, and may also help elucidate the above.

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

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

Как определено в других случаях, тип M совместим с другим типом M, только если все значения, соответствующие первому типу, также соответствуют второму типу.As defined elsewhere, an M type is compatable with another M type if and only if all values that conform to the first type also conform to the second type.

Здесь определяется отношение совместимости, которое не зависит от значений согласованности и основано на свойствах самих типов.Here is defined a compatability relation that does not depend on conforming values, and is based on the properties of the types themselves. Ожидается, что это отношение, как определено в этом документе, полностью эквивалентно исходному семантическому определению.It is anticiplated that this relation, as defined in this document, is completely equivalent to the original semantic definition.

Отношение "совместимо с": ≤ : BT × TThe "is compatible with" relation : ≤ : BT × T
В приведенном ниже разделе t в нижнем регистре всегда будет представлять тип M, элемент T.In the below section, a lowercase t will always represent an M Type, an element of T.

Φ будет представлять подмножество F* или C*.A Φ will represent a subset of F*, or of C*.

(28) tt(28) tt
Это отношение является рефлексивным.This relation is reflexive.

(29) tatbtbtctatc(29) tatbtbtctatc
Это отношение является транзитивным.This relation is transitive.

(30) none ≤ t ≤ any(30) none ≤ t ≤ any
Типы M формируют структуру для этого отношения, где none_на находится сверху, а_any  — снизу.M types form a lattice over this relation; none is the bottom, and any is the top.

(31) ta , tbTNtataNonNullable(ta ) ≤ NonNullable(tb )(31) ta, tbTNtataNonNullable(ta) ≤ NonNullable(tb)
Если два типа совместимы, то эквиваленты NonNullible также совместимы.If two types are compatible, then the NonNullable equivalents are also compatible.

(32) null ≤ tTN(32) null ≤ tTN
Примитивный тип NULL совместим со всеми типами, допускающими значение NULL.The primitive type null is compatible with all nullable types.

(33) tTN ≤ anynonnull(33) tTN ≤ anynonnull
Все типы, не допускающие значения NULL, совместимы с anynonnull.All nonnullable types are compatible with anynonnull.

(34) NonNullable(t) ≤ t(34) NonNullable(t) ≤ t
Тип NonNullible совместим с эквивалентом, допускающим значение NULL.A NonNullible type is compatible with the nullable equivalent.

(35) tTFt ≤ function(35) tTFt ≤ function
Все типы функций совместимы с function.All function types are compatible with function.

(36) tTLt ≤ list(36) tTLt ≤ list
Все типы списков совместимы с list.All list types are compatible with list.

(37) tTRt ≤ record(37) tTRt ≤ record
Все типы записей совместимы с record.All record types are compatible with record.

(38) tTTt ≤ table(38) tTTt ≤ table
Все типы таблиц совместимы с table.All table types are compatible with table.

(39) tatb ↔ 〖ta 〗≤〖tb(39) tatb ↔ 〖ta〗≤〖tb
Тип списка совместим с другим типом списка, если типы элементов совместимы, и наоборот.A list type is compaible with another list type if the item types are compatible, and vice-versa.

(40) taTF = ⟨ pa , p* ⟩, tbTF = ⟨ pb , p* ⟩ ∧ papbtatb(40) taTF = ⟨ pa, p* ⟩, tbTF = ⟨ pb, p* ⟩ ∧ papbtatb
Тип функции совместим с другим типом функции, если типы возвращаемых значений совместимы, а списки параметров идентичны.A function type is compatible with another function type if the return types are compatible, and the parameter lists are identical.

(41) taTRo, tbTRtatb(41) taTRo, tbTRtatb
Тип открытой записи не совместим с типом закрытой записи.An open record type is never compatible with a closed record type.

(42) taTR = ⟨false, Φ ⟩, tbTRo = ⟨true, Φ ⟩ → tatb(42) taTR = ⟨false, Φ⟩, tbTRo = ⟨true, Φ⟩ → tatb
Тип закрытой записи совместим с типом открытой записи, который в других обстоятельствах был бы идентичным.A closed record type is compatible with an otherwise identical open record type.

(43) taTRo = ⟨true, ( Φ , ⟨true, n, any⟩)⟩, tbTRo = ⟨true, Φ ⟩ → tatbtbta(43) taTRo = ⟨true, (Φ, ⟨true, n, any⟩)⟩, tbTRo = ⟨true, Φ⟩ → tatbtbta
Необязательное поле с типом any может быть пропущено при сравнении двух открытых типов записей.An optional field with the type any may be ignored when comparing two open record types.

(44) taTR = ⟨b, (Φ, ⟨β, n, ua⟩)⟩, tbTR = ⟨b, (Φ, ⟨β, n, ub⟩)⟩ ∧ uaubtatb(44) taTR = ⟨b, (Φ, ⟨β, n, ua⟩)⟩, tbTR = ⟨b, (Φ, ⟨β, n, ub⟩)⟩ ∧ uaubtatb
Два типа записей, отличающиеся только одним полем, являются совместимыми, если имя и необязательность поля идентичны, а типы этих полей совместимы.Two record types that differ only by one field are compatible if the name and optionality of the field are identical, and the types of said field are compatible.

(45) taTR = ⟨b, (Φ, ⟨false, n, u⟩)⟩, tbTR = ⟨b, (Φ, ⟨true, n, u⟩)⟩ → tatb(45) taTR = ⟨b, (Φ, ⟨false, n, u⟩)⟩, tbTR = ⟨b, (Φ, ⟨true, n, u⟩)⟩ → tatb
Тип записи с обязательным полем совместим с типом записи, идентичным во всем, кроме того, что это поле является необязательным.A record type with a non-optional field is compatible with a record type identical but for that field being optional.

(46) taTRo = ⟨true, ( Φ , ⟨b, n, u⟩)⟩, tbTRo = ⟨true, Φ ⟩ → tatb(46) taTRo = ⟨true, (Φ, ⟨b, n, u⟩)⟩, tbTRo = ⟨true, Φ⟩ → tatb
Тип открытой записи совместим с другим типом открытой записи, где на одно поле меньше.An open record type is compatible with another open record type with one fewer field.

(47) taTT = ( Φ , ⟨i, ⟨n, ua ⟩⟩), tbTT = ( Φ , ⟨i, ⟨n, ub ⟩⟩) ∧ uaubtatb(47) taTT = (Φ, ⟨i, ⟨n, ua⟩⟩), tbTT = (Φ, ⟨i, ⟨n, ub⟩⟩) ∧ uaubtatb
Тип таблицы совместим с типом второй таблицы, который идентичен во всем, кроме того, что один столбец имеет другой тип, если типы этого столбца совместимы.A table type is compatible with a second table type, which is identical but for one column having a differing type, when the types for that column are compatible.

REFERENCESREFERENCES

Корпорация Майкрософт (август 2015 года)Microsoft Corporation (2015 August)
Спецификация языка формул Microsoft Power Query для Excel [PDF]Microsoft Power Query for Excel Formula Language Specification [PDF]
Получено со страницы https://msdn.microsoft.com/library/mt807488.aspxRetrieved from https://msdn.microsoft.com/library/mt807488.aspx

Корпорация Майкрософт (дата не указана)Microsoft Corporation (n.d.)
Справочник по функциям Power Query M [веб-страница]Power Query M function reference [web page]
Получено со страницы https://msdn.microsoft.com/library/mt779182.aspxRetrieved from https://msdn.microsoft.com/library/mt779182.aspx