首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Ada中定义通用标量类型包

在Ada中定义通用标量类型包
EN

Stack Overflow用户
提问于 2012-11-16 21:12:33
回答 2查看 1K关注 0票数 3

我想通过制作一个处理多项式的Ada包来测试编写Ada包的难度。多项式可以被定义为一大类代数结构,所以为了反映这一点,我想让这个包变得通用,这样它就可以与浮点数、整数或其他数值子类型一起使用。

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

This页面包含一些有关类型层次结构的信息。基于此,似乎我的多项式包要基于的一个合理类型是Scalar类型,因为很明显,它是定义算术运算的类型。这就是我在polynomials.ads中尝试过的

代码语言:javascript
复制
generic

    MAX_DEGREE : Positive;
    type Element is new Scalar;

package Polynomial is

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

end Polynomial;

然而,这只是一个来自GNAT的"Scalar" is undefined错误。

到目前为止,我真的只是摸索自己的方式半盲,我实际上不知道这些东西是如何工作的。如果我有任何重大的误解,您认为需要澄清,请告诉我。也许最简单的方法是提供我可以学习的示例polynomial.adspolynomial.adb代码-就像多项式类型的定义(具有通用的最大次数和元素类型)和简单的示例函数(如将两个多项式相加),这样我就可以了解泛型函数是如何工作的。

PS:有点相关,有没有一种方法可以为你的用户定义类型定义属性?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-16 21:41:46

问题是"Scalar“不是一个类型的名称。

看看那篇文章中的“泛型形式化类型”一节,我看不到有一个能给出你想要的确切限制:“任何标量类型”。可惜..。除非有人有更好的主意,否则我会将声明扩大到:

代码语言:javascript
复制
type Element is private;

继续前进。这可能不是缺点:如果您提供了自己的运算符,请参阅下一节关于一般形式子程序的内容

代码语言:javascript
复制
with function "*" (X, Y: Element) return Element;

代码语言:javascript
复制
 with function "*" (X, Y: Element) return Element is <>;

然后可以实例化记录的泛型(复数?)矩阵等,如果这样做有意义的话。"is <>"将使用已有类型的现有函数(浮点型等)来简化实例化

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

票数 7
EN

Stack Overflow用户

发布于 2012-11-16 23:10:19

在定义泛型时,您使用的正式类型定义了在泛型的实现中有哪些操作可用。您可以始终采用Brian的选择,并使用(非常接近)限制最多的(is private,您可以复制它,否则几乎可以复制任何东西),然后让用户定义您需要的例程。事实上,这是创建一个可以在任何标量上执行数学运算的单一泛型的唯一方法。

Ada的通用formal scalar type system大致分为以下几个层次:

  • 有离散值((<>))、浮点值(digits <>)和定点值(delta<>)。
    • 在离散型中,有符号整数(range <>)和模整数(mod <>) (枚举类型也是离散型,但它们只能作为离散类型处理

这一点的一个重要含义是,有一种方法可以使泛型同时接受整数和枚举(“离散型”),但无法使泛型既可以在整数上操作,又可以在浮点数上操作。取而代之的是,你要么为每个人创建一个,要么用privates来伪装出来,然后传递数学运算符,就像Brian的答案所示。

在实践中,我没有发现这是一个太大的问题。我想要处理浮点值的实例与我想要处理整数的实例往往非常不同。例如,在这种情况下,您的“多项式”泛型对于32位整数到底有多大用处?很少有计算结果是精确的整数。

这是一种文化问题。许多语言(以C语言为首)认为整数和浮点类型是紧密相关的,并使它们很容易互换(有时甚至是静默的)。在Ada中,它们是两个完全不同的世界,你应该习惯于这样想。诚然,将整数转换为浮点值并不是一件很痛苦的事情,而且浮点类型有办法将它们的值截断或舍入为最接近的整数。不过,在大多数情况下,您应该将整数(离散值)和浮点值分开。

所以对我来说,我只需要定义它

代码语言:javascript
复制
type Element is digits <>;

...and继续我的快乐之路。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13417337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档