На аналогичный вопрос уже ответили здесь - Параметрический полиморфизм против специального полиморфизма .Разница в этом вопросе в том, что термин ограничен .Кажется, что есть два различных вида специального полиморфизма -
Например, в C ++ вы можете написать
int foo(int x) { return x; }
int foo(string x) { return x.size(); }
В этом случае это не 'Имеет смысл говорить о типе foo
как о наборе перегрузки (в том смысле, что это не определяемый пользователем тип или что-то, для чего вы можете создать псевдоним), но имеет смысл говорить отипы отдельных перегрузок сами.
В 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
, который можно использовать как обычный пользовательский тип.
Уместно ли сказать:
C ++'s flavourad-hoc полиморфизма через перегрузку функций нельзя классифицировать как ограниченный параметрический полиморфизм.
Аскелевскую разновидность ad-hoc полиморфизма через классы типов можно классифицировать как ограниченный параметрический полиморфизм (в качестве другого примераПирса Типы и языки программирования говорит о System-F <: </sub> в аналогичном контексте).
Является ли ограниченный параметрический полиморфизм строгим «подмножеством» ад-специальный полиморфизм, в том смысле, что любая система типов, о которой можно сказать, что она имеет первое, также может иметь второе?