Пример полиморфизма OCaml кроме функции шаблона?

Я пытаюсь понять для себя, какую форму полиморфизма имеет язык OCaml.

Мне предоставил пример

let id x = x

Разве этот пример не эквивалентен шаблонной функции C ++

template<class A> A id(A x) { return x; }

Если так, то мой вопрос: есть ли другие формы полиморфизма в OCaml? Это понятие называется «универсальным алгоритмом» в мире императивных языков, а не «полиморфизм».

3

Решение

Есть три основных языковых особенности, которые иногда называют полиморфизмом:

  • Параметрический полиморфизм (т.е. «дженерики»)
  • Подтип полиморфизма, это способность подтипа типа предлагать более конкретную версию операции, чем у супертипа, то есть способность переопределять методы (и способность системы времени выполнения вызывать правильную реализацию метода на основе среды выполнения тип объекта). В ОО-языках это часто называют просто «полиморфизмом».
  • Так называемый специальный полиморфизм, то есть способность перегружать функции / методы.

Как вы уже обнаружили, 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,

13

Другие решения

Этот вид полиморфизма называется общее программирование но теоретическая концепция позади этого называется параметрический полиморфизм.

Два приведенных вами примера действительно показывают параметрический полиморфизм, но OCaml поддерживается сильной проверкой проверяющего типа, а не тем, что предоставляется C ++ (который является более прагматичным и с большим количеством предостережений), поэтому реальная разница в том, что в C ++ код дублируется для каждого типа, который вы используете в своем коде, в то время как в OCaml это разрешается с помощью средства проверки типов, проверяя, что замена неявных переменных типа через объединение существует.

В OCaml все может быть полиморфным только потому, что ничто обычно не аннотируется типами, поэтому на практике, если что-то можно использовать в качестве аргумента для какой-либо функции, это неявно допускается.

Например, вы можете иметь переменные типа для определения полиморфных методов:

let swap ((x : 'a), (y : 'b)) : 'b * 'a = (y, x)

так что это будет работать независимо от типа 'a о 'b является.

Еще одна мощная полиморфная особенность OCaml функторы (которые не являются общими функторами C ++), но являются модулями, параметризованными другими модулями. Концепция звучит страшнее, но она действительно представляет более высокий порядок полиморфного поведения для кода OCaml.

4

По вопросам рекламы [email protected]