2011-10-17 18 views
3

Haskellでは、タイプがaの3つの関数を定義し、任意のデータ型aに対して3回繰り返された要素のリストを返します。Free PascalにはHaskellのような型変数がありますか?

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

フリーパスカルは型変数を許可しますか?そうでない場合は、Free Pascalでこれを行う別の方法がありますか?

+0

フリーのPascalは、そのジェネリック(C++テンプレートに匹敵する)に型変数を持っています。 –

+0

Free Pascalの組み込みジェネリック・タイプはどのように使用しますか? Googleはフォーラムスレッドのみを返します。 – mcandre

+0

Wikiページのモナディックの答えを参照してください。あるいは、コンパイラの[documentation](http://www.freepascal.org/docs.var)、または実際には[関連する言語リファレンスの章](http://www.freepascal.org)を参照してください。 /docs-html/ref/refch8.html)。 –

答えて

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>; 

このように、Pascalはまだジェネリックプログラミングの道ではありません。

+0

3度は単なる一例に過ぎません。 'FourTimes'の特別なクラスを作る必要がありますか? 「ファイブタイム」? – mcandre

+0

'NTimes'関数を作成し、整数引数' N'を取るこ​​とができます。 – cyco130

+1

@mcandre:大まかに2つのオプションがあります。 「制約なしで1つの変数にポリモーフィックな関数」に対して1つのクラスを作成し、そこにすべての関数を追加するか、各関数のクラスを作成します。これを組み合わせることも可能です(例えば、 'NTimes'クラス)。どちらの場合でも、2つの間の選択は、混乱と拡張の容易さとの間のトレードオフである。 –

関連する問題