【问题标题】:any working operator overloading example in haskellhaskell 中的任何工作运算符重载示例
【发布时间】:2013-04-26 16:56:57
【问题描述】:

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

例如;当我调用 Tree a == Tree a return 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 |空

类树在哪里 (==) :: 树 a -> 树 a -> Int

实例树整数 where 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')

【问题讨论】:

  • 只尝试实例部分。类型类定义已经在 Prelude 中进行了。或者,隐藏前奏定义的导入。
  • 那么如何为 Trees 重载 == 并始终返回 5 ?
  • Prelude 中定义的Eq 类要求== 的结果是Bool,因此要返回5,您必须隐藏它并定义自己的。
  • 如果你让 == 意味着不等于相等,你的代码将难以理解。考虑改用 ===。

标签: haskell operator-overloading overloading


【解决方案1】:

您不能从导入的模块中隐藏实例。例如:Explicitly import instances

看起来您尝试做的“重载”是允许 (==) 用于其他类型,例如树。这很容易!只需创建一个新实例:

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 实例)

【讨论】:

  • 我们是否必须为模块中 == 的重载编写任何内容?例如;模块 x (f) 其中 f a = a 。并且上面的代码是存在的。难道我们必须要这样一个东西 module x(f,'==') where ...
  • @user1308990:不;我们实际上无法控制它们何时被导出——它们总是被导出。这被称为“开放世界假设”
  • @amindfv,“开放世界假设”实际上是另外一回事——总是可以添加新实例的假设。
【解决方案2】:

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

import Prelude hiding ((==))

x == y = x

【讨论】:

  • 如果 x 和 y 是 Tree 类型,如何指定 x 和 y 的类型?树 a = 节点 a |空
  • @user1308990:我不太清楚你的意思,但你可以像对任何函数一样做。运算符的语法略有不同。
  • 好的。我明白了。我这样做是为了了解重载的工作原理。现在很清楚了。但是,我也有一个问题,我在@amindfv 的答案下方评论了这个问题。你能清除它吗?谢谢
  • @user1308990:不,您不需要在导出中列出==。实例会自动导出。
【解决方案3】:

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

(+++) :: [a]->[a]->[a]
x +++ [] = x
[] +++ x = x
x  +++ y = (init x) +++ ((last x) : y)

【讨论】:

  • 这个答案对前面的答案有什么补充?
猜你喜欢
  • 2013-05-06
  • 1970-01-01
  • 2019-03-13
  • 2016-09-16
  • 1970-01-01
  • 2015-05-25
  • 2020-12-15
  • 2017-03-16
  • 2021-12-02
相关资源
最近更新 更多