如何在Haskell中实现^运算符?

时间:2012-08-15 20:24:38

标签: haskell types operator-overloading fractions

我正在为Haskell中的Fraction数据类型创建一堆实例,我想知道是否有一个地方可以实现^运算符。

我的意思是,我有多个Num类型的实例,在这些情况下,我定义了常见的操作,例如+-等。

这样,数据类型就像我想要的那样表现为正常数字(意思是我可以调用(Frac 1 2) + (Frac 1 4)之类的内容并返回Frac 3 4

我要做的是直接实施^。现在,我已经将它定义为:

(|^|) :: Fraction -> Int -> Fraction
(|^|) f = foldr (*) mempty . flip replicate f  

当我尝试将函数名称更改为^时,我收到错误,因为它与Prelude的^定义冲突。是否有Num类型我可以为Fraction类型提供一个允许我在其上使用^运算符的实例?

谢谢!

1 个答案:

答案 0 :(得分:12)

Prelude.^不属于任何类型类,因此您定义自己的^函数的唯一方法是隐藏Prelude中的一个。

请注意,由于Prelude.^的签名为(Num a, Integral b) => a -> b -> a,因此您可以在Frac类型的值上使用它,只要它是{Num的实例1}}。你不会提供自己的实现。