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

标签 haskell types operator-overloading fractions

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

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

有了它,数据类型就像我想要的那样表现出正常的数字(这意味着我可以调用 (Frac 1 2) + (Frac 1 4) 之类的东西并返回 Frac 3 4 )

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

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

当我尝试将函数名称更改为 ^ ,我收到一个错误,因为它与 Prelude 对 ^ 的定义冲突.有没有Num输入我可以给我的Fraction输入一个实例以允许我使用 ^运营商就可以了?

谢谢!

最佳答案

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

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

关于haskell - 如何在 Haskell 中实现 ^ 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11976713/

相关文章:

Haskell 列表上的递归如何工作

go - 如何创建从匹配模式的字符串派生的 Go 类型?

ruby-on-rails - 你通常把类型放在 rails 的什么地方?

c++ - 如何编写插入运算符函数模板?

haskell - 获取函数的地址(不与 C 接口(interface))

haskell - `squares xs = [x*x|x<-xs]` 在 Haskell 中意味着什么?

haskell - 使用存在类型 Haskell 时出现类型错误

scala - 无法使用键的动态混合类型将成员添加到 Map

scala - 为什么 !== 在 Scala 中的优先级低于 ===?

javascript - 如何处理除法运算符的溢出