ada - 在 Ada 中定义一个通用的标量类型包

标签 ada

我想通过制作一个用于操作多项式的包来测试编写 Ada 包的能力。多项式可以为广泛的代数结构定义,因此为了反射(reflect)这一点,我想使包通用,以便它可以与浮点数、整数或其他数字子类型一起使用。

我现在想说的是,我对 Ada 的类型系统如何工作或它的包系统如何工作知之甚少。网络上似乎缺乏好的初学者 Ada 信息,所以我不得不从 this 中收集我能得到的智慧。对新手不太友好的 Wikibooks 文章。

This page 有一些关于类型层次结构的信息。基于此,我的多项式包所基于的合理类型似乎是 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我可以从中学习的代码 - 就像 Polynomial 类型的定义(具有通用最大度数和元素类型)和一个简单的示例函数(例如添加两个多项式),所以我可以看到通用函数是如何工作的。

PS:有点相关,有没有办法为您的用户定义类型定义属性?

最佳答案

问题只是“标量”不是类型的名称。

查看该文章中的“通用形式类型”部分,我看不到一个施加您想要的确切限制的部分:“任何标量类型”。
遗憾...
除非有人有更好的主意,否则我会将声明扩大到:

type Element is private;

并继续。这可能不是一个缺点:如果您提供自己的运算符,请参阅下一节通用形式子程序
with function "*" (X, Y: Element) return Element;

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

然后,如果有意义的话,您可以实例化记录(复数?)矩阵等的泛型。 "is <>"将对已经拥有它们的类型(Float 等)使用现有函数来简化实例化

(编辑:忘记了标量包括枚举,多项式甚至乘法通常没有意义!因此将其扩展到“私有(private)”可能不是这样的缺点)

关于ada - 在 Ada 中定义一个通用的标量类型包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13417337/

相关文章:

ada - 是什么导致了这个 Ada 编译错误 "ambiguous character literal"?

types - 是否可以认为 Ada 子类型等同于依赖类型?

c - 将结构从 C 传递给 Ada

numbers - 如何仅使用 Ada 中的 Image 功能来控制显示的小数位数?

concurrency - 我们可以不以同步方式运行池中的每个任务吗?

ada - Ada 中的 Unchecked_Conversion

ada - 如何使用 Ada 在套接字上正确读写?

ada - 如何在将过程作为访问参数的过程/函数的前/后契约(Contract)中访问过程的参数?

parameters - Ada 输出参数

c - 如何读取 Ada 中的 C Void 指针?