Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Overload built in function in Haskell

In Haskell, how can one overload a built in function such as !!?

I originally was trying to figure out how to overload the built in function !! to support by own data types. Specifically, !! is of the type:

[a] -> Int -> a

and I want to preserve it's existing functionality, but also be able to call it where its type signature looks more like

MyType1 -> MyType2 -> MyType3

I originally wanted to do this because MyType1 is like a list, and I wanted to use the !! operator because my operation is very similar to selecting an item from a list.

If I was overloading something like + I could just add an instance of my function to the applicable type class, but I don't think that is an option here.

I'm not convinced I actually even want to overload this function anymore, but I am still interested in how it would be done. Actually, comments on if overloading an operator such as !! is even a good idea would be appreciated as well.

like image 557
Matt Avatar asked Dec 05 '22 09:12

Matt


1 Answers

In Haskell, nearly all operators are library-defined. Many of the ones you use the most are defined in the 'standard library' of the Prelude module that is imported by default. Gabriel's answer shows how to avoid importing some of those definitions so you can make your own.

That's not overloading though, because the operator still just means one thing; the new meaning you define for it. The primary method that Haskell provides for overloading, i.e. using an operator in such a way that it has different implementations for different types, is the type class mechanism.

A type class identifies a group of types that support some common functions. When you use those functions with a type, Haskell figures out the correct instance of the type class that applies to your usage and makes sure the correct implementation of the functions is used. Most type classes have just a few functions, some just one or two, that need to be implemented to make a new instance. Many of them offer a lot of secondary functions implemented in terms of the core ones as well, and you can use all of them with a type you make an instance of the class.

It so happens that others have made types that behave quite a bit like lists, and so there's already a type class called ListLike. I'm not sure exactly how close your type is to a list, so it may not be a perfect fit for ListLike, but you should look at it as it will give you a lot of capability if you can make your type a ListLike instance.

like image 170
Levi Pearson Avatar answered Jan 07 '23 08:01

Levi Pearson