相关疑难解决方法(0)

Haskell有返回类型重载吗?

基于我读过的关于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 …

polymorphism haskell

18
推荐指数
4
解决办法
2568
查看次数

标签 统计

haskell ×1

polymorphism ×1