Ограниченный параметрический полиморфизм против специального полиморфизма - PullRequest
0 голосов
/ 15 декабря 2018

На аналогичный вопрос уже ответили здесь - Параметрический полиморфизм против специального полиморфизма .Разница в этом вопросе в том, что термин ограничен .Кажется, что есть два различных вида специального полиморфизма -

  1. Например, в C ++ вы можете написать

    int foo(int x) { return x; }
    int foo(string x) { return x.size(); }
    

    В этом случае это не 'Имеет смысл говорить о типе foo как о наборе перегрузки (в том смысле, что это не определяемый пользователем тип или что-то, для чего вы можете создать псевдоним), но имеет смысл говорить отипы отдельных перегрузок сами.

  2. В Haskell вы можете написать

    class Foo a where
      foo :: a -> Int
    instance Foo Int where
      foo x = x
    instance Foo String where
      foo xs = length xs
    

    Здесь имеет смысл говорить о типе foo отдельнокак правильный тип Foo a => a -> Int, который можно использовать как обычный пользовательский тип.

Уместно ли сказать:

  1. C ++'s flavourad-hoc полиморфизма через перегрузку функций нельзя классифицировать как ограниченный параметрический полиморфизм.

  2. Аскелевскую разновидность ad-hoc полиморфизма через классы типов можно классифицировать как ограниченный параметрический полиморфизм (в качестве другого примераПирса Типы и языки программирования говорит о System-F <: </sub> в аналогичном контексте).

Является ли ограниченный параметрический полиморфизм строгим «подмножеством» ад-специальный полиморфизм, в том смысле, что любая система типов, о которой можно сказать, что она имеет первое, также может иметь второе?

...