파워 쿼리 M 수식 언어의 형식

파워 쿼리 M 수식 언어는 유용하고 표현적인 데이터 매시업 언어입니다. 그러나 몇 가지 제한 사항이 있습니다. 예를 들어 형식 시스템의 강력한 적용은 없습니다. 경우에 따라 보다 엄격한 유효성 검사가 필요합니다. 다행히 M은 보다 강력한 유효성 검사를 가능하게 하는 형식을 지원하는 기본 제공 라이브러리를 제공합니다.

개발자는 일반적으로 이 작업을 수행하려면 형식 시스템을 철저히 이해해야 합니다. 파워 쿼리 M 언어 사양은 형식 시스템을 잘 설명하지만 몇 가지 놀라움을 남깁니다. 예를 들어 함수 인스턴스의 유효성을 검사하려면 호환성을 위해 형식을 비교하는 방법이 필요합니다.

M 형식 시스템을 보다 신중하게 탐색하면 이러한 많은 문제를 명확히 할 수 있으며 개발자는 필요한 솔루션을 만들 수 있습니다.

사용된 표기법을 이해하기 위해서는 조건자 계산 및 기초적인 집합론을 알고 있으면 됩니다.

예선

(1) B := { true; false }
B는 일반적인 부울 값 집합입니다.

(2) N := { 유효한 M 식별자 }
N은 M에서 유효한 모든 이름의 집합입니다. 다른 곳에서 정의됩니다.

(3) P := ⟨B, T
P는 함수 매개 변수 세트입니다. 각 항목은 선택 사항일 수 있으며 형식이 있습니다. 매개 변수 이름은 관련이 없습니다.

(4) Pn := ⋃0≤i≤ni, Pi
Pn 은 n 함수 매개 변수의 모든 순서가 지정된 시퀀스의 집합입니다.

(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, n1, t1⟩, ⟨b2, n2, t2⟩ ∈ Fn n1 = 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⟩⟩ ∈ Cmn n1 = n2 }*
C*는 두 개 이상의 열이 동일한 이름을 사용하는 세트를 제외하고 모든 열 형식 조합(임의 길이)의 세트입니다.

M 형식

(12) TF := ⟨P, P*
함수 형식은 반환 형식과 0개 이상의 함수 매개 변수의 순서가 지정된 목록으로 구성됩니다.

(13) TL :=〖T
목록 형식은 중괄호로 묶인 지정된 형식(“항목 형식”이라고 함)으로 표시됩니다. 중괄호는 metalanguage에서 사용되므로 이 문서에서는 〖 〗 대괄호가 사용됩니다.

(14) TR := ⟨B, F*
레코드 형식에는 "열기"인지 여부를 나타내는 플래그와 순서가 지정되지 않은 레코드 필드가 0개 이상 있습니다.

(15) TRo := ⟨true, F

(16) TR := ⟨false, F
TRo 및 TR은 각각 열린 레코드 형식 및 닫힌 레코드 형식의 표기 바로 가기입니다.

(17) TT := C*
테이블 형식은 이름 충돌이 없는 0개 이상의 열 형식의 순서가 지정된 시퀀스입니다.

(18) TP := { any; none; null; logical; number; time; date; datetime; datetimezone; duration; text; binary; type; list; record; table; function; anynonnull }
기본 형식은 이 M 키워드 목록의 형식입니다.

(19) TN := { tn, u ∈ T | tn = u+null } = nullable t
또한 "nullable" 키워드를 사용하여 모든 형식을 nullable로 표시할 수 있습니다.

(20) T := TFTLTRTTTPTN
모든 M 형식 세트는 다음 6가지 형식 세트의 공용 구조체입니다.
함수 형식, 목록 형식, 레코드 형식, 테이블 형식, 기본 형식 및 Nullable 형식입니다.

FUNCTIONS

하나의 함수를 정의해야 합니다. NonNullable : TT
이 함수는 형식을 사용하고 null 값을 따르지 않는다는 점을 제외하고 동등한 형식을 반환합니다.

ID

일부 ID는 몇 가지 특별한 경우를 정의하는 데 필요하며 위의 설명에도 도움이 될 수 있습니다.

(21) nullable any = any
(22) nullable anynonnull = any
(23) nullable 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는 항상 T요소인 M Type을 나타냅니다.

ΦF* 또는 C*의 하위 집합을 나타냅니다.

(28) tt
이 관계는 반사적입니다.

(29) tatbtbtctatc
이 관계는 전이적입니다.

(30) none ≤ t ≤ any
M 형식은 이 관계보다 격자를 형성합니다. 없음 은 맨 아래이고 맨 위는 없습니다 .

(31) ta, tbTNtataNonNullable(ta) ≤ NonNullable(tb)
두 형식이 호환되는 경우 Nullable이 아닌 항목도 호환됩니다.

(32) null ≤ tTN
기본 형식 null 은 모든 nullable 형식과 호환됩니다.

(33) tTN ≤ anynonnull
null을 허용하지 않는 모든 형식은 anynonnull과 호환됩니다.

(34) NonNullable(t) ≤ t
Nullable이 아닌 형식은 nullable 형식과 호환됩니다.

(35) tTFt ≤ function
모든 함수 형식은 함수와 호환됩니다.

(36) tTLt ≤ list
모든 목록 유형은 목록과 호환됩니다.

(37) tTRt ≤ record
모든 레코드 형식은 레코드와 호환됩니다.

(38) tTTt ≤ table
모든 테이블 형식은 테이블과 호환됩니다.

(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
테이블 형식은 두 번째 테이블 형식과 호환됩니다. 이 형식은 동일하지만 해당 열의 형식이 호환되는 경우 형식이 다른 한 열에 대해 호환됩니다.

REFERENCES

Microsoft Corporation(2015년 8월)
Excel 수식 언어 사양에 대한 Microsoft 파워 쿼리 [PDF]
에서 검색됨 https://msdn.microsoft.com/library/mt807488.aspx

Microsoft Corporation(n.d.)
파워 쿼리 M 함수 참조 [웹 페이지]
에서 검색됨 https://msdn.microsoft.com/library/mt779182.aspx