在 Haskell 中将 Num 转换为 Double

3

我知道有fromRationalfromIntegerfromIntegral的存在。
但是否有更通用的函数将任何Num转换为Double类型?
我也意识到,Num是一组类型,并且可能会有使用方式上的限制。
但这是可能的吗?
就像这样:

fromNum::(Num a) => a -> Double

最好不要安装任何额外的软件包。


一个潜在的问题是,任何Haskell程序员都可以创建一些Num类的新实例。Num类是一个开放的类型集合。如果fromNum库函数面对其创建者完全没有预见的某种类型实例,它会怎么做呢? - jpmarinier
如何将“Complex Double”转换为“Double”? - n. m.
1个回答

8

绝对没有方法可以做到这一点,而且原因非常充分。Num是一种通用类型,旨在用于任何稍微“可加”和“可乘”的东西。您可以非常宽松地将其视为[1]。这意味着向量、点和矩阵等东西都是Num。并且没有合理的、规范的方法将Matrix a转换为Double

您已经注意到了,有几种方式可以从更具体的类型类(例如Integral)获得Double


[1] 是的,fromInteger 也在 Num 上。这在很大程度上被认为是一个不好的特性,处理矩阵的库通常只提供一个笨拙的默认实现。


我之前并不知道,我以为NumComplex的超集,很有意思。 是否存在一种fromReal函数(类似于fromReal::Real -> Double)? - Otávio Augusto Silva
2
@OtávioAugustoSilva fromReal = fromRational . toRational - amalloy
1
@amalloy,这已经存在于realToFrac中。 - David Fletcher
1
我不认同fromIntegerNum类的缺陷。反而,将Num用于矩阵等事物是错误的运用。矩阵_不是数字_。特别地,它们也没有一个合理的实现方式来进行*运算——除非你考虑Hadamard积,但那并不是自然乘积,矩阵乘法 才是。但那并没有一个像*一样的类型,它更像是一个范畴组合类型。相反,矩阵正确的类型类是向量空间 - leftaroundabout
2
@leftaroundabout vector-space 很棒,是的;我希望更多的人使用它。我认为这个问题不在于 fromInteger,而是强制将“可以相加以产生相同类型的事物”与“可以相乘以产生相同类型的事物”以及“可以在源代码中表示为整数字面量的事物”绑定在一起。这三个概念对于其中一个或两个其他概念不合理的类型非常有用。有了后见之明,它们都应该是单独的类(可以选择像 Num 这样的类将它们与超类约束结合在一起)。 - Ben
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接