英語で読む

次の方法で共有


値とは、式を評価することにより生成されるデータです。 ここでは、M 言語の値の種類について説明します。 値の種類はいずれも、リテラル構文、その種類の値セット、その値セットで定義される演算子セット、新しく構築された値に固有の型に関連付けられます。

種類 リテラル
Null null
論理 true    false
Number 0    1    -1    1.5    2.3e-5
Time #time(09,15,00)
Date #date(2013,02,26)
DateTime #datetime(2013,02,26, 09,15,00)
DateTimeZone #datetimezone(2013,02,26, 09,15,00, 09,00)
Duration #duration(0,1,30,0)
テキスト "hello"
Binary #binary("AQID")
リスト {1, 2, 3}
レコード [ A = 1, B = 2 ]
テーブル #table({"X","Y"},{{0,1},{1,0}})
Function (x) => x + 1
[種類] type { number }    type table [ A = any, B = text ]

以下のセクションでは、それぞれの値について詳しく取り上げます。 型と型の帰属は「」で正式に定義されています。 関数の値は「関数」で定義されています。 次のセクションでは、各種の値に定義されている演算子を一覧にし、例を挙げます。 演算子意味論の完全な定義は「演算子」に従っています。

Null

"null 値" は値がないこと、値を確定できない状態であること、または値がわからない状態であることを表す目的で使用されます。 null 値はリテラル null を使用して記述されます。 null 値には次の演算子が定義されています。

演算子 結果
x > y より大きい
x >= y 以上
x < y より小さい
x <= y 以下
x = y 等しい
x <> y 等しくない
x ?? y Coalesce

null 値のネイティブ型は組み込み型の null です。

論理

"論理値" は値として true または false が与えられるブール演算に使用されます。 論理値はリテラルの truefalse を使用して記述されます。 論理値には次の演算子が定義されています。

演算子 結果
x > y より大きい
x >= y 以上
x < y より小さい
x <= y 以下
x = y 等しい
x <> y 等しくない
x or y 論理条件 OR
x ?? y Coalesce
x and y 論理条件 AND
not x 論理 NOT

両方の論理値 (truefalse) のネイティブ型は組み込み型の logical です。

数値

"数値" は数値演算と算術演算に使用されます。 次は数値リテラルの例です。

3.14  // Fractional number 
-1.5  // Fractional number 
1.0e3 // Fractional number with exponent
123   // Whole number 
1e3   // Whole number with exponent 
0xff  // Whole number in hex (255)

数値は少なくとも "" の精度で提示されます (ただし、精度がそれより高いこともあります)。 "" 表現は [IEEE 754-2008] に定義されている 2 進数浮動小数点数の IEEE 64 ビット倍精度標準と一致します。 ("" 表現はおよそ 5.0 x 10324 から 1.7 x 10308 までの範囲であり、精度は 15 桁と 16 桁の間になります)

