一个类似的问题已经在这里回答-Parametric polymorphism vs Ad-hoc polymorphism。这个问题的区别在于术语 bounded 。似乎有两种不同的即席多态性-
例如,在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 ++通过函数重载实现的即席多态性无法归类为有界参数多态性。
Haskell通过类型类进行的即席多态性可以归类为有界参数多态性(作为另一个示例,Pierce的类型和编程语言讨论了System-F < :(在类似情况下)。
有界参数多态性是即席多态性的严格“子集”,即可以说具有第一个类型系统的任何类型系统也可以说具有第二个类型系统吗?