(为这个奇怪的标题道歉,但我想不出更好的标题。)
对于个人 Haskell 项目,我希望有“绝对值”(如频率)和相对值(如两个频率之间的比率)的概念。在我的上下文中,添加两个绝对值是没有意义的:一个可以添加相对值以产生新的相对值,并将相对值添加到绝对值以产生新的绝对值(同样用于减法)。
我已经为这些定义了类型类:见下文。但是,请注意,运算符##+
and#+
具有相似的结构(对于 and 也是如此##-
)#-
。因此,我更愿意合并这些运算符,这样我就有一个加法运算符,它添加一个相对值(同样还有一个减法运算符,它产生一个相对值)。 更新:澄清一下,我的目标是将我的##+
和统一#+
到一个运营商中。我的目标不是将它与现有的 ( Num
)+
运算符统一起来。
但是,我看不到如何使用类型类来做到这一点。
问题:这可以做到吗?如果可以,怎么做?还是我不应该尝试?
以下是我目前拥有的:
{-# LANGUAGE MultiParamTypeClasses #-}
class Abs a where
nullPoint :: a
class Rel r where
zero :: r
(##+) :: r -> r -> r
neg :: r -> r
(##-) :: Rel r => r -> r -> r
r ##- s = r ##+ neg s
class (Abs a, Rel r) => AbsRel a r where
(#+) :: a -> r -> a
(#-) :: a -> a -> r