【发布时间】:2018-02-17 23:43:42
【问题描述】:
我正在编写一个类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,但是标准差必须为不同的结构单独定义。
有什么想法吗?
【问题讨论】:
-
只需使用 FlexibleInstances。
标签: class haskell types instance complex-numbers