Bagikan melalui


Jenis

Nilai jenis adalah nilai yang mengklasifikasikan nilai lain. Nilai yang diklasifikasikan oleh jenis dikatakan sesuai dengan jenis tersebut. Sistem jenis M terdiri dari jenis berikut:

  • Jenis primitif, yang mengklasifikasikan nilai primitif (binary, , date, datetime, datetimezoneduration, list, logical, null, numberrecordtexttime) typedan juga menyertakan sejumlah jenis abstrak (function, , anytable, anynonnull dan )none

  • Jenis rekaman, yang mengklasifikasikan nilai rekaman berdasarkan nama bidang dan jenis nilai

  • Jenis daftar, yang mengklasifikasikan daftar menggunakan jenis dasar item tunggal

  • Jenis fungsi, yang mengklasifikasikan nilai fungsi berdasarkan jenis parameternya dan mengembalikan nilai

  • Jenis tabel, yang mengklasifikasikan nilai tabel berdasarkan nama kolom, jenis kolom, dan kunci

  • Jenis nullable, yang mengklasifikasikan nilai null selain semua nilai yang diklasifikasikan oleh jenis dasar

  • Jenis jenis, yang mengklasifikasikan nilai yang merupakan jenis

Set jenis primitif mencakup jenis nilai primitif, dan sejumlah jenis abstrak, yang merupakan jenis yang tidak secara unik mengklasifikasikan nilai apa pun: function, , tableany, anynonnull dan none. Semua nilai fungsi sesuai dengan jenis functionabstrak , semua nilai tabel ke jenis tableabstrak , semua nilai ke jenis anyabstrak , semua nilai non-null ke jenis anynonnullabstrak , dan tanpa nilai ke jenis noneabstrak . Ekspresi jenis none harus memunculkan kesalahan atau gagal dihentikan karena tidak ada nilai yang dapat dihasilkan yang sesuai dengan jenis none. Perhatikan bahwa jenis function primitif dan table abstrak karena tidak ada fungsi atau tabel yang secara langsung dari jenis tersebut. Jenis record primitif dan list tidak abstrak karena mewakili rekaman terbuka tanpa bidang yang ditentukan dan daftar jenis apa pun.

Semua jenis yang bukan anggota dari sekumpulan jenis primitif tertutup ditambah mitra nullable mereka secara kolektif disebut sebagai jenis kustom. Jenis kustom dapat ditulis menggunakan type-expression:

type-expression:
      ekspresi primer

      typejenis primer
jenis:
      primary-expression
      jenis primer
jenis primer:
      jenis primitif
      jenis catatan
      jenis daftar
      jenis fungsi
      jenis tabel
      jenis nullable
jenis primitif:
salah satu
      any anynonnull binary date datetime datetimezone duration function list logical
      none null number record table text time type

Nama jenis primitif adalah kata kunci kontekstual yang hanya dikenali dalam konteks jenis. Penggunaan tanda kurung dalam konteks jenis memindahkan tata bahasa kembali ke konteks ekspresi reguler, mengharuskan penggunaan kata kunci jenis untuk berpindah kembali ke konteks jenis. Misalnya, untuk memanggil fungsi dalam konteks jenis , tanda kurung dapat digunakan:

type nullable ( Type.ForList({type number}) )   
// type nullable {number}

Tanda kurung juga dapat digunakan untuk mengakses variabel yang namanya bertabrakan dengan nama jenis primitif:

let  record = type [ A = any ]  in  type {(record)} 
// type {[ A = any ]}

Contoh berikut menentukan jenis yang mengklasifikasikan daftar angka:

type { number }

Demikian pula, contoh berikut mendefinisikan jenis kustom yang mengklasifikasikan rekaman dengan bidang wajib bernama X dan Y yang nilainya adalah angka:

type [ X = number, Y = number ]

