在 Haskell 中,如何重载内置函数,例如 !!
?
我最初是想弄清楚如何重载内置函数!!
以支持自己的数据类型。具体来说, !!
的类型为:
[a] -> Int -> a
我想保留它现有的功能,但也能够在其类型签名看起来更像的地方调用它
MyType1 -> MyType2 -> MyType3
我本来想这样做是因为MyType1就像一个列表,我想使用!!
运算符,因为我的操作与从列表中选择一项非常相似。
如果我重载了类似 +
的东西,我可以将函数的实例添加到适用的类型类中,但我认为这不是一个选项。
我不相信我真的想再重载这个函数,但我仍然对它是如何完成的感兴趣。实际上,如果重载诸如 !!
之类的运算符是否是一个好主意,我们也将不胜感激。
最佳答案
在 Haskell 中,几乎所有运算符都是库定义的。您最常用的许多库都是在默认导入的 Prelude 模块的“标准库”中定义的。加布里埃尔的回答展示了如何避免导入其中一些定义,以便您可以创建自己的定义。
但这并不是重载,因为运算符仍然只意味着一件事;您为其定义的新含义。 Haskell 提供的重载的主要方法,即以针对不同类型具有不同实现的方式使用运算符,是类型类机制。
类型类标识一组支持某些通用功能的类型。当您将这些函数与类型一起使用时,Haskell 会找出适用于您的用法的类型类的正确实例,并确保使用函数的正确实现。大多数类型类只有几个函数,有些只有一两个,需要实现这些函数才能创建新实例。其中许多还提供了许多根据核心函数实现的辅助函数,并且您可以将所有这些函数与创建类实例的类型一起使用。
碰巧其他人已经创建了一些行为非常像列表的类型,因此已经有一个名为 ListLike
的类型类。我不确定你的类型与列表到底有多接近,所以它可能不适合 ListLike,但你应该看看它,因为如果你可以使你的类型成为 ListLike 实例,它将为你提供很多功能.
关于haskell - 重载 Haskell 中的内置函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18372060/