В этой статье блога мы углубимся в концепцию параметрического полиморфизма, также известного как дженерики, в контексте функций первого класса. Параметрический полиморфизм позволяет нам писать функции и структуры данных, которые могут работать с несколькими типами, обеспечивая гибкость и возможность повторного использования кода. Мы рассмотрим различные методы и примеры кода, чтобы проиллюстрировать универсальность параметрического полиморфизма в различных сценариях.
Метод 1: функция идентичности
Функция идентичности — классический пример, демонстрирующий использование параметрического полиморфизма. Он принимает аргумент любого типа и возвращает то же значение без каких-либо изменений. Вот реализация на Python:
def identity(x):
return x
# Usage
result = identity(42)
print(result) # Output: 42
Метод 2: длина списка
Другим распространенным вариантом использования параметрического полиморфизма является вычисление длины списка. Этот метод работает со списками любого типа. Вот реализация на JavaScript:
function listLength(arr) {
return arr.length;
}
// Usage
const numbers = [1, 2, 3, 4, 5];
const length = listLength(numbers);
console.log(length); // Output: 5
Метод 3: типобезопасная конкатенация
Параметрический полиморфизм позволяет нам писать функции, которые могут объединять списки разных типов, если эти типы совместимы. Вот пример на TypeScript:
function concatenate<T>(a: T[], b: T[]): T[] {
return a.concat(b);
}
// Usage
const numbers = [1, 2, 3];
const strings = ["hello", "world"];
const combined = concatenate(numbers, strings);
console.log(combined); // Output: [1, 2, 3, "hello", "world"]
Метод 4: универсальный стек
Создание структуры данных общего стека — еще один интересный вариант использования параметрического полиморфизма. Вот реализация на C#:
class Stack<T>
{
private List<T> items = new List<T>();
public void Push(T item)
{
items.Add(item);
}
public T Pop()
{
int lastIndex = items.Count - 1;
T lastItem = items[lastIndex];
items.RemoveAt(lastIndex);
return lastItem;
}
}
// Usage
Stack<int> numberStack = new Stack<int>();
numberStack.Push(42);
int poppedNumber = numberStack.Pop();
Console.WriteLine(poppedNumber); // Output: 42
Параметрический полиморфизм позволяет нам писать гибкий и многократно используемый код, позволяя функциям и структурам данных работать с несколькими типами. В этой статье мы рассмотрели различные методы, включая функцию идентификации, вычисление длины списка, типобезопасную конкатенацию и реализацию общего стека. Используя возможности параметрического полиморфизма, мы можем писать более чистый и универсальный код, который легко адаптируется к различным типам данных.