0

我想重载任何 operator 。我想做一个简单的函数,例如考虑重载 == 运算符 .Overload == 使得 x==y
返回 x 。或者 x==y 返回 x+y。没关系。你能告诉我任何简单的运算符重载示例吗?不幸的是,我在网上找不到任何示例。

例如;当我调用 Tree a == Tree a 返回 5(它总是返回 5。我选择它时,它与任何事物无关)或当我调用 3==4 时返回:7

我尝试了以下代码(我从 haskell.org 找到它)但它无法编译。

class Eq a where
(==) ::a -> a -> Int

instance Eq Integer where
x == y = 5

instance Eq Float where
x == y = 5

以下代码均无效:

数据树 a = 节点 a | 空的

类 Tree a where (==) :: Tree a -> Tree a -> Int

实例树整数,其中 x == y = 1

我接受错误:

Ambiguous occurrence `Eq'
It could refer to either `Main.Eq', defined at Operations.hs:4:7
                      or `Prelude.Eq',
                         imported from `Prelude' at Operations.hs:1:1
                         (and originally defined in `GHC.Classes')
4

3 回答 3

2

首先尝试==从 Prelude 中隐藏。如果您希望它对不同类型有不同的工作方式,您只需要一个类型类。

import Prelude hiding ((==))

x == y = x
于 2013-04-26T17:02:10.717 回答
2

您不能从导入的模块中隐藏实例。参见示例:显式导入实例

看起来你试图做的“重载”是允许(==)其他类型,比如树。这很简单!只需简单地创建一个新实例:

data Tree a = Leaf a | Branch [Tree a]

 instance (Eq a) => Eq (Tree a) where
    (Leaf a)   == (Leaf b)   = a == b
    (Branch a) == (Branch b) = a == b
    _          == _          = False

(你也可以只是derive实例Eq

于 2013-04-26T17:10:48.397 回答
0

这是一个 +++ 运算符,其作用类似于用于附加列表的 (++) 运算符:

(+++) :: [a]->[a]->[a]
x +++ [] = x
[] +++ x = x
x  +++ y = (init x) +++ ((last x) : y)
于 2015-06-15T18:50:07.217 回答