基于我读过的关于Haskell的内容,以及我用GHC做过的实验,似乎Haskell有返回类型重载(又称ad hoc多态).这方面的一个例子是fromInteger可以给你一个Double或一个Integer取决于结果使用位置的函数.例如:
fd :: Double -> String
fd x = "Double"
fi :: Integer -> String
fi x = "Integer"
fd (fromInteger 5) -- returns "Double"
fi (fromInteger 5) -- returns "Integer"
Run Code Online (Sandbox Code Playgroud)
Haskell的一个温和的介绍似乎同意这一点,当它说:
到目前为止我们讨论过的那种多态性通常被称为参数多态.另一种称为ad hoc多态,更好地称为重载.以下是ad hoc多态的一些示例:
- 文字1,2等通常用于表示固定和任意精度整数.
如果数字文字被认为是ad hoc多态(也就是重载)的一个例子,那么似乎对于函数的结果也是如此fromInteger.
事实上,我已经找到了一些关于Stack Overflow的其他问题的答案,这些问题表明Haskell通过返回类型进行了重载.
但是,至少有一个Haskell程序员告诉我这不是返回类型重载,而是"参数多态,其中参数受通用量词约束"的示例.
我认为他所得到的是fromInteger从每个实例Num(某种非确定性类型)返回一个值.
这似乎是一个合理的解释,但据我所知,Haskell从不让我们看到这些实例值中的多个(部分归功于Monomorphism限制).我们看来的实际情况似乎也可以静态确定.由于所有这一切,似乎有理由说在表达式fd (fromInteger 5)中子表达式fromInteger 5是类型Double,而在表达式fi (fromInteger 5)中子表达式fromInteger 5 …