
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
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
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
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@haskell.org http://www.haskell.org/mailman/listinfo/beginners
-- Sent from an iPhone, please excuse brevity and typos.
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners