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

Ben*_*ach 6 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  
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

sep*_*p2k 12

Prelude.^不是任何类型类的一部分,因此您可以定义自己的^函数的唯一方法是隐藏一个类Prelude.

请注意,由于Prelude.^is 的签名,只要它是一个实例(Num a, Integral b) => a -> b -> a,你就可以在你的Frac类型的值上使用它Num.你不会提供自己的实现.

  • 请注意,`Prelude.^`仅适用于非负整数指数.但是如果你的类型是`Fractional`的实例(我猜它会是),你也可以使用`Prelude.^^`,它适用于所有(包括负数)整数指数. (4认同)