Есть ли в Free Pascal переменные типа наподобие Haskell? - PullRequest
3 голосов
/ 18 октября 2011

Haskell позволяет вам определять функции, такие как трижды, который принимает элемент типа a и возвращает список элементов, повторенных три раза для любого типа данных a.

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

Разрешает ли Free Pascal переменные типа? Если нет, есть ли другой способ сделать это в Free Pascal?

Ответы [ 2 ]

3 голосов
/ 18 октября 2011

Как человек из Хаскеля, который не знает Паскаля, это похоже на нечто подобное. Извините за невозможность расширения.

http://wiki.freepascal.org/Generics

1 голос
/ 01 ноября 2011

К сожалению, 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);

Как вы видите, Pascal - это еще не путь для общего программирования.

...