在Haskell中,如何重载内置函数,如!!
?Haskell中内置函数的过载
我最初试图弄清楚如何重载内置函数!!
以支持自己的数据类型。具体来说,!!
的类型为:
[a] -> Int -> a
,我想保留它现有的功能,还能够在那里它的类型签名看起来更像
MyType1 -> MyType2 -> MyType3
我本来想做叫它这是因为MyType1就像一个列表,我想使用!!
运算符,因为我的操作与从列表中选择项目非常相似。
如果我重载了像+
之类的东西,我可以将我的函数的一个实例添加到适用的类型类,但我不认为这是一个选项。
我不确定我实际上甚至想重载这个函数,但我仍然对如何完成它感兴趣。其实,如果超载运营商如!!
甚至是一个好主意的意见,也将不胜感激。
这是通过让用户导入两个不同的'(!!)'并且至少有一个合格的,或者通过使用'(!)'来查找/索引来解决的。你不能真正重载Haskell中的任意函数/运算符。 – kqr
请注意,您在技术上不能“超载”'!!',如果超载,则表示临时的基于非类型类型的多态性。您可以像“超载”fmap,“<$>”或“>> =”那样“重载”它,但它们必须被限制为明确的类型类型(如monad或applicative或“list-like”)他们的类型签名被推广到整个类型类。你最好的选择是为类型类定义你自己的新的,泛化的'(!!)'的类型签名,并且为你想要的所有东西(!!)'定义实例。 –