Jenis nilai yang ditulis diperoleh menggunakan fungsi pustaka standar Value.Type, seperti yang ditunjukkan dalam contoh berikut:

Value.Type( 2 )                 // type number 
Value.Type( {2} )               // type list 
Value.Type( [ X = 1, Y = 2 ] )  // type record

Operator is digunakan untuk menentukan apakah jenis nilai kompatibel dengan jenis tertentu, seperti yang ditunjukkan dalam contoh berikut:

1 is number          // true 
1 is text            // false 
{2} is list          // true

Operator as memeriksa apakah nilai kompatibel dengan jenis yang diberikan, dan menimbulkan kesalahan jika tidak. Jika tidak, nilai asli akan dikembalikan.

Value.Type( 1 as number )   // type number 
{2} as text                 // error, type mismatch

Perhatikan bahwa is operator dan as hanya menerima jenis primitif nullable sebagai operand kanannya. M tidak menyediakan sarana untuk memeriksa nilai agar sesuai dengan jenis kustom.

Jenis X kompatibel dengan jenis Y jika dan hanya jika semua nilai yang sesuai juga X sesuai Ydengan . Semua jenis kompatibel dengan jenis any dan tidak ada jenis (tetapi none itu sendiri) kompatibel dengan jenis none. Grafik berikut menunjukkan hubungan kompatibilitas. (Kompatibilitas jenis refleksif dan transitif. Ini membentuk kisi dengan jenis any sebagai bagian atas dan ketik none sebagai nilai bawah.) Nama-nama jenis abstrak diatur dalam miring.

Kompatibilitas jenis

Operator berikut didefinisikan untuk nilai jenis:

Operator Hasil
x = y Equal
x <> y Tidak sama dengan
x ?? y Coalesce

Jenis asli nilai jenis adalah jenis typeintrinsik .

Jenis Primitif

Jenis dalam bahasa M membentuk hierarki terputus-putus yang berakar pada jenis any, yang merupakan jenis yang mengklasifikasikan semua nilai. Nilai M apa pun sesuai dengan satu subjenis primitif dari any. Set tertutup jenis primitif yang berasal dari jenis any adalah sebagai berikut:

  • type null, yang mengklasifikasikan nilai null.
  • type logical, yang mengklasifikasikan nilai benar dan salah.
  • type number, yang mengklasifikasikan nilai angka.
  • type time, yang mengklasifikasikan nilai waktu.
  • type date, yang mengklasifikasikan nilai tanggal.
  • type datetime, yang mengklasifikasikan nilai tanggalwaktu.
  • type datetimezone, yang mengklasifikasikan nilai zona tanggalwaktu.
  • type duration, yang mengklasifikasikan nilai durasi.
  • type text, yang mengklasifikasikan nilai teks.
  • type binary, yang mengklasifikasikan nilai biner.
  • type type, yang mengklasifikasikan nilai jenis.
  • type list, yang mengklasifikasikan nilai daftar.
  • type record, yang mengklasifikasikan nilai rekaman.
  • type table, yang mengklasifikasikan nilai tabel.
  • type function, yang mengklasifikasikan nilai fungsi.
  • type anynonnull, yang mengklasifikasikan semua nilai tidak termasuk null.
  • type none, yang mengklasifikasikan tidak ada nilai.

Jenis Apa Pun

Jenisnya any abstrak, mengklasifikasikan semua nilai dalam M, dan semua jenis dalam M kompatibel dengan any. Variabel jenis any dapat terikat ke semua nilai yang mungkin. Karena any abstrak, nilai tidak dapat ditulis—yaitu, tidak ada nilai yang berjenis anylangsung .

Tipe Daftar

Nilai apa pun yang merupakan daftar sesuai dengan jenis listintrinsik , yang tidak menempatkan batasan apa pun pada item dalam nilai daftar.

jenis daftar:
      { jenis item }
jenis item:
      jenis

Hasil evaluasi jenis daftar adalah nilai jenis daftar yang jenis dasarnya adalah list.