次の特殊な値も "" 値として見なされます。

  • 正のゼロと負のゼロ。 ほとんどの場合、正のゼロと負のゼロは何の記号も付いていないゼロと同じように動作しますが、この 2 つが区別される演算もあります

  • 正の無限大 (#infinity) と負の無限大 (-#infinity)。 無限大は、ゼロ以外の数字をゼロで割るような演算で生成されます。 たとえば、1.0 / 0.0 からは正の無限大が生成され、-1.0 / 0.0 からは負の無限大が生成されます。

  • Not-a-Number (数字ではない) 値 (#nan) は NaN と略されることがあります。 NaN は、ゼロをゼロで割るなど、無効な浮動小数点演算で生成されます。

二項算術演算は "精度" を利用して実行されます。 精度によって、オペランドが丸められる領域と演算が実行される領域が決定されます。 精度が明示されない場合、"倍精度" で演算されます。

  • 算術演算の答えが出力先の形式にとって小さすぎる場合、演算の答えは正のゼロか負のゼロになります。

  • 算術演算の答えが出力先の形式にとって大きすぎる場合、演算の答えは正の無限大か負の無限大になります。

  • 算術演算が無効な場合、演算の答えは NaN になります。

  • 浮動小数点演算のオペランドの一方または両方が NaN の場合、演算の結果は NaN になります。

数値には次の演算子が定義されています。

演算子 結果
x > y より大きい
x >= y 以上
x < y より小さい
x <= y 以下
x = y 等しい
x <> y 等しくない
x + y 合計
x - y
x * y Product
x / y
x ?? y Coalesce
+x 単項プラス
-x 否定

数値のネイティブ型は組み込み型の number です。

時刻

"時間値" には、1 日の時刻があいまいな表現で格納されます。 時間は "真夜中から刻まれた" 数としてエンコードされます。これは、24 時間時計で経過した 100 ナノ秒単位の時間の刻みを数えたものになります。 "真夜中から刻まれた" 時間の最大値は 23:59:59.9999999 時間に相当します。

時間のリテラル構文はありませんが、それらを構築するための標準ライブラリ関数がいくつか用意されています。 時間は組み込み関数 #time を使って構築することもできます。

#time(hour, minute, second)

次が当てはまる必要があり、当てはまらない場合、エラーと理由コード Expression.Error が表示されます。

0 ≤ 時間 ≤ 24
0 ≤ 分 ≤ 59
0 ≤ second ≤ 59

また、時間 = 24 の場合、分と秒はゼロになる必要があります。

時間値には次の演算子が定義されています。

演算子 結果
x = y 等しい
x <> y 等しくない
x >= y 以上
x > y より大きい
x < y より小さい
x <= y 以下
x ?? y Coalesce

次の演算子では、オペランドの一方または両方を日付にすることができます。

演算子 左辺オペランド 右辺オペランド 意味
x + y time duration 期間による日付のオフセット
x + y duration time 期間による日付のオフセット
x - y time duration 否定された期間による日付のオフセット
x - y time time 日付から日付までの期間
x & y date time マージされた日時

時間値のネイティブ型は組み込み型の time です。

Date

"日付値" には、特定の日があいまいな表現で格納されます。 日付は、"紀元後の日" 数としてエンコードされます。これは、グレゴリオ暦の西暦 0001 年 1 月 1 日から始まります。 期限後の最大日数は 3652058 日であり、これは 9999 年 12 月 31 日に相当します。

日付のリテラル構文はありませんが、それらを構築するための標準ライブラリ関数がいくつか用意されています。 日付は組み込み関数 #date を使って構築することもできます。

#date(year, month, day)

次が当てはまる必要があり、当てはまらない場合、エラーと理由コード Expression.Error が表示されます。

1 ≤ 年 ≤ 9999
1 ≤ 月 ≤ 12
1 ≤ 日 ≤ 31

また、選択した月と年に対して日が有効となる必要があります。

日付値には次の演算子が定義されています。

演算子 結果
x = y 等しい
x <> y 等しくない
x >= y 以上
x > y より大きい
x < y より小さい
x <= y 以下
x ?? y Coalesce

次の演算子では、オペランドの一方または両方を日付にすることができます。

演算子 左辺オペランド 右辺オペランド 意味
x + y date duration 期間による日付のオフセット
x + y duration date 期間による日付のオフセット
x - y date duration 否定された期間による日付のオフセット
x - y date date 日付から日付までの期間
x & y date time マージされた日時

日付値のネイティブ型は組み込み型の date です。

DateTime

"datetime 値" には日付と時刻の両方が含まれます。

datetime のリテラル構文はありませんが、それらを構築するための標準ライブラリ関数がいくつか用意されています。 datetime は組み込み関数 #datetime を使って構築することもできます。

#datetime(year, month, day, hour, minute, second)

次が当てはまる必要があり、当てはまらない場合、エラーと理由コード Expression.Error が表示されます。1 ≤ 年 ≤ 9999
1 ≤ 月 ≤ 12
1 ≤ 日 ≤ 31
0 ≤ 時間 ≤ 23
0 ≤ 分 ≤ 59
0 ≤ second ≤ 59

また、選択した月と年に対して日が有効となる必要があります。

datetime 値には次の演算子が定義されています。

演算子 結果
x = y 等しい
x <> y 等しくない
x >= y 以上
x > y より大きい
x < y より小さい
x <= y 以下
x ?? y Coalesce

次の演算子では、オペランドの一方または両方を datetime にすることができます。

演算子 左辺オペランド 右辺オペランド 意味
x + y datetime duration 期間による datetime のオフセット
x + y duration datetime 期間による datetime のオフセット
x - y datetime duration 否定された期間による datetime のオフセット
x - y datetime datetime datetime から datetime までの期間

datetime 値のネイティブ型は組み込み型の datetime です。

DateTimeZone

datetimezone 値には、datetime とタイムゾーンが含まれます。 "タイムゾーン" は、UTC との差で示される分数としてエンコードされます。datetime の時刻部分を世界協定時刻 (UTC) との差で示す分数として数えたものになります。 "UTC との差で示す分" 数の最小値は -840 です。これは UTC の -14:00 オフセット、つまり、UTC の 14 時間前になります。 "UTC との差で示す分" 数の最大値は 840 です。これは UTC の 14:00 オフセットに相当します。

datetimezone のリテラル構文はありませんが、それらを構築するための標準ライブラリ関数がいくつか用意されています。 datetimezone は組み込み関数 #datetimezone を使って構築することもできます。

#datetimezone(
       year, month, day,
       hour, minute, second,
       offset-hours, offset-minutes)

次が当てはまる必要があり、当てはまらない場合、エラーと理由コード Expression.Error が表示されます。

1 ≤ 年 ≤ 9999
1 ≤ 月 ≤ 12
1 ≤ 日 ≤ 31
0 ≤ 時間 ≤ 23
0 ≤ 分 ≤ 59
0 ≤ second ≤ 59
-14 ≤ オフセット時間 ≤ 14
-59 ≤ オフセット分 ≤ 59

また、選択した月と年に対して日が有効となる必要があります。オフセット時間が 14 の場合、オフセット分は 0 以下であり、オフセット時間が -14 の場合、オフセット分は 0 以上になります。

datetimezone 値には次の演算子が定義されています。

演算子 結果
x = y 等しい
x <> y 等しくない
x >= y 以上
x > y より大きい
x < y より小さい
x <= y 以下
x ?? y Coalesce

次の演算子では、オペランドの一方または両方を datetimezone にすることができます。

演算子 左辺オペランド 右辺オペランド 意味
x + y datetimezone duration 期間による datetimezone のオフセット
x + y duration datetimezone 期間による datetimezone のオフセット
x - y datetimezone duration 否定された期間による datetimezone のオフセット
x - y datetimezone datetimezone datetimezone から datetimezone までの期間

datetimezone 値のネイティブ型は組み込み型の datetimezone です。

期間

"期間値" には、100 ナノ秒単位の時間の刻みで計測されたタイムライン上の 2 点間の隔たりをあいまいに表現したものが格納されます。 "期間" 大きさは正か負になります。値が正の場合、時間的に前に進行することを意味します。値が負の場合、時間的に後に進行することを意味します。 "期間" に格納できる最小値は -9,223,372,036,854,775,808 刻みです。これは 10,675,199 日と 2 時間 48 分 05.4775808 秒、時間的に後に進行することに相当します。 "期間" に格納できる最大値は 9,223,372,036,854,775,807 刻みです。これは 10,675,199 日と 2 時間 48 分 05.4775807 秒、時間的に前に進行することに相当します。

期間のリテラル構文はありませんが、それらを構築するための標準ライブラリ関数がいくつか用意されています。 期間は組み込み関数 #duration を使って構築することもできます。

#duration(0, 0, 0, 5.5)          // 5.5 seconds 
#duration(0, 0, 0, -5.5)         // -5.5 seconds 
#duration(0, 0, 5, 30)           // 5.5 minutes 
#duration(0, 0, 5, -30)          // 4.5 minutes 
#duration(0, 24, 0, 0)           // 1 day 
#duration(1, 0, 0, 0)            // 1 day

期間値には次の演算子が定義されています。

演算子 結果
x = y 等しい
x <> y 等しくない
x >= y 以上
x > y より大きい
x < y より小さい
x <= y 以下
x ?? y Coalesce

また、次の演算子では、オペランドの一方または両方が期間値として許可されます。

演算子 左辺オペランド 右辺オペランド 意味
x + y datetime duration 期間による datetime のオフセット
x + y duration datetime 期間による datetime のオフセット
x + y duration duration 期間の和
x - y datetime duration 否定された期間による datetime のオフセット
x - y datetime datetime datetime から datetime までの期間
x - y duration duration 期間の差
x * y duration number 期間の N 倍
x * y number duration 期間の N 倍
x / y duration number 期間の割合

期間値のネイティブ型は組み込み型の duration です。

テキスト

"テキスト" 値は Unicode 文字の連続を表します。 テキスト値のリテラル形式は次の文法に準拠します。

_text-literal:
      " text-literal-charactersopt "
text-literal-characters:
      text-literal-character text-literal-charactersopt
text-literal-character:
      single-text-character
      character-escape-sequence
      double-quote-escape-sequence
single-text-character:

      " (U+0022) と # (U+0023) を除くあらゆる文字に ( (U+0028) を続けたもの
double-quote-escape-sequence:
      "" (U+0022U+0022)

次は "テキスト" 値の例です。

"ABC" // the text value ABC

"テキスト" 値には次の演算子が定義されています。

演算子 結果
x = y 等しい
x <> y 等しくない
x >= y 以上
x > y より大きい
x < y より小さい
x <= y 以下
x & y 連結
x ?? y Coalesce

テキスト値のネイティブ型は組み込み型の text です。

バイナリ

"バイナリ値" はバイトの連続を表します。

バイナリ値のリテラル構文はありませんが、それらを構築するための標準ライブラリ関数がいくつか用意されています。 バイナリ値は組み込み関数 #binary を使って構築することもできます。

次の例では、バイトのリストからバイナリ値を構築しています。

#binary( {0x00, 0x01, 0x02, 0x03} )

"バイナリ" 値には次の演算子が定義されています。

演算子 結果
x = y 等しい
x <> y 等しくない
x >= y 以上
x > y より大きい
x < y より小さい
x <= y 以下
x ?? y Coalesce

バイナリ値のネイティブ型は組み込み型の "バイナリ" です。

一覧

"一覧値" は、列挙されるとき、連続する値を生成する値です。 一覧により生成される値には、一覧など、何らかの値を含めることができます。 一覧は次のように初期化構文で構築することができます。

list-expression:
      { item-listopt }
item-list:
      item
      item
, item-list
項目:
      式 (expression)
      expression
.. expression

次の "list-expression" の例では、3 つのテキスト値、"A""B""C" で一覧が定義されます。

{"A", "B", "C"}

"A" が一覧の最初の項目であり、値 "C" が一覧の最後の項目です。

  • 一覧の項目はアクセスされるまで評価されません。
  • 一覧構文で構築された一覧値からは item-list の表示順序で項目が生成されますが、一般的に、ライブラリ関数から返される一覧からは、列挙されるたびに、異なるセットや異なる数字が生成されることがあります。

一覧に連続する整数を含める目的で a..b 形式を使用できます。

{ 1, 5..9, 11 }     // { 1, 5, 6, 7, 8, 9, 11 }

一覧の項目数は "一覧数" と呼ばれていますが、List.Count 関数によって決定できます。

List.Count({true, false})  // 2 
List.Count({})             // 0

一覧の項目数は事実上、無限です。そのような一覧の List.Count は定義されず、エラーを出すか、終了しないことがあります。

一覧に項目が含まれない場合、その一覧は "空の一覧" と呼ばれます。 空の一覧は次のように記述されます。

{}  // empty list

一覧には次の演算子が定義されています。

演算子 結果
x = y 等しい
x <> y 等しくない
x & y Concatenate
x ?? y Coalesce

例:

{1, 2} & {3, 4, 5}   // {1, 2, 3, 4, 5} 
{1, 2} = {1, 2}      // true 
{2, 1} <> {1, 2}     // true

一覧値のネイティブ型は組み込み型 list です。この型からは any という項目の型が指定されます。

レコード

"レコード値" は順序を付けてフィールドを並べたものです。 "フィールド" は、レコード内でフィールドを一意に識別するテキスト値である "フィールド名" と "フィールド値" で構成されます。 フィールド値には、レコードなど、あらゆる種類の値を指定できます。 レコードは次のように初期化構文で組み立てることができます。

record-expression:
      [ field-listopt ]
field-list:
      フィールド
      field
, field-list
field:
      field-name
= expression
field-name:
      generalized-identifier
      quoted-identifier

次の例では、x という名前のフィールドに値 1 を指定し、y という名前のフィールドに値 2 を指定してレコードが構築されます。

[ x = 1, y = 2 ]

次の例では、a という名前のフィールドと入れ子にしたレコード値でレコードが構築されます。 入れ子にしたレコードには、b という名前のフィールドと値 2 が入ります。

[ a = [ b = 2 ] ]

レコードの式を評価するとき、次が当てはまります。

  • 各フィールド名に割り当てられる式は、関連フィールドの値の決定に使用されます。

  • フィールド名に割り当てられた式から評価時に値が生成される場合、それが、結果的に生成されるレコードのフィールド値になります。

  • フィールド名に割り当てられた式から評価時にエラーが出る場合、そのフィールドでエラーが出たという事実がエラー値と共に記録されます。 そのフィールドにその後アクセスすると、記録されたエラー値と共にエラーが再度出ます。

  • 初期化されるものを除き、レコードのあらゆるフィールド値に該当する変数のみが結合されている親環境のような環境で式は評価されます。

  • レコード内の値は、それに対応するフィールドがアクセスされるまで評価されません。

  • レコード内の値は 1 回だけ評価されます。

  • 式の結果は、空のメタデータ レコードを含むレコード値になります。

  • レコード内のフィールドの順序は、record-initializer-expression に表示される順序によって定義されます。

  • 指定されるフィールド名はすべてレコード内で一意にする必要があります。一意でないとエラーになります。 名前は序数で比較されます。

    [ x = 1, x = 2 ] // error: field names must be unique 
    [ X = 1, x = 2 ] // OK

フィールドのないレコードは "空のレコード" と呼ばれ、次のように記述されます。

[] // empty record

フィールドにアクセスするときや 2 つのレコードを比較するとき、レコードのフィールド順序は重要ではありませんが、レコードのフィールドが列挙されるときなどの背景で重要になります。

同じ 2 つのレコードでも、フィールドの取得時、結果が異なります。

Record.FieldNames([ x = 1, y = 2 ]) // [ "x", "y" ] 
Record.FieldNames([ y = 1, x = 2 ]) // [ "y", "x" ]

レコード内のフィールド数は Record.FieldCount 関数によって決定できます。 例:

Record.FieldCount([ x = 1, y = 2 })  // 2 
Record.FieldCount([])                // 0

レコード初期化構文 [ ] の仕様に加え、レコードは値の一覧とフィールド名の一覧またはレコードの種類から構築できます。 例:

Record.FromList({1, 2}, {"a", "b"})

上は次に相当します。

[ a = 1, b = 2 ]

レコード値には次の演算子が定義されています。

演算子 結果
x = y 等しい
x <> y 等しくない
x & y マージ
x ?? y Coalesce

上の演算子を説明したものが次の例です。 フィールド名に重複がある場合、レコード結合では右のオペランドからのフィールドが使用され、左のオペランドからのフィールドがオーバーライドすることにご留意ください。

[ a = 1, b = 2 ] & [ c = 3 ]    // [ a = 1, b = 2, c = 3 ] 
[ a = 1, b = 2 ] & [ a = 3 ]    // [ a = 3, b = 2 ] 
[ a = 1, b = 2 ] = [ b = 2, a = 1 ]         // true 
[ a = 1, b = 2, c = 3 ] <> [ a = 1, b = 2 ] // true

レコード値のネイティブ型は組み込み型 record です。この型からは空のフィールド一覧が指定されます。

テーブル

"テーブル値" は順序を付けて行を並べたものです。 "" は順序を付けて列値を並べたものです。 テーブルの型によって、テーブルの全行の長さ、テーブルの列の名前、テーブルの列の種類、(該当する場合) テーブルのキーの構造が決定されます。

テーブルのリテラル構文はありませんが、それらを構築するための標準ライブラリ関数がいくつか用意されています。 テーブルは組み込み関数 #table を使って構築することもできます。

次の例では、列名のリストと行のリストからテーブルを構築しています。 生成されるテーブルには、type any の 2 つの列と 3 つの行が含まれます。

#table({"x", "x^2"}, {{1,1}, {2,4}, {3,9}})

#table は完全なデータ型の指定に使用することもできます。

#table(
    type table [Digit = number, Name = text],  
    {{1,"one"}, {2,"two"}, {3,"three"}} 
    )

ここで、新しいテーブル値のテーブル型により、列の名前と列の型が指定されます。

テーブル値には次の演算子が定義されています。

演算子 結果
x = y 等しい
x <> y 等しくない
x & y 連結
x ?? y Coalesce

テーブル連結では、同じ名前の列を一列に並べ、オペランド テーブルのうちの 1 つだけに現れる列には null が入ります。 次はテーブル連結の例です。

  #table({"A","B"}, {{1,2}}) 
& #table({"B","C"}, {{3,4}})
A B C
1 2 null
null 3 4

テーブル値のネイティブ型は (組み込み型 table から誘導される) カスタム テーブル型ですが、これにはキーがなく、列名を一覧表示し、列の型をすべて any に指定します。 (テーブル型の詳細については、「テーブル型」を参照してください)。

関数

"関数値" は、一連の引数を単一の値にマッピングする値です。 "関数" 値の詳細は「関数」にあります。

種類

"型値" はその他の値を分類する値です。 "" 値の詳細は「」にあります。