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

Corentin Dupont corentin.dupont at gmail.com
Wed Sep 10 18:50:18 UTC 2014


If the field "label" can be deduced from "payload", I recommend not to
include it in your structure, because that would be redundant.

Here how you could write it:

data Foo pl = Foo { payload :: pl}

labelInt :: Foo Int -> String
labelInt (Foo a) = "Int payload:" ++ (show a)

labelString :: Foo String -> String
labelString (Foo a) = "String payload" ++ a

You are obliged to define two separate label function, because "Foo Int"
and "Foo String" are two completly separate types.
Alternatively, if you want only one label function, use a type sum and
pattern match on it:

data T = TS String | TI Int
data Foo2 = Foo2 { payload2 :: T}

label :: Foo2 -> String
label (Foo2 (TI a)) = "Int payload:" ++ (show a)
label (Foo2 (TS a)) = "String payload:" ++ a



On Wed, Sep 10, 2014 at 8: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/28fc1a81/attachment-0001.html>


More information about the Beginners mailing list