我想通过制作一个用于操作多项式的 Ada 包来测试编写 Ada 包的水。可以为多种代数结构定义多项式,因此为了反映这一点,我想使该包通用,以便它可以与浮点数、整数或其他数字子类型一起使用。
我现在想说,我对 Ada 的类型系统如何工作或者它的包系统如何工作知之甚少。网络上似乎缺乏良好的初学者 Ada 信息,所以我必须从中收集我能学到的智慧this http://en.wikibooks.org/wiki/Ada_Programming/Generics不太适合新手的维基教科书文章。
This http://en.wikibooks.org/wiki/Ada_Programming/Type_System#The_Type_Hierarchy页面有一些有关类型层次结构的信息。基于此,我的多项式包的合理类型似乎是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.ads
and polynomial.adb
我可以从中学习的代码 - 就像多项式类型的定义(具有通用最大度和元素类型)和一个简单的示例函数(例如添加两个多项式),这样我就可以看到通用函数是如何工作的。
PS:有点相关,有没有办法为您的用户定义类型定义属性?
问题在于“Scalar”不是类型的名称。
看看那篇文章中的“通用形式类型”部分,我看不到一个强加您想要的确切限制的部分:“任何标量类型”。
遗憾...
除非有人有更好的主意,否则我会将声明范围扩大到:
type Element is private;
并继续。这可能不是一个缺点:如果您提供自己的运算符,请参阅下一节有关通用正式子程序的内容
with function "*" (X, Y: Element) return Element;
or
with function "*" (X, Y: Element) return Element is <>;
然后,如果这样做有意义的话,您可以实例化记录(复数?)矩阵等的泛型。这"is <>"
将使用已有函数的类型(Float 等)来简化实例化
(编辑:忘记标量包括枚举,对于枚举,多项式甚至乘法通常没有意义!因此将其扩大到“私有”可能不是一个缺点)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)