Contoh berikut mengilustrasikan sintaks untuk mendeklarasikan jenis daftar homogen:

type { number }        // list of numbers type 
     { record }        // list of records type
     {{ text }}        // list of lists of text values

Nilai sesuai dengan tipe daftar jika nilainya adalah daftar dan setiap item dalam nilai daftar tersebut sesuai dengan tipe item tipe daftar.

Tipe item dari tipe daftar menunjukkan terikat: semua item daftar yang sesuai dengan jenis item.

Tipe Catatan

Nilai apa pun yang merupakan rekaman sesuai dengan rekaman jenis intrinsik, yang tidak menempatkan batasan apa pun pada nama bidang atau nilai dalam nilai rekaman. Nilai jenis catatan digunakan untuk membatasi kumpulan nama yang valid serta jenis nilai yang diizinkan untuk dikaitkan dengan nama tersebut.

jenis catatan:
      [open-record-marker ]
      [ opt daftarspesifikasi bidang ]
      [ field-specification-list , open-record-marker ]
daftar spesifikasi bidang:
      spesifikasi bidang
      ,daftar spesifikasi bidang spesifikasi bidang
spesifikasi bidang:

      optionalopt opt field-name field-type-specificationopt
spesifikasi jenis bidang:

      =jenis bidang
jenis bidang:
      jenis
open-record-marker:

      ...

Hasil evaluasi jenis rekaman adalah nilai jenis yang jenis dasarnya adalah record.

Contoh berikut mengilustrasikan sintaks untuk mendeklarasikan jenis rekaman:

type [ X = number, Y = number] 
type [ Name = text, Age = number ]
type [ Title = text, optional Description = text ] 
type [ Name = text, ... ]

Tipe rekaman ditutup secara default, yang berarti bahwa bidang tambahan yang tidak ada dalam daftar-daftar-fieldspecification tidak diizinkan untuk ada dalam nilai yang sesuai. Menyertakan penanda openrecord dalam jenis catatan menyatakan jenis yang akan dibuka, yang mengizinkan bidang tidak ada dalam daftar spesifikasi bidang. Dua ekspresi berikut setara:

type record   // primitive type classifying all records 
type [ ... ]  // custom type classifying all records

Nilai sesuai dengan jenis catatan jika nilainya adalah rekaman dan setiap spesifikasi bidang dalam jenis catatan terpenuhi. Spesifikasi bidang terpenuhi jika salah satu hal berikut ini benar:

  • Nama bidang yang cocok dengan pengidentifikasi spesifikasi ada di rekaman dan nilai terkait sesuai dengan jenis spesifikasi

  • Spesifikasi ditandai sebagai opsional dan tidak ada nama bidang terkait yang ditemukan dalam rekaman

Nilai yang sesuai mungkin berisi nama bidang yang tidak tercantum dalam daftar spesifikasi bidang jika dan hanya jika jenis rekaman terbuka.

Jenis Fungsi

Nilai fungsi apa pun sesuai dengan jenis functionprimitif , yang tidak menempatkan batasan apa pun pada jenis parameter formal fungsi atau nilai pengembalian fungsi. Nilai jenis fungsi kustom digunakan untuk menempatkan pembatasan jenis pada tanda tangan nilai fungsi yang sesuai.

jenis fungsi:
      function ( parameter-specification-listopt )function-return-type
parameter-specification-list:
      required-parameter-specification-list
      required-parameter-specification-list
, optional-parameter-specification-list
      daftar spesifikasi parameter opsional
required-parameter-specification-list:
      spesifikasi parameter yang diperlukan
      required-parameter-specification
, required-parameter-specification-list
spesifikasi parameter yang diperlukan:
      spesifikasi parameter
opsional-parameter-specification-list:
      spesifikasi parameter opsional
      opsional-parameter-specification
, optional-parameter-specification-list
spesifikasi parameter opsional:

      optionalspesifikasi parameter
