3

多項式を操作するためのパッケージを作成して、Adaパッケージを作成する水域をテストしたいと思います。多項式は幅広いクラスの代数的構造に対して定義できるので、これを反映するために、パッケージを汎用にして、浮動小数点数、整数、またはその他の数値サブタイプで使用できるようにします。

ここで、Adaの型システムがどのように機能するか、またはそのパッケージシステムがどのように機能するかについてはほとんど知りません。ウェブ上には初心者向けの優れたAda情報が不足しているようです。そのため、このあまり初心者向けではないWikibooksの記事から、私ができる知識を収集する必要があります。

このページには、タイプ階層に関する情報があります。それに基づいて、私の多項式パッケージのベースとなる妥当なタイプは、Scalar明らかにそれが算術演算が定義されているタイプであるように思われます。だから、これは私が試みたものですpolynomials.ads

generic

    MAX_DEGREE : Positive;
    type Element is new Scalar;

package Polynomial is

    type Polynomial is Array (0 .. MAX_DEGREE) of Element;

end Polynomial;

"Scalar" is undefinedただし、これはGNATからのエラーをネットするだけです。

これまでのところ、私は本当にハーフブラインドの周りを感じていましたが、実際にはこれらのものがどのように機能するのかわかりません。解決する必要があると思われる大きな誤解があると思われる場合は、教えてください。おそらく最も簡単なのは、私が学ぶことができる例polynomial.adspolynomial.adbコードを提供することです-ちょうど多項式型の定義(一般的な最大次数と要素型を使用)と2つの多項式を追加するような単純な例関数のように、私はどのように一般的であるかを見ることができます関数は機能します。

PS:ある種関連していますが、ユーザー定義型の属性を定義する方法はありますか?

4

2 に答える 2

7

問題は、「スカラー」が型の名前ではないということだけです。

その記事の「ジェネリック形式型」セクションを見ると、「任意のスカラー型」という正確な制限を課すものは見当たりません。残念...誰かがより良い考えを持っていない限り、私は宣言を次のように広げます:

type Element is private;

そして続けます。これは欠点ではないかもしれません: 独自の演算子を提供する場合は、ジェネリック形式サブプログラムに関する次のセクションを参照してください。

with function "*" (X, Y: Element) return Element;

また

 with function "*" (X, Y: Element) return Element is <>;

そうすることが意味がある場合は、レコード(複素数?)マトリックスなどのジェネリックをインスタンス化できます。"is <>"インスタンス化を簡素化するために、既存の関数 (Float など) を既に持っている型に既存の関数を使用します。

(編集:スカラーには、多項式や乗算でさえ意味をなさない列挙が含まれていることを忘れていました!したがって、「プライベート」に拡張しても、そのような欠点ではない可能性があります)

于 2012-11-16T13:41:45.637 に答える
6

ジェネリックを定義する場合、使用する正式な型によって、ジェネリックの実装内で使用できる操作が決まります。いつでも Brian のオプションを使用して、(ほぼ) 最も制限的な (is privateをコピーできますが、それ以外の場合はほぼ何でも可能です) を使用してから、必要なルーチンをユーザーに定義させることができます。実際、これは、任意のスカラーで計算を実行できる単一のジェネリックを作成する唯一の方法です。

Ada の一般的な正式なスカラー型システムは、次の大まかな階層に分けられます。

  • 不連続 ( (<>))、浮動小数点値 ( digits <>)、および固定小数点値 ( delta<>) があります。
    • 離散の中には、符号付き整数 ( range <>) と剰余整数 ( mod <>) があります (列挙型も離散ですが、離散としてのみ扱うことができます)。

これが意味する重要な点は、整数と列挙 (「離散」) の両方を取ることができるジェネリックを作成する方法はあるが、整数と浮動小数点の両方で操作できるジェネリックを作成する方法がないということです。代わりに、ブライアンの答えが示したように、それぞれに1つ作成するか、プライベートで偽造して数学演算子を渡す必要があります。

実際には、これがあまり問題になることはありませんでした。浮動小数点値を処理したい場合と、整数を処理したい場合は大きく異なる傾向があります。たとえば、この場合、「多項式」ジェネリックは 32 ビット整数に対して実際にどの程度役立つでしょうか? 計算結果が正確な整数になることはほとんどありません。

これは一種の文化的な問題です。多くの言語 (C を筆頭に) は、整数型と浮動小数点型を密接に関連するものと見なしており、それらを簡単に交換できるようにしています (時には暗黙のうちに)。Ada では、それらは 2 つのまったく異なる宇宙であり、そのように考えることに慣れる必要があります。整数を浮動小数点値に変換するのはそれほど面倒ではないことは事実です。浮動小数点型には、値を最も近い整数に切り捨てるか丸める方法があります。ただし、ほとんどの場合、整数 (離散) と浮動小数点値を分離しておく必要があります。

したがって、私にとっては、次のように定義します

type Element is digits <>;

...そして、楽しい道を進んでください。

于 2012-11-16T15:10:18.637 に答える