如何在Haskell中实现^operator?

如何在Haskell中实现^operator?,haskell,types,operator-overloading,fractions,Haskell,Types,Operator Overloading,Fractions,我正在为Haskell中的分数数据类型创建一组实例,我想知道是否有一个地方可以实现^操作符 我的意思是,我有几个不同的Num类型的实例,在这些实例中,我定义了一些常见的操作,比如+,-,等等 这样,数据类型就可以像我所希望的那样表现为一个普通数字(这意味着我可以调用(frac12)+(frac14),然后返回frac34) 我要做的是直接实现^。现在,我把它定义为: (|^|) :: Fraction -> Int -> Fraction (|^|) f = foldr (*) me

我正在为Haskell中的分数数据类型创建一组实例,我想知道是否有一个地方可以实现
^
操作符

我的意思是,我有几个不同的
Num
类型的实例,在这些实例中,我定义了一些常见的操作,比如
+
-
,等等

这样,数据类型就可以像我所希望的那样表现为一个普通数字(这意味着我可以调用
(frac12)+(frac14)
,然后返回
frac34

我要做的是直接实现
^
。现在,我把它定义为:

(|^|) :: Fraction -> Int -> Fraction
(|^|) f = foldr (*) mempty . flip replicate f  
当我尝试将函数名更改为
^
时,我得到一个错误,因为它与Prelude对
^
的定义冲突。是否有一个
Num
类型可以为我的
分数
类型提供一个实例,以允许我在其上使用
^
运算符


谢谢

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


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

您是否有
Num
Fraction
实例?如果是这样,前奏曲
^
将适用于
分数
@dbaupp-Holy-crap!太棒了!我不知道,但是是的,我知道了,是的,它起作用了!谢谢注意@sepp2k关于类型签名的观点。如果一个类型满足一个函数的所有约束(在
=>
之前的内容),那么它可以在该函数中使用。在这种情况下,相关的约束是
Num a
,因此具有
Num
实例的任何类型都可以与
^
一起使用。顺便说一下,我建议您不要为数字类型提供
Monoid
实例
Data.Monoid
为此提供了
Sum
Product
包装。请注意
Prelude.^
仅适用于非负整数指数。但是,如果您的类型是
分数的实例(我想应该是),您也可以使用
Prelude.^^
,它适用于所有(包括负)整数指数。如果您想要最通用的求幂运算符,请使用
(**)
,它允许对浮点基和指数求幂。当然,这就是为什么我们首先有三个求幂运算符的原因,从它们的类型可以看出:
(^)
需要
Num
(^^)
需要
分数
(**)
需要
浮动