2011-10-17 31 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