2017-01-25 163 views
1

我正在設計一種編程語言,我想添加的一個功能是trampoline functionclass之間的交叉。也就是說,一個類似於generic class的文字類似於type。我被困在這些名字上,因爲我之前沒有遇到過他們的語言,有沒有什麼東西已經意味着這個概念或者什麼東西接近?使用trampoline class是一個選項,但如果有更準確的描述或者已經在使用另一種語言,我寧願隨它一起去減少文檔中所需的術語數量。有沒有蹦牀班的名字?

僞代碼如下說明這一原則的情況下,它不是從上面明確:

class Point<const int n> { 
    private float[n] _value; 
    Point() { 
     for (int i = 0; i < n; i++) { 
      this._value[i] = 0f; 
     } 
    } 
    Point(Point<o> other) { 
     for (int i = 0; i < min(n, o); i++) { 
      this._value[i] = 0f; 
     } 
    } 
    public static float operator [index] (optional float value = null) { 
     if (value != null) { this._value[index] = value; } 
     return (this._value[index]); 
    } 
    public static Point<max(o, p)> operator + (Point<const int o> p1, Point<const int p> p2) { 
     Point<min(o, p)> small = (p1.n < p2.n ? p1 : p2); 
     Point<min(o, p)> large = (p1.n < p2.n ? p2 : p1); 
     Point<max(o, p)> ret = new Point<max(o, p)>(large); 
     for (int i = 0; i < min(o, p); i++) { ret[i] += small[i] } 
     return (ret); 
    } 
} 

回答

1

你正在尋找的期限爲dependent types。這意味着一個類型不僅可以有類型參數(比如泛型),而且類型也可以用任意值(依賴類型參數)進行參數化。例如,您可以定義一個函數的簽名,其編號爲n,並返回一個長度爲n的數組。

不幸的是,依賴類型檢查通常是不可判定的。這是因爲您必須計算相關類型參數的可能值的範圍,同時執行類型檢查。要實際鍵入檢查程序,必須檢查兩段代碼是否產生相同的可能值範圍。這被稱爲擴展函數平等,這是已知的一般不可判定的部分。

現在,如果僅將編譯時常量用作相關類型參數,則依賴類型檢查可能變爲可判定。但是,我不確定這一點。


在評論下面,我們想通了,這似乎是依賴型參數的部分實際上應該不能用於類型檢查。相反,它可以被看作是一個隱含的參數。它類似於Scala編程語言中的隱式參數傳遞。

+0

謝謝,但我想我可能混淆了一些東西,通過比較'trampoline函數',它類似於實現級別的概念,但不是真正的理論 - 或者通過使用'max(o, p)語句中的僞代碼。實際上,允許「max(o,p)」的動態位與我在這裏想到的功能截然不同。我正在尋找一種方法來傳遞一個字面值或計算值(一個計算值可以在此語言中被視爲一種字面值)作爲一種通用參數,它不是一種類型,而是自己鍵入的類型(例如一個int。 )Upvoted的信息。 – CoryG

+1

你能澄清你的問題嗎?我基本上通過查看代碼來猜測你在問什麼。也許你可以提供一個代碼示例,只包含你正在尋找的概念,沒有其他不尋常的概念?另外,請添加更多關於您正在尋找的功能的詳細說明,所以我們不需要那麼多猜測。接下來,請說明概念與依賴類型的不同之處。對我而言,上面評論的描述聽起來完全像依賴類型。 –

+0

問題在於泛型類的名稱,它允許在通用定義中使用文字來代替類型。依賴類型是一種依賴於另一種類型的類型或具有某種受其限制的值的類型。在這種情況下描述的東西的名稱不一定包含任何泛型類型(字面值如1,2,3等「a」,「b」或「c」將作爲局部常量在編譯類型中有效傳遞) – CoryG