[Haskell-beginners] How to add a "method" to a record

Christopher Allen cma at bitemyapp.com
Wed Sep 10 18:49:56 UTC 2014


I'd agree with Julian Birch, except to say that you shouldn't make a
typeclass unless overloading is really needed and you can define laws on
the behavior thereof.

A fairly major (IMO) inconvenience with embedding functions in records that
have non-function data they operate on is that you won't have a Show
instance. Also, you'll be forced to extract the method and then apply it.
In doing so, to make things nicer you'll probably pull out an "extract and
apply" function. At that point, you're better off lifting the varying
implementations into top-level functions and making a wrapper that decides
which runs where based on the *data* in the record.

That is, including enough information in the record to decide which
function applied.

And this is without having broached whether or not you plan to be able to
serialize your data or not.


On Wed, Sep 10, 2014 at 1:30 PM, Julian Birch <julian.birch at gmail.com>
wrote:

> Bear in mind you can just create functions at the top level that operate
> on your data structure.  You only need the function to be a member of the
> record if the function itself changes, which is relatively rare.
>
> Say you need a Foo and a Bar, and they both have labels, implemented in
> different ways, then you can use a typeclass to achieve your goals.
>
>
> On Wednesday, September 10, 2014, David McBride <toad3k at gmail.com> wrote:
>
>> Is this what you are looking for?
>>
>> data Foo pl = Foo {
>>   label :: pl -> String,
>>   payload :: pl
>> }
>>
>> On Wed, Sep 10, 2014 at 2:06 PM, martin <martin.drautzburg at web.de> wrote:
>>
>>> Hello all
>>>
>>> if I have a record like
>>>
>>>         data Foo pl = Foo {
>>>                     label :: String,
>>>                     payload :: pl
>>>                 }
>>>
>>> how can I create a similar type where I can populate label so it is not
>>> a plain string, but a function which operates on
>>> payload? Something like
>>>
>>>         label (Foo pl) = show pl
>>>
>>>
>>> _______________________________________________
>>> Beginners mailing list
>>> Beginners at haskell.org
>>> http://www.haskell.org/mailman/listinfo/beginners
>>>
>>
>>
>
> --
> Sent from an iPhone, please excuse brevity and typos.
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20140910/82e5daea/attachment.html>


More information about the Beginners mailing list