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