2011-10-17 33 views
3

Haskell允許您定義類似三次的函數,它接受類型爲a的元素,並返回重複三次的元素列表,對於任何數據類型a免費的Pascal有像Haskell這樣的類型變量嗎?

thrice :: a -> [a] 
thrice x = [x, x, x] 

免費Pascal允許類型變量嗎?如果沒有,是否有另一種方法在Free Pascal中做到這一點?

+0

免費Pascal在其泛型中具有類型變量(與C++模板相當)。 – 2011-10-17 20:27:18

+0

如何使用Free Pascal的內置泛型類型? Google只會返回論壇主題。 – mcandre

+0

請參閱monadic針對維基頁面的回答。或者,您可能想轉向編譯器的[documentation](http://www.freepascal.org/docs.var),或者實際上是[語言參考中的相關章節](http://www.freepascal.org /docs-html/ref/refch8.html)。 – 2011-10-17 20:41:30

回答

1

不幸的是FreePascal的目前只有通用類,而不是通用功能。雖然,你的目標仍然可以實現,儘管有點笨拙。您需要定義一個新的類來封裝你的操作:

unit Thrice; 

interface 

type 

generic ThriceCalculator<A> = class 
public 
    class function Calculate(x: A): array of A; 
    // We define it as a class function to avoid having to create an object when 
    // using Calculate. Similar to C++'s static member functions. 
end; 

implementation 

function ThriceCalculator.Calculate(x: A): array of A; 
begin 
    SetLength(Result, 3); 
    Result[0]:= x; 
    Result[1]:= x; 
    Result[2]:= x; 
end; 

end. 

現在,不幸的是,當你想使用這個類與任何特定的類型,你需要專門它:

type 

    IntegerThrice = specialize ThriceCalculator<Integer>; 

只有那麼你可以使用它作爲:

myArray:= IntegerThrice.Calculate(10); 

正如你所看到的,帕斯卡是不是去泛型編程的方式呢。

+0

三個只是一個例子。你需要爲「FourTimes」創建特殊課程嗎? 'FiveTimes'?等等。 – mcandre

+0

你可以創建一個'NTimes'函數,並帶一個整數參數'N'。 – cyco130

+1

@mcandre:大致有兩種選擇。爲「在一個變量中沒有約束的多態函數」創建一個類,並在其中添加每個函數,或者爲每個函數創建一個類。也可以結合這個(例如'NTimes'類)。無論如何,兩者之間的選擇是雜亂和易延伸之間的折衷。 – 2011-11-01 11:28:21