유형

형식 값은 다른 값을 분류하는 값입니다. 형식으로 분류되는 값은 해당 형식을 준수한다고 합니다. M 형식 시스템은 다음과 같은 종류의 형식으로 구성됩니다.

  • 기본값(binary, ,, textdatetimezonedurationdatetimetypedatenulllistnumbertimelogicalrecord) 을 분류하고 여러 추상 형식(function, table, anyanynonnullnone)도 포함하는 기본 형식

  • 필드 이름 및 값 형식에 따라 레코드 값을 분류하는 레코드 형식

  • 단일 항목 기본 형식을 사용하여 목록을 분류하는 목록 형식

  • 매개 변수 형식 및 반환 값에 따라 함수 값을 분류하는 함수 형식

  • 열 이름, 열 형식 및 키를 기반으로 테이블 값을 분류하는 테이블 형식

  • 기본 형식으로 분류된 모든 값 외에 null 값을 분류하는 Null 허용 형식

  • 형식인 값을 분류하는 형식 형식

기본 형식 집합에는 기본 값의 형식과 값을 고유하게 분류function하지 않는 형식인 여러 추상 형식noneanynonnull anytable포함됩니다. 모든 함수 값은 추상 형식function, 추상 형식에 대한 모든 테이블 값, 추상 형식table에 대한 모든 값, 추상 형식any에 대한 null이 아닌 모든 값 및 추상 형식anynonnullnone에 대한 값 없음을 준수합니다. 형식을 준수하는 none값을 생성할 수 없으므로 형식 none 식이 오류를 발생하거나 종료하지 않아야 합니다. 기본 형식은 table 각각 해당 형식 function 의 직접 함수나 테이블이 없기 때문에 추상 형식입니다. 기본 형식 recordlist 정의된 필드가 없는 열린 레코드와 형식 목록을 각각 나타내기 때문에 추상이 아닌 형식입니다.

닫힌 기본 형식 집합의 멤버가 아닌 모든 형식과 nullable 형식을 모두 사용자 지정 형식이라고 합니다. 사용자 지정 형식은 다음을 사용하여 작성할 수 있습니다.type-expression

type-expression:
      primary-expression

      typeprimary-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

as 연산자는 is nullable 기본 형식만 올바른 피연산자로 허용합니다. M은 사용자 지정 형식에 대한 규칙의 값을 확인하는 수단을 제공하지 않습니다.

형식 X일치하는 모든 값 X 이 규격인 경우에만 형식 Y 과 호환됩니다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 anynonnullnull을 제외한 모든 값을 분류하는 입니다.
  • 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:

      optionalopt 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:

      optionalparameter-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:
      tablerow-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.TableKeysType.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

Nullable 형식

모든 type T의 경우, nullable-type을 사용하여 Nullable 변수를 도출할 수 있습니다.

nullable-type:
      nullable

결과는 T 형식 또는 값null의 값을 허용하는 추상 형식입니다.

42 is nullable number             // true null is
nullable number                   // true

T의 type nullable 비문은 또는 Ttype type null 비문으로 축소됩니다. (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

값의 Ascribed 형식

값의 기록된 형식은 값이 준수하도록 선언된 형식입니다.

라이브러리 함수 Value.ReplaceType를 사용하여 값을 형식에 기록할 수 있습니다. 이 함수는 새 형식이 지정된 새 값을 반환하거나 새 형식이 값과 호환되지 않는 경우 오류를 발생합니다.

값이 형식으로 지정된 경우 제한된 규칙 검사만 발생합니다.

  • 기록되는 형식은 추상이 아니고 null을 허용하지 않아야 하며 값의 내장 형식(네이티브) 기본 형식과 호환되어야 합니다.
  • 구조체를 정의하는 사용자 지정 형식이 기록되면 값의 구조와 일치해야 합니다.
    • 레코드의 경우: 형식은 닫혀 있어야 하고, 값과 동일한 수의 필드를 정의해야 하며, 선택적 필드를 포함해서는 안 됩니다. (형식의 필드 이름 및 필드 형식은 현재 레코드와 연결된 필드 이름을 대체합니다. 그러나 기존 필드 값은 새 필드 형식에 대해 확인되지 않습니다.)
    • 테이블의 경우: 형식은 값과 동일한 수의 열을 정의해야 합니다. (형식의 열 이름 및 열 형식은 현재 테이블과 연결된 열 형식을 대체합니다. 그러나 기존 열 값은 새 열 형식에 대해 확인되지 않습니다.)
    • 함수의 경우: 형식은 동일한 수의 필수 매개 변수와 동일한 수의 선택적 매개 변수를 값으로 정의해야 합니다. (형식의 매개 변수 및 반환 어설션과 해당 매개 변수 이름은 함수 값의 현재 형식과 연결된 어설션을 대체합니다. 그러나 새 어설션은 함수의 실제 동작에 영향을 주지 않습니다.)
    • 목록의 경우: 값은 목록이어야 합니다. (그러나 기존 목록 항목은 새 항목 유형에 대해 확인되지 않습니다.)

라이브러리 함수는 입력 값의 기록된 형식에 따라 복합 형식을 계산하고 결과에 계산하도록 선택할 수 있습니다.

라이브러리 함수 Value.Type를 사용하여 값의 지정된 형식을 가져올 수 있습니다. 예시:

Value.Type( Value.ReplaceType( {1}, type {number} ) 
// type {number}

형식 동등성 및 호환성

형식 동등성이 M에 정의되지 않았습니다. M 구현은 필요에 따라 자체 규칙을 사용하여 형식 값 간의 같음 비교를 수행하도록 선택할 수 있습니다. 두 형식 값을 같음으로 비교하면 구현 false 에서 동일한 것으로 간주되는지, 그렇지 않은 경우로 평가 true 되어야 합니다. 두 경우 모두 동일한 두 값을 반복적으로 비교하는 경우 반환된 응답이 일치해야 합니다. 지정된 구현 내에서 일부 동일한 형식 값(예: (type text) = (type text))을 비교하면 반환할 수 있지만 다른 값(예: (type [a = text]) = (type [a = text]))을 비교하면 반환true되지 않을 수 있습니다.

지정된 형식과 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