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