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

Jac*_*k M 3 ada

我想通过制作一个用于操作多项式的方法来测试编写Ada包的水域.可以为一大类代数结构定义多项式,因此为了反映这一点,我想使包通用,因此它可以与Floats,Integers或其他数字子类型一起使用.

我现在想说的是,我对Ada的类型系统如何工作或它的包系统如何工作知之甚少.网络上似乎缺乏良好的初学者Ada信息,因此我不得不从这篇不那么新手友好的Wikibooks文章中收集到我能够获得的智慧.

页面包含有关类型层次结构的一些信息.基于此,似乎我的Polynomial包的合理类型将是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;
Run Code Online (Sandbox Code Playgroud)

但是,这只是让我忘了"Scalar" is undefinedGNAT.

到目前为止,我真的只是半盲地感觉到了,我实际上并不知道这些东西是如何起作用的.如果我认为你认为需要澄清任何重大误解,请告诉我.可能最简单的方法是提供我可以学习的示例polynomial.adspolynomial.adb代码 - 就像多项式类型的定义(使用泛型max-degree和element类型)和一个简单的示例函数(如添加两个多项式),所以我可以看到如何通用功能工作.

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

Bri*_*ond 7

问题只是"Scalar"不是类型的名称.

看一下那篇文章中的"通用形式类型"部分,我看不到一个强加你想要的确切限制:"任何标量类型".可惜......除非有人有更好的想法,否则我会将声明扩大到:

type Element is private;
Run Code Online (Sandbox Code Playgroud)

继续 这可能不是一个缺点:如果您提供自己的运算符,请参阅下一节关于通用正式子程序的部分

with function "*" (X, Y: Element) return Element;
Run Code Online (Sandbox Code Playgroud)

要么

 with function "*" (X, Y: Element) return Element is <>;
Run Code Online (Sandbox Code Playgroud)

然后你可以实例化记录的通用(复数?)矩阵等,如果这样做有意义的话.在"is <>"将使用现有的功能已经有他们的类型(浮法等),以简化实例

(编辑:忘了标量包括枚举,多项式甚至乘法,通常没有意义!所以将它扩大为"私有"可能不是这样的缺点)


T.E*_*.D. 6

在定义泛型时,您使用的正式类型定义了泛型实现中可用的操作.你可以随时选择Brian的选项并使用(非常接近)最严格的(is private你可以复制,但其他任何东西都可以复制),然后让用户定义你需要的例程.实际上,这是制作可以在任何标量上执行数学运算的单一泛型的唯一方法.

Ada的通用正式标量类型系统分为以下粗略层次结构:

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

这样做的一个重要含义是,有一种方法可以创建一个可以同时采用整数和枚举("离散")的泛型,但是没有办法制作一个可以对整数和浮点运算的泛型.相反,你要么必须为每个制作一个,要么用私有伪造,并传递给数学运算符,就像Brian的答案所示.

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

这是一种文化问题.许多语言(由C领导)认为整数和浮点类型是密切相关的东西,并使它们易于互换(有时甚至是静默的).在阿达,它们是两个完全不同的宇宙,你应该习惯于这样思考它们.确实,将整数转换为浮点值并没有太大的痛苦,浮点类型有办法将它们的值截断或舍入到最接近的整数.但是,在大多数情况下,您应该保持整数(离散值)和浮点值分开.

所以对我来说,我只是定义它

type Element is digits <>;
Run Code Online (Sandbox Code Playgroud)

......继续我的快乐方式.

  • ...类似于`type Element是数字<>或delta <>;`通用中的Element中没有固定或特定于浮点数的属性,但所有常见的数学运算符都是.:-) (3认同)
  • 我想向对方开始投票"从实践中我还没有发现这个......一个问题".除了一件事:我正在进行一些硬件/软件协同仿真(想象一下DSP代码在FPGA上运行非常快,因为一切都是并行发生的).在那里使用定点是很常见的,统一相同算法的固定版本和浮点版本非常有用(调查不同字宽的舍入误差)这有一个巨大的市场(System-C和System-Verilog)加上......)Ada是理想的(因为她的VHDL表兄弟更是如此) (2认同)