Я пытаюсь понять для себя, какую форму полиморфизма имеет язык OCaml.
Мне предоставил пример
let id x = x
Разве этот пример не эквивалентен шаблонной функции C ++
template<class A> A id(A x) { return x; }
Если так, то мой вопрос: есть ли другие формы полиморфизма в OCaml? Это понятие называется «универсальным алгоритмом» в мире императивных языков, а не «полиморфизм».
Есть три основных языковых особенности, которые иногда называют полиморфизмом:
Как вы уже обнаружили, OCaml обладает параметрическим полиморфизмом. У этого также есть полиморфизм подтипа. Он не имеет специального полиморфизма.
Так как в вашем заголовке вы попросили примеры, вот пример полиморфизма подтипа в OCaml:
class c = object
method m x = x+1
end
class d = object
inherit c
method m x = x+2
end
let main =
let o:c = new d in
print_int (o#m 2)
Это напечатает 4
,
Этот вид полиморфизма называется общее программирование но теоретическая концепция позади этого называется параметрический полиморфизм.
Два приведенных вами примера действительно показывают параметрический полиморфизм, но OCaml поддерживается сильной проверкой проверяющего типа, а не тем, что предоставляется C ++ (который является более прагматичным и с большим количеством предостережений), поэтому реальная разница в том, что в C ++ код дублируется для каждого типа, который вы используете в своем коде, в то время как в OCaml это разрешается с помощью средства проверки типов, проверяя, что замена неявных переменных типа через объединение существует.
В OCaml все может быть полиморфным только потому, что ничто обычно не аннотируется типами, поэтому на практике, если что-то можно использовать в качестве аргумента для какой-либо функции, это неявно допускается.
Например, вы можете иметь переменные типа для определения полиморфных методов:
let swap ((x : 'a), (y : 'b)) : 'b * 'a = (y, x)
так что это будет работать независимо от типа 'a
о 'b
является.
Еще одна мощная полиморфная особенность OCaml функторы (которые не являются общими функторами C ++), но являются модулями, параметризованными другими модулями. Концепция звучит страшнее, но она действительно представляет более высокий порядок полиморфного поведения для кода OCaml.