spesifikasi parameter:
      parameter-name parameter-type
function-return-type:
      assertion
Pernyataan:

      as nullable-primitive-type

Hasil evaluasi jenis fungsi adalah nilai jenis yang jenis dasarnya adalah function.

Contoh berikut mengilustrasikan sintaks untuk mendeklarasikan jenis fungsi:

type function (x as text) as number 
type function (y as number, optional z as text) as any

Nilai fungsi sesuai dengan jenis fungsi jika jenis pengembalian nilai fungsi kompatibel dengan jenis pengembalian jenis fungsi dan setiap spesifikasi parameter dari jenis fungsi kompatibel dengan parameter formal fungsi yang sesuai secara posisi. Spesifikasi parameter kompatibel dengan parameter formal jika jenis jenis parameter yang ditentukan kompatibel dengan jenis parameter formal dan spesifikasi parameter bersifat opsional jika parameter formal bersifat opsional.

Nama parameter formal diabaikan untuk tujuan menentukan kesamaan jenis fungsi.

Menentukan parameter sebagai opsional secara implisit membuat jenisnya dapat diubah ke null. Berikut ini membuat jenis fungsi yang identik:

type function (optional x as text) as any
type function (optional x as nullable text) as any

Jenis tabel

Nilai jenis tabel digunakan untuk menentukan struktur nilai tabel.

jenis tabel:
      tablejenis baris
jenis baris:

      [ opt daftarspesifikasi bidang ]

Hasil evaluasi jenis tabel adalah nilai jenis yang jenis dasarnya adalah table.

Tipe baris tabel menentukan nama kolom dan tipe kolom tabel sebagai tipe catatan tertutup. Sehingga semua nilai tabel sesuai dengan jenis table, jenis barisnya adalah jenis record (jenis catatan terbuka kosong). Dengan demikian, tabel jenis abstrak karena tidak ada nilai tabel yang dapat memiliki jenis baris tipe table(tetapi semua nilai tabel memiliki tipe baris yang kompatibel dengan jenis baris jenis table). Contoh berikut menunjukkan konstruksi jenis tabel:

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

Nilai jenis tabel juga membawa definisi kunci nilai tabel. Kunci adalah sekumpulan nama kolom. Paling banyak satu kunci dapat ditetapkan sebagai kunci utama tabel. (Dalam M, kunci tabel tidak memiliki arti semantik. Namun, umum untuk sumber data eksternal, seperti database atau umpan OData, untuk menentukan kunci di atas tabel. Power Query menggunakan informasi utama untuk meningkatkan performa fungsionalitas tingkat lanjut, seperti operasi gabungan lintas sumber.)

Pustaka standar berfungsi Type.TableKeys, Type.AddTableKey, dan Type.ReplaceTableKeys dapat digunakan untuk mendapatkan kunci jenis tabel, menambahkan kunci ke jenis tabel, dan mengganti semua kunci jenis tabel.

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

Jenis yang dapat diubah ke null

Untuk apa pun type T, varian nullable dapat diturunkan dengan menggunakan jenis nullable:

jenis nullable:
      nullablejenis

Hasilnya adalah jenis abstrak yang memungkinkan nilai jenis T atau nilai null.

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

Askripsi type nullable T mengurangi askripsi type null atau type T. (Ingat bahwa jenis nullable abstrak dan tidak ada nilai yang dapat langsung dari jenis abstrak.)

Value.Type(42 as nullable number)       // type number
Value.Type(null as nullable number)     // type null

Pustaka standar berfungsi Type.IsNullable dan Type.NonNullable dapat digunakan untuk menguji jenis untuk nullability dan untuk menghapus nullability dari suatu jenis.

Penangguhkan berikut (untuk apa pun type T):

  • type T kompatibel dengan type nullable T
  • Type.NonNullable(type T) kompatibel dengan type T

