type - 型チェック関数
|
説明
|
|
•
|
多くの場合、式の正確な値を知る必要はありません。式が、ある共通の性質を共有する広範なクラス、グループ、式に属することがわかれば十分です。これらのクラスまたはグループは型として知られています。T が型を表すとすると、T の表すクラスに属するとき、式は型 T を持つと言います。たとえば、式が型名 posint (正の整数の集合) に属するとき、式は型 posint を持つと言います。
|
•
|
多くの Maple プロシージャはアルゴリズムの制御の流れを管理したり、式が有効な入力であるかを判定するために型を利用します。たとえば、非可換な積演算子 `.` は、その引数の型に応じて引数をどう扱うかを決定します。
|
•
|
多くの型 (クラス) には integer、numeric、list、radalgnum のような名前があります。他の型はより複雑な「型表現」を作ることにより記述されます。これは文法によってもっと原始的な型の表現から作られます (文法は有効な組合せの規則の集まりです。type/structure を参照)。有効な型を表す式のクラスはそれ自身 type と呼ばれる型で表されます(すなわち、type(T, type) は が有効な表現のときに限り true を返します。特にtype(type, type) は true を返します)。
|
•
|
型は、list や table のように基本的なデータ構造が共通の式を表すのに用いることができます。あるいは prime のように数学的性質を表すのに用いることもできます。
|
•
|
コマンド type(e, t) により Maple 式が与えられた型を持つかどうかをテストすることができます。コール type(e, t) は 式 e が型 t を持てば true を返し、そうでなければ false を返します。
|
|
注意: type コマンドは仮定をチェックせず、オブジェクトのみ考慮します。もし、assume を使用しているのであれば、is コマンドを使用することをお勧めします。
|
•
|
type には 2 つの引数が渡されなければなりません。最初の引数は任意の Maple 式です。2 つ目の引数は有効な型表現でなければなりません。型表現は、type が「知っている」名前と同じくらい単純な場合もあれば、複雑な「構造化された型」の場合もあります (type/structure を参照)。平板な表現では、1 つの引数のみが type のコールで指定された場合、最初の引数が NULL であると推定します。
|
•
|
2 番目の引数 t が有効な型でない場合に限り例外が発生します。
|
•
|
型 (または型表現) はそれらが Maple で定義されている方法により類別することができます。
|
|
最も単純な型は surface 型 です。これらは一般に Maple のカーネルで定義されており、式の表面的な、あるいは「トップレベルの」性質を表しています。たとえば、型 list は surface 型です。surface 型に対するテストはとても高速です。surface 型のテストは、テストする式のサイズによらず、一定時間に終了することができます。詳細は、type/surface を参照してください。
|
|
より単純で原始的な型を組み合わせていくらでも複雑な「構造化された型」を作ることができます。これにより深い構造に基づいて式を分類することができます。たとえば、型表現 はその要素が正の整数であるようなリストのクラスを表します。この型に対するテストは、テストする式のトップレベルのデータ型 (list) だけでなく、正しい型 (posint) を持つかどうかを判定するリストの要素のそれぞれを調べる必要があります。式を構造化された型に対してテストするためには、完全に再帰的に横切る式の評価が必要かもしれず、構造化された型テストに必要な時間は式のサイズに応じて増えることがあります。構造化された型表現に関する詳細は、type/structure を参照してください。
|
|
定義された型 とは、名前が付けられている型で、あらゆる計算を行うことができます。T と名付けられた型はグローバル名 `type/T` に構造化された型表現またはプロシージャを割り当てることにより定義されます。定義された型のパフォーマンスに対する大体の目安はありません。それらは大変単純にもいくらでも複雑にもなり得るからです。型の定義に関する詳細は、type/definition を参照してください。
|
•
|
surface 型と構造化された型に加えて、以下の型名が Maple で定義されています。
|
注意:
|
型名が演算子またはキーワードの場合、文法エラーを回避するためにバッククォートで囲む必要があります。以下の例を参照してください。
|
•
|
Maple の type システムに任意の属性を埋め込み、上記リストを拡張するためには、type/satisfies を参照してください。特定の型に関する詳細は、type/datatype を参照してください。ここで、datatype は上記リストの名前のいずれかです。
|
•
|
type コマンドに渡される引数は通常、他の Maple コマンドに対するのと同様に評価されます。対話型での使用ではあまり必要ありませんが、ロバストな Maple プログラムにするには、型表現で使用される名前を未評価のクォート (') で囲み、評価されないようにする必要があります。たとえば、名前 T に値 が割り当てられており、型名としても用いられている場合、type(e, 'T') は正しく動作しますが、type(e, T) は失敗する可能性があります (この場合、 は有効な型表現なので、失敗してもメッセージは出力されません)。以下の例を参照してください。
|
•
|
Maple では、型表現は最上級の式です。型はプロシージャの引数として渡されプロシージャから返すことができ、データ構造に記憶しておくことができます。複雑な型表現をその他の Maple 式を扱うように操作することができます。実際は、型表現は通常の Maple の式です。これらの式が型として認識されるのは一部の状況においてだけです(しかし、すべての式が有効な型であるわけではありません)。
|
•
|
ユーザは次のようにして型関数にデータ型を知らせることができます。ユーザがプロシージャ `type/mytype` を定義しているとすると、type(a, mytype(b, c, ...)) の型のコールは、関数コール `type/mytype`(a, b, c,...) を評価します。
|
•
|
type 以外の Maple コマンドのいくつかは型表現とともに動作するように設計されています。たとえば、hastype、anames、indets を参照してください。select のような別のコマンドは、より一般的な属性ともうまく働くように設計されていますが、type コマンドともうまく動作します。
|
|
|
例
|
|
>
|
type( 6.777800, 'float');
|
| (1) |
>
|
type( 6.777800, 'rational');
|
| (2) |
>
|
whattype( solve( 3*x +5=14,x));
|
| (3) |
| (4) |
>
|
type( a + b, 'polynom' );
|
| (5) |
シンボルと予約名については、クォートを使用します。
| (6) |
| (7) |
>
|
type( a and b, '`and`' );
|
| (8) |
>
|
type( module() export e; end, '`module`' );
|
| (9) |
| (10) |
| (11) |
| (12) |
| (13) |
| (14) |
>
|
type( [ a, b, c ], 'list' );
|
| (15) |
false negative テスト
>
|
type( [ a, b, c ], T );
|
| (16) |
次の 2 つは正しいコマンドです。
>
|
type( [ a, b, c ], 'T' );
|
| (17) |
| (18) |
false positive テスト
| (19) |
|
|