复杂双重的实例

时间:2017-09-09 03:12:11

标签: class haskell types instance complex-numbers

我正在编写一个类Separate,它在不同结构的“部分”上独立执行某些操作;例如复数的真实和复杂部分(后来我也需要它用于列表)。通过这种方式,我可以编写一些函数,这些函数不关心它们所采用的这些结构中的哪一种,而是以这种独立的方式进行。

这些功能应该在没有零件的结构上正常工作,例如: Double

这将用于计算标准偏差(我知道有一个标准偏差定义为复数,它给出一个实数,但“独立”一个在我的情况下更有意义)。

但是我遇到了一些实例声明的问题。特别是其中一个操作应该“乘以Double”,即scale

class Separate a where
  scale :: Double -> a -> a

instance Separate Double where
  scale = (*)

instance (Floating a) => Separate (Complex a) where
  d `scale` z = (*d) <$> z

这当然无法编译,因为*与普通Double之间未定义Floating a。但我无法直接定义instance Separate (Complex Double) where...

我可以编写一个没有类的函数Double -> Complex Double -> Complex Double但是必须为不同的结构单独定义标准偏差。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

早上好指出,如果您使用function my_callback($element) { // remove all null tags if ($element->tag) $article->find....; } 扩展程序定义instance Separate (Complex Double)则非常好,这是一种受欢迎且无害的扩展程序。

但也有其他选择,例如:

FlexibleInstances

组合实例the best kind of instance

instance (Floating a) => Separate (Complex a) where
    d `scale` z = (* realToFrac d) <$> z

答案 1 :(得分:2)

这是类型问题,而不是您处理实例的方式问题。如您所说,(*)Double之间未定义Float。不过,我们可以轻松地在DoubleFloat之间进行转换,让您好运!使用realToFrac,我们可以在各种小数类型之间进行转换。

我会按如下方式重写实例:

instance (Floating a) -> Separate (Complex a) where
  d `scale` z = (* (realToFrac d)) <$> z