Berikut ini setara sepasang (untuk apa pun 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

Jenis nilai yang diresepkan

Jenis ascribed nilai adalah jenis yang nilainya dinyatakan sesuai.

Nilai dapat ditulis jenis menggunakan fungsi Value.ReplaceTypepustaka . Fungsi ini mengembalikan nilai baru dengan jenis ascribed atau menimbulkan kesalahan jika jenis baru tidak kompatibel dengan nilai .

Ketika nilai ditulis jenis, hanya pemeriksaan kesuaian terbatas yang terjadi:

  • Jenis yang sedang ditulis harus non-abstrak, tidak dapat diubah ke null, dan kompatibel dengan jenis primitif intrinsik nilai (asli).
  • Ketika jenis kustom yang mendefinisikan struktur ditulis, itu harus cocok dengan struktur nilai.
    • Untuk rekaman: Jenis harus ditutup, harus menentukan jumlah bidang yang sama dengan nilai, dan tidak boleh berisi bidang opsional apa pun. (Nama bidang jenis dan tipe bidang akan menggantikan nama bidang yang saat ini terkait dengan rekaman. Namun, nilai bidang yang ada tidak akan diperiksa terhadap jenis bidang baru.)
    • Untuk tabel: Jenis harus menentukan jumlah kolom yang sama dengan nilai. (Nama kolom jenis dan jenis kolom akan menggantikan nama kolom yang saat ini terkait dengan tabel. Namun, nilai kolom yang ada tidak akan diperiksa terhadap jenis kolom baru.)
    • Untuk fungsi: Jenis harus menentukan jumlah parameter yang diperlukan yang sama, serta jumlah parameter opsional yang sama, sebagai nilai. (Parameter jenis dan pernyataan pengembalian, serta nama parameternya, akan menggantikan yang terkait dengan jenis nilai fungsi saat ini. Namun, pernyataan baru tidak akan berpengaruh pada perilaku aktual fungsi.)
    • Untuk daftar: Nilai harus berupa daftar. (Namun, item daftar yang ada tidak akan diperiksa terhadap jenis item baru.)

Fungsi pustaka dapat memilih untuk menghitung dan menulis jenis kompleks ke hasil berdasarkan jenis nilai input yang ditulis.

Jenis nilai yang ditulis dapat diperoleh menggunakan fungsi Value.Typepustaka . Contohnya:

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

Jenis kesetaraan dan kompatibilitas

Ekuivalensi jenis tidak didefinisikan dalam M. Implementasi M dapat secara opsional memilih untuk menggunakan aturannya sendiri untuk melakukan perbandingan kesetaraan antara nilai jenis. Membandingkan dua nilai jenis untuk kesetaraan true harus dievaluasi jika dianggap identik dengan implementasi, dan false sebaliknya. Dalam kedua kasus, respons yang dikembalikan harus konsisten jika dua nilai yang sama berulang kali dibandingkan. Perhatikan bahwa dalam implementasi tertentu, membandingkan beberapa nilai jenis yang identik (seperti (type text) = (type text)) dapat mengembalikan true, sementara membandingkan yang lain (seperti (type [a = text]) = (type [a = text])) mungkin tidak.

Kompatibilitas antara jenis tertentu dan jenis primitif null dapat ditentukan menggunakan fungsi Type.Ispustaka , yang menerima nilai jenis arbitrer sebagai nilai jenis primitif pertama dan nullable sebagai argumen kedua:

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

Tidak ada dukungan dalam M untuk menentukan kompatibilitas jenis tertentu dengan jenis kustom.

Pustaka standar memang mencakup kumpulan fungsi untuk mengekstrak karakteristik yang menentukan dari jenis kustom, sehingga pengujian kompatibilitas tertentu dapat diimplementasikan sebagai ekspresi M. Di bawah ini adalah beberapa contoh; lihat spesifikasi pustaka M untuk detail selengkapnya.

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