haskell - 重载 Haskell 中的内置函数

标签 haskell operator-overloading overloading

在 Haskell 中,如何重载内置函数,例如 !!

我最初是想弄清楚如何重载内置函数!!以支持自己的数据类型。具体来说, !! 的类型为:

[a] -> Int -> a

我想保留它现有的功能,但也能够在其类型签名看起来更像的地方调用它

MyType1 -> MyType2 -> MyType3

我本来想这样做是因为MyType1就像一个列表,我想使用!!运算符,因为我的操作与从列表中选择一项非常相似。

如果我重载了类似 + 的东西,我可以将函数的实例添加到适用的类型类中,但我认为这不是一个选项。

我不相信我真的想再重载这个函数,但我仍然对它是如何完成的感兴趣。实际上,如果重载诸如 !! 之类的运算符是否是一个好主意,我们也将不胜感激。

最佳答案

在 Haskell 中,几乎所有运算符都是库定义的。您最常用的许多库都是在默认导入的 Prelude 模块的“标准库”中定义的。加布里埃尔的回答展示了如何避免导入其中一些定义,以便您可以创建自己的定义。

但这并不是重载,因为运算符仍然只意味着一件事;您为其定义的新含义。 Haskell 提供的重载的主要方法,即以针对不同类型具有不同实现的方式使用运算符,是类型类机制。

类型类标识一组支持某些通用功能的类型。当您将这些函数与类型一起使用时,Haskell 会找出适用于您的用法的类型类的正确实例,并确保使用函数的正确实现。大多数类型类只有几个函数,有些只有一两个,需要实现这些函数才能创建新实例。其中许多还提供了许多根据核心函数实现的辅助函数,并且您可以将所有这些函数与创建类实例的类型一起使用。

碰巧其他人已经创建了一些行为非常像列表的类型,因此已经有一个名为 ListLike 的类型类。我不确定你的类型与列表到底有多接近,所以它可能不适合 ListLike,但你应该看看它,因为如果你可以使你的类型成为 ListLike 实例,它将为你提供很多功能.

关于haskell - 重载 Haskell 中的内置函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18372060/

相关文章:

haskell - 为什么 Haskell 类型 "deriving Integral"需要是 "deriving Enum"?

haskell - 如何在 GHCi 中列出具有应用类型参数的类型的实例

ios - swift 错误 : Could not find an overload for '==' that accepts the supplied arguments?

c++ - 矩阵运算符重载不起作用

java - 使用构造函数重载和带有继承的预先存在的静态对象

c++ - 为什么 random() 在 cstdlib 中工作? (Ubuntu 10.10)

Haskell 风格和类型类设计(类型类应该最小化吗?)

haskell - 使用具有约束类型的方法的类型类实例

c++ - ostream 和 << 重载的问题

ios - Ios方法重载和方法重写有什么区别