在 Haskell 中,如何重载内置函数,例如!!
?
我最初是想弄清楚如何重载内置函数!!
通过自己的数据类型来支持。具体来说,!!
属于以下类型:
[a] -> Int -> a
我想保留它的现有功能,但也能够在其类型签名看起来更像的地方调用它
MyType1 -> MyType2 -> MyType3
我最初想这样做是因为 MyType1 就像一个列表,我想使用!!
运算符,因为我的操作与从列表中选择一项非常相似。
如果我超载了类似的东西+
我可以将函数的实例添加到适用的类型类中,但我认为这不是一个选项。
我不相信我真的想再重载这个函数,但我仍然对它是如何完成的感兴趣。实际上,评论是否重载运算符,例如!!
即使是一个好主意也会受到赞赏。
在 Haskell 中,几乎所有运算符都是库定义的。您最常用的许多库都是在默认导入的 Prelude 模块的“标准库”中定义的。加布里埃尔的答案展示了如何避免导入其中一些定义,以便您可以创建自己的定义。
那不是超载但是,因为运算符仍然只意味着一件事;您为其定义的新含义。 Haskell 提供的重载的主要方法,即以针对不同类型具有不同实现的方式使用运算符,是类型类别机制。
类型类标识了一组支持某些通用功能的类型。当您将这些函数与类型一起使用时,Haskell 会计算出正确的值instance适用于您的用法并确保使用函数的正确实现的类型类。大多数类型类只有几个函数,有些只有一两个,需要实现这些函数才能创建新实例。其中许多还提供了许多根据核心函数实现的辅助函数,并且您可以将所有这些函数与创建类实例的类型一起使用。
碰巧其他人制作的类型的行为有点像列表,所以已经有一个类型类称为ListLike
。我不确定你的类型与列表到底有多接近,所以它可能不适合 ListLike,但你应该看看它,因为如果你可以使你的类型成为 ListLike 实例,它将为你提供很多功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)