유형
형식 값은 다른 값을 분류하는 값입니다. 형식으로 분류되는 값은 해당 형식을 준수한다고 합니다. M 형식 시스템은 다음과 같은 종류의 형식으로 구성됩니다.
기본값(
binary
, ,,date
datetime
datetimezone
duration
list
logical
null
number
record
text
time
type
) 을 분류하고 여러 추상 형식(function
,table
,any
anynonnull
및none
)도 포함하는 기본 형식필드 이름 및 값 형식에 따라 레코드 값을 분류하는 레코드 형식
단일 항목 기본 형식을 사용하여 목록을 분류하는 목록 형식
매개 변수 형식 및 반환 값에 따라 함수 값을 분류하는 함수 형식
열 이름, 열 형식 및 키를 기반으로 테이블 값을 분류하는 테이블 형식
기본 형식으로 분류된 모든 값 외에 null 값을 분류하는 Null 허용 형식
형식인 값을 분류하는 형식 형식
기본 형식 집합none
모든 함수 값은 추상 형식function
, 추상 형식에 대한 모든 테이블 값, 추상 형식table
에 대한 모든 값, 추상 형식any
에 대한 null이 아닌 모든 값 및 추상 형식anynonnull
none
에 대한 값 없음을 준수합니다. 형식을 준수하는 none
값을 생성할 수 없으므로 형식 none
식이 오류를 발생하거나 종료하지 않아야 합니다. 기본 형식은 function
각각 해당 형식 table
의 직접 함수나 테이블이 없기 때문에 추상 형식입니다. 기본 형식 record
은 list
정의된 필드가 없는 열린 레코드와 형식 목록을 각각 나타내기 때문에 추상이 아닌 형식입니다.
닫힌 기본 형식 집합의 멤버가 아닌 모든 형식과 nullable 형식을 모두 사용자 지정 형식이라고 합니다. 사용자 지정 형식은 다음을 사용하여 작성할 수 있습니다.type-expression
type-expression:
primary-expression
type
primary-type
type:
primary-expression
primary-type
primary-type:
primitive-type
record-type
list-type
function-type
table-type
nullable-type
primitive-type: 다음 중 하나
any anynonnull binary date datetime datetimezone duration function list logical
none null number record table text time type
기본 형식 이름은 형식 컨텍스트에서만 인식되는 컨텍스트 키워드입니다. 형식 컨텍스트에서 괄호를 사용하면 문법이 정규식 컨텍스트로 다시 이동하므로 형식 키워드를 사용하여 형식 컨텍스트로 다시 이동해야 합니다. 예를 들어 형식 컨텍스트에서 함수를 호출하기 위해 괄호를 사용할 수 있습니다.
type nullable ( Type.ForList({type number}) )
// type nullable {number}
괄호를 사용하여 기본 형식 이름과 이름이 충돌하는 변수에 액세스할 수도 있습니다.
let record = type [ A = any ] in type {(record)}
// type {[ A = any ]}
다음 예제에서는 숫자 목록을 분류하는 형식을 정의합니다.
type { number }
마찬가지로 다음 예제에서는 이름이 지정 X
되고 Y
값이 숫자인 필수 필드가 있는 레코드를 분류하는 사용자 지정 형식을 정의합니다.
type [ X = number, Y = number ]
값의 지정된 형식은 다음 예제와 같이 표준 라이브러리 함수 Value.Type사용하여 가져옵니다.
Value.Type( 2 ) // type number
Value.Type( {2} ) // type list
Value.Type( [ X = 1, Y = 2 ] ) // type record
이 is
연산자는 다음 예제와 같이 값의 형식이 지정된 형식과 호환되는지 여부를 확인하는 데 사용됩니다.
1 is number // true
1 is text // false
{2} is list // true
연산자는 as
값이 지정된 형식과 호환되는지 확인하고 그렇지 않으면 오류를 발생합니다. 그렇지 않으면 원래 값을 반환합니다.
Value.Type( 1 as number ) // type number
{2} as text // error, type mismatch
및 is
연산자는 as
nullable 기본 형식만 올바른 피연산자로 허용합니다. M은 사용자 지정 형식에 대한 규칙의 값을 확인하는 수단을 제공하지 않습니다.
형식 X
은 X
됩니다Y
. 모든 형식은 형식과 호환되며 형식 any
(자체) none
은 형식 none
과 호환되지 않습니다. 다음 그래프는 호환성 관계를 보여줍니다. (형식 호환성은 반사적이고 전이적으로, 형식 any
을 상단 값으로, 형식 none
을 하단 값으로 하는 격자를 형성합니다.) 추상 형식의 이름은 기울임꼴로 설정됩니다.
다음 연산자는 형식 값에 대해 정의됩니다.
연산자 | 결과 |
---|---|
x = y |
같음 |
x <> y |
같지 않음 |
x ?? y |
Coalesce |
형식 값의 네이티브 형식은 내장 형식 type
입니다.
M 언어의 형식은 모든 값을 분류하는 형식인 형식 any
에 루팅된 비연속 계층 구조를 형성합니다. 모든 M 값은 정확히 하나의 기본 하위 형식을 준수합니다 any
. 형식에서 파생되는 닫힌 기본 형식 any
집합은 다음과 같습니다.
-
type null
- Null 값을 분류 -
type logical
- true 및 false 값을 분류합니다. -
type number
- 숫자 값을 분류합니다. -
type time
- 시간 값을 분류합니다. -
type date
- 날짜 값을 분류합니다. -
type datetime
- datetime 값을 분류합니다. -
type datetimezone
- datetimezone 값을 분류합니다. -
type duration
- 기간 값을 분류합니다. -
type text
- 텍스트 값을 분류합니다. -
type binary
- 이진 값을 분류합니다. -
type type
- 형식 값을 분류합니다. -
type list
- 목록 값을 분류합니다. -
type record
- 레코드 값을 분류합니다. -
type table
테이블 값을 분류하는 입니다. -
type function
함수 값을 분류하는 입니다. -
type anynonnull
null을 제외한 모든 값을 분류하는 입니다. -
type none
- 값을 분류하지 않습니다.
형식 any
은 추상이며 M의 모든 값을 분류하며 M의 모든 형식은 호환 any
됩니다. 형식 any
의 변수는 가능한 모든 값에 바인딩할 수 있습니다.
any
는 추상적이므로 값으로 간주될 수 없습니다. 즉, 값이 직접 형식 any
일 수는 없습니다.
목록인 모든 값은 목록 값 내의 항목에 대한 제한을 두지 않는 기본 형식 list
을 준수합니다.
list-type:
{
item-type}
item-type:
형
list-type을 평가한 list
다음 예제에서는 같은 유형의 목록 형식을 선언하는 구문을 보여 줍니다.
type { number } // list of numbers type
{ record } // list of records type
{{ text }} // list of lists of text values
값이 목록이고 해당 목록 값의 각 항목이 목록 형식의 항목 형식을 준수하는 경우 값은 목록 형식을 준수합니다.
목록 형식의 항목 형식은 바인딩된 항목을 나타냅니다. 준수 목록의 모든 항목은 항목 형식을 준수합니다.
레코드인 모든 값은 레코드 값 내의 필드 이름 또는 값에 대한 제한을 두지 않는 기본 형식 레코드를 준수합니다. 레코드 형식 값은 유효한 이름 집합과 해당 이름과 연결할 수 있는 값 형식을 제한하는 데 사용됩니다.
record-type:
[
open-record-marker]
[
field-specification-listopt]
[
field-specification-list, open-record-marker]
field-specification-list:
field-specification
field-specification,
field-specification-list
field-specification:
optional
opt field-name field-type-specificationopt
field-type-specification:
=
field-type
field-type:
type
open-record-marker:
...
레코드 형식을 계산한 결과는 기본 형식이 있는 형식 값입니다record
.
다음 예제에서는 레코드 형식을 선언하는 구문을 보여 줍니다.
type [ X = number, Y = number]
type [ Name = text, Age = number ]
type [ Title = text, optional Description = text ]
type [ Name = text, ... ]
레코드 형식은 기본적으로 닫힙니다. 즉, fieldspecification-list에 없는 추가 필드가 준수 값에 있을 수 없습니다. 레코드 형식에 openrecord-marker를 포함하면 형식이 열려 있다고 선언되어 필드 사양 목록에 필드가 없는 것을 허용합니다. 다음 두 식은 동일합니다.
type record // primitive type classifying all records
type [ ... ] // custom type classifying all records
값이 레코드이고 레코드 형식의 각 필드 사양이 충족되는 경우 값은 레코드 형식을 따릅니다. 다음 중 어느 것이라도 true이면 필드 사양이 충족됩니다.
사양의 식별자와 일치하는 필드 이름이 레코드에 있고 연결된 값이 사양의 형식을 준수합니다.
사양이 선택 사항으로 표시되고 레코드에 해당 필드 이름이 없습니다.
준수 값은 레코드 형식이 열려 있는 경우에만 필드 사양 목록에 나열되지 않은 필드 이름을 포함할 수 있습니다.
모든 함수 값은 기본 형식 function
을 따르며, 함수의 형식 매개 변수 또는 함수의 반환 값 형식에 제한을 두지 않습니다. 사용자 지정 함수 형식 값 은 규칙적인 함수 값의 서명에 형식 제한을 두는 데 사용됩니다.
function-type:
function (
parameter-specification-listopt)
function-return-type
parameter-specification-list:
required-parameter-specification-list
required-parameter-specification-list,
optional-parameter-specification-list
optional-parameter-specification-list
required-parameter-specification-list:
required-parameter-specification
required-parameter-specification,
required-parameter-specification-list
required-parameter-specification:
parameter-specification
optional-parameter-specification-list:
optional-parameter-specification
optional-parameter-specification,
optional-parameter-specification-list
optional-parameter-specification:
optional
parameter-specification
parameter-specification:
parameter-name parameter-type
function-return-type:
assertion
assertion:
as
nullable-primitive-type
함수 형식을 계산한 결과는 기본 형식이 있는 형식 값입니다function
.
다음 예제에서는 함수 형식을 선언하는 구문을 보여 줍니다.
type function (x as text) as number
type function (y as number, optional z as text) as any
함수 값의 반환 형식이 함수 형식의 반환 형식과 호환되고 함수 형식의 각 매개 변수 사양이 함수의 위치에 해당하는 정식 매개 변수와 호환되는 경우 함수 값은 함수 형식을 따릅니다. 매개 변수 사양은 지정된 매개 변수 형식 형식이 정식 매개 변수의 형식 과 호환되고 정식 매개 변수가 선택 사항인 경우 매개 변수 사양이 선택 사항인 경우 정식 매개 변수와 호환됩니다.
형식 매개 변수 이름은 함수 형식 규격을 결정하기 위해 무시됩니다.
매개 변수를 선택적으로 지정하면 해당 형식이 null 허용됩니다. 다음은 동일한 함수 형식을 만듭니다.
type function (optional x as text) as any
type function (optional x as nullable text) as any
테이블 형식 값은 테이블 값의 구조를 정의하는 데 사용됩니다.
table-type:
table
row-type
row-type:
[
field-specification-listopt]
테이블 형식을 계산한 결과는 기본 형식이 있는 형식 값입니다table
.
테이블의 행 형식은 테이블의 열 이름과 열 형식을 닫은 레코드 형식으로 지정합니다. 모든 테이블 값이 형식 table
을 준수하도록 행 형식은 형식 record
(빈 열린 레코드 형식)입니다. 따라서 테이블 형식의 행 형식 table
을 가질 수 있는 테이블 값이 없으므로 형식 테이블은 추상적입니다(하지만 모든 테이블 값에는 형식 table
의 행 형식과 호환되는 행 형식이 포함됨). 다음 예제에서는 테이블 형식의 생성을 보여줍니다.
type table [A = text, B = number, C = binary]
// a table type with three columns named A, B, and C
// of column types text, number, and binary, respectively
테이블 형식 값은 테이블 값 의 키 정의도 전달합니다. 키는 열 이름 집합입니다. 최대 하나의 키를 테이블의 기본 키로 지정할 수 있습니다. (M 내에서 테이블 키에는 체계적 의미가 없습니다. 그러나 데이터베이스나 OData 피드와 같은 외부 데이터 원본에 대해서는 테이블상에 키를 정의하는 것이 일반적입니다. Power Query는 키 정보를 사용해 소스 간 조인 작업과 같은 고급 기능의 성능을 향상시킵니다.)
표준 라이브러리 함수는 Type.TableKeys
Type.AddTableKey
테이블 형식의 키를 가져오고Type.ReplaceTableKeys
, 테이블 형식에 키를 추가하고, 테이블 형식의 모든 키를 각각 바꾸는 데 사용할 수 있습니다.
Type.AddTableKey(tableType, {"A", "B"}, false)
// add a non-primary key that combines values from columns A and B
Type.ReplaceTableKeys(tableType, {})
// returns type value with all keys removed
모든 type T
의 경우, nullable-type을 사용하여 Nullable 변수를 도출할 수 있습니다.
nullable-type:
nullable
형식
결과는 Tnull
입니다.
42 is nullable number // true null is
nullable number // true
T의 type nullable
비문은 또는 Ttype null
type
비문으로 축소됩니다. (nullable 형식은 추상 형식이며 값은 추상 형식과 직접일 수 없음을 기억하세요.)
Value.Type(42 as nullable number) // type number
Value.Type(null as nullable number) // type null
표준 라이브러리는 null Type.IsNullable
허용 여부의 형식을 테스트하고 Type.NonNullable
형식에서 null 허용을 제거하는 데 사용할 수 있습니다.
다음 보류(임의의 type T
경우):
-
type T
와 호환됩니다.type nullable T
-
Type.NonNullable(type T)
와 호환됩니다.type T
다음은 쌍으로 동일합니다(모든 type T
경우).
type nullable any
any
Type.NonNullable(type any)
type anynonnull
type nullable none
type null
Type.NonNullable(type null)
type none
type nullable nullable T
type nullable T
Type.NonNullable(Type.NonNullable(type T))
Type.NonNullable(type T)
Type.NonNullable(type nullable T)
Type.NonNullable(type T)
type nullable (Type.NonNullable(type T))
type nullable T
값의 기록된 형식은 값이 준수하도록 선언된 형식입니다.
라이브러리 함수 Value.ReplaceType
를 사용하여 값을 형식에 기록할 수 있습니다. 이 함수는 새 형식이 지정된 새 값을 반환하거나 새 형식이 값과 호환되지 않는 경우 오류를 발생합니다.
값이 형식으로 지정된 경우 제한된 규칙 검사만 발생합니다.
- 기록되는 형식은 추상이 아니고 null을 허용하지 않아야 하며 값의 내장 형식(네이티브) 기본 형식과 호환되어야 합니다.
- 구조체를 정의하는 사용자 지정 형식이 기록되면 값의 구조와 일치해야 합니다.
- 레코드의 경우: 형식은 닫혀 있어야 하고, 값과 동일한 수의 필드를 정의해야 하며, 선택적 필드를 포함해서는 안 됩니다. (형식의 필드 이름 및 필드 형식은 현재 레코드와 연결된 필드 이름을 대체합니다. 그러나 기존 필드 값은 새 필드 형식에 대해 확인되지 않습니다.)
- 테이블의 경우: 형식은 값과 동일한 수의 열을 정의해야 합니다. (형식의 열 이름 및 열 형식은 현재 테이블과 연결된 열 형식을 대체합니다. 그러나 기존 열 값은 새 열 형식에 대해 확인되지 않습니다.)
- 함수의 경우: 형식은 동일한 수의 필수 매개 변수와 동일한 수의 선택적 매개 변수를 값으로 정의해야 합니다. (형식의 매개 변수 및 반환 어설션과 해당 매개 변수 이름은 함수 값의 현재 형식과 연결된 어설션을 대체합니다. 그러나 새 어설션은 함수의 실제 동작에 영향을 주지 않습니다.)
- 목록의 경우: 값은 목록이어야 합니다. (그러나 기존 목록 항목은 새 항목 유형에 대해 확인되지 않습니다.)
라이브러리 함수는 입력 값의 기록된 형식에 따라 복합 형식을 계산하고 결과에 계산하도록 선택할 수 있습니다.
라이브러리 함수 Value.Type
를 사용하여 값의 지정된 형식을 가져올 수 있습니다. 예시:
Value.Type( Value.ReplaceType( {1}, type {number} )
// type {number}
형식 동등성이 M에 정의되지 않았습니다. M 구현은 필요에 따라 자체 규칙을 사용하여 형식 값 간의 같음 비교를 수행하도록 선택할 수 있습니다. 두 형식 값을 같음으로 비교하면 구현 true
에서 동일한 것으로 간주되는지, 그렇지 않은 경우로 평가 false
되어야 합니다. 두 경우 모두 동일한 두 값을 반복적으로 비교하는 경우 반환된 응답이 일치해야 합니다. 지정된 구현 내에서 일부 동일한 형식 값(예: (type text) = (type text)
)을 비교하면 반환할 수 있지만 다른 값(예: true
)을 비교하면 반환(type [a = text]) = (type [a = text])
되지 않을 수 있습니다.
지정된 형식과 nullable 기본 형식 간의 호환성은 임의의 형식 값을 첫 번째 인수로, nullable 기본 형식 값을 두 번째 인수로 허용하는 라이브러리 함수 Type.Is
를 사용하여 확인할 수 있습니다.
Type.Is(type text, type nullable text) // true
Type.Is(type nullable text, type text) // false
Type.Is(type number, type text) // false
Type.Is(type [a=any], type record) // true
Type.Is(type [a=any], type list) // false
M에서는 지정된 형식과 사용자 지정 형식의 호환성을 결정할 수 없습니다.
표준 라이브러리에는 사용자 지정 형식에서 정의 특성을 추출하는 함수 컬렉션이 포함되어 있으므로 특정 호환성 테스트를 M 식으로 구현할 수 있습니다. 다음은 몇 가지 예입니다. 자세한 내용은 M 라이브러리 사양을 참조하세요.
Type.ListItem( type {number} )
// type number
Type.NonNullable( type nullable text )
// type text
Type.RecordFields( type [A=text, B=time] )
// [ A = [Type = type text, Optional = false],
// B = [Type = type time, Optional = false] ]
Type.TableRow( type table [X=number, Y=date] )
// type [X = number, Y = date]
Type.FunctionParameters(
type function (x as number, optional y as text) as number)
// [ x = type number, y = type nullable text ]
Type.FunctionRequiredParameters(
type function (x as number, optional y as text) as number)
// 1
Type.FunctionReturn(
type function (x as number, optional y as text) as number)
// type number