"真正的多态性"的例子?(最好使用Haskell)

Cod*_*ein 4 c++ polymorphism haskell parametric-polymorphism

我已经看到了很多关于"真正的多态性"的部分定义,例如这里这里,但是我无处可以通过两个具体的例子找到一个明显的差异示例.

我知道重载+运算符是某种形式的多态,并且它在Haskell和C++中的实现方式不同.有人可以准确地说明两种语言中的例子有什么不同吗?

Gab*_*lez 6

您正在寻找的术语是"参数多态",它与"ad-hoc多态"不同.

参数多态的一个例子是类型签名Nothing:

Nothing :: Maybe a
Run Code Online (Sandbox Code Playgroud)

a在类型可以为任何可能的类型,因为Nothing栖息在所有Maybe秒.我们说这a是参数化多态的,因为它可以是任何类型.

现在考虑这种类型:

Just 1 :: (Num b) => Maybe b
Run Code Online (Sandbox Code Playgroud)

这次b不能是任何类型:它只能是一个实例的类型Num.我们说这b是ad-hoc多态的,因为它可以是一组类型的任何成员,由Num类的实例给出.

所以,回顾一下:

  • 参数多态:可以是任何类型

  • Ad-hoc多态:由类型约束