Cod*_*ein 4 c++ polymorphism haskell parametric-polymorphism
我已经看到了很多关于"真正的多态性"的部分定义,例如这里和这里,但是我无处可以通过两个具体的例子找到一个明显的差异示例.
我知道重载+运算符是某种形式的多态,并且它在Haskell和C++中的实现方式不同.有人可以准确地说明两种语言中的例子有什么不同吗?
您正在寻找的术语是"参数多态",它与"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多态:由类型约束