我正在编写一个类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
但是必须为不同的结构单独定义标准偏差。
有什么想法吗?
答案 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
。不过,我们可以轻松地在Double
和Float
之间进行转换,让您好运!使用realToFrac
,我们可以在各种小数类型之间进行转换。
我会按如下方式重写实例:
instance (Floating a) -> Separate (Complex a) where
d `scale` z = (* (realToFrac d)) <$> z