簡體   English   中英

在Ada中定義通用標量類型包

[英]Defining a generic scalar-type package in 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;

但是,這只是讓我知道"Scalar" is undefined GNAT的"Scalar" is undefined錯誤。

到目前為止,我真的只是半盲地感覺到了,我實際上並不知道這些東西是如何起作用的。 如果我認為你認為需要澄清任何重大誤解,請告訴我。 可能最簡單的是提供我可以學習的示例polynomial.adspolynomial.adb代碼 - 就像多項式類型的定義(具有泛型max-degree和元素類型)和添加兩個多項式的簡單示例函數一樣,所以我可以看到泛型函數是如何工作的。

PS:排序相關,有沒有辦法為用戶定義的類型定義屬性?

問題只是“Scalar”不是類型的名稱。

看一下那篇文章中的“通用形式類型”部分,我看不到一個強加你想要的確切限制:“任何標量類型”。 可惜......除非有人有更好的主意,否則我會將聲明擴大到:

type Element is private;

繼續 這可能不是一個缺點:如果您提供自己的運算符,請參閱下一節關於通用正式子程序的部分

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

要么

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

然后你可以實例化記錄的通用(復數?)矩陣等,如果這樣做有意義的話。 "is <>"將使用已有函數的現有函數(Float等)來簡化實例化

(編輯:忘了標量包括枚舉,多項式甚至乘法,通常沒有意義!所以將它擴大為“私有”可能不是這樣的缺點)

在定義泛型時,您使用的正式類型定義了泛型實現中可用的操作。 您可以隨時使用Brian的選項並使用(非常接近)最嚴格的( is private ,您可以復制,但在其他任何地方都可能是該死的),然后讓用戶定義您需要的例程。 實際上,這是制作可以在任何標量上執行數學運算的單一泛型的唯一方法。

Ada的通用正式標量類型系統分為以下粗略層次結構:

  • 有離散值( (<>) ),浮點值( digits <> )和固定點值( delta<> )。
    • 在離散值中,有符號整數( range <> )和模塊整數( mod <> )(枚舉類型也是離散的,但它們只能作為離散值處理)。

這樣做的一個重要含義是,有一種方法可以創建一個可以同時采用整數和枚舉(“離散”)的泛型,但是沒有辦法制作一個可以對整數和浮點運算的泛型。 相反,你要么必須為每個制作一個,要么用私有偽造,並傳遞給數學運算符,就像Brian的答案所示。

在實踐中,我沒有發現太多問題。 我想使用浮點值的實例往往與我想要使用整數的實例非常不同。 例如,在這種情況下,你的“多項式”泛型對於32位整數有多大用處? 很少有計算結果是精確整數。

這是一種文化問題。 許多語言(由C領導)認為整數和浮點類型是密切相關的東西,並使它們易於互換(有時甚至是無聲的)。 在阿達,它們是兩個完全不同的宇宙,你應該習慣於這樣思考它們。 確實,將整數轉換為浮點值並沒有太大的痛苦,浮點類型有辦法將它們的值截斷或舍入到最接近的整數。 但是,在大多數情況下,您應該保持整數(離散值)和浮點值分開。

所以對我來說,我只是定義它

type Element is digits <>;

......繼續我的快樂方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM