根据我对 Haskell 的了解以及我对 GHC 所做的实验,Haskell 似乎具有返回类型重载(也称为临时多态性)。这方面的一个例子是一个fromInteger
函数,它可以根据结果的使用位置为您提供 aDouble
或 an 。Integer
例如:
fd :: Double -> String
fd x = "Double"
fi :: Integer -> String
fi x = "Integer"
fd (fromInteger 5) -- returns "Double"
fi (fromInteger 5) -- returns "Integer"
Haskell 的温和介绍似乎同意这一点,它说:
到目前为止我们所讨论的这种多态性通常称为参数多态性。还有另一种称为 ad hoc 多态性,更广为人知的是重载。以下是一些临时多态性的示例:
- 文字 1、2 等通常用于表示固定精度和任意精度的整数。
如果数字文字被认为是临时多态性(又名重载)的一个例子,那么对于像fromInteger
.
事实上,我在 Stack Overflow 上找到了一些其他问题的答案,这些问题表明 Haskell 具有按返回类型重载的功能。
但是,至少有一位 Haskell 程序员告诉我,这不是返回类型重载,而是“参数多态性,其中参数受通用量词约束”的示例。
我认为他的意思是从(某种非确定性类型)的fromInteger
每个实例返回一个值。Num
这似乎是一个合理的解释,但据我所知,Haskell 永远不会让我们查看这些实例值中的一个以上(部分归功于Monomorphism 限制)。似乎我们看到的实际实例的价值也可以静态确定。由于所有这些,似乎可以合理地说表达式fd (fromInteger 5)
中的子表达式fromInteger 5
是 type Double
,而表达式fi (fromInteger 5)
中的子表达式fromInteger 5
是 type Integer
。
那么,Haskell 有返回类型重载吗?
如果不是,请提供以下其中一项的示例:
- 如果 Haskell 具有返回类型重载,则有效的 Haskell 代码将具有不同的行为
- 如果 Haskell 具有返回类型重载,则有效的 Haskell 代码将无效
- 如果 Haskell 具有返回类型重载,则无效的 Haskell 代码将有效