Why Semigroup constraint on `V err a` in purescript-validation?


#1

joncfoo [5:00 PM]
qq, why does V err a from purescript-validation have a Semigroup and Monoid requirement for a?

instance semigroupV :: (Semigroup err, Semigroup a) => Semigroup (V err a) where ...
instance monoidV :: (Semigroup err, Monoid a) => Monoid (V err a) where ...

parsonsmatt [5:05 PM]
mempty requires Monoid a for pure mempty
you need a Semigroup on a bc it does Success a <> Success b = Success (a <> b)

joncfoo [5:10 PM]
sorry I should’ve phrased that better - why would you do this?
the commit that introduced this instance in 3.1.0 gives no rationale behind it - just a :party: emoji hah - https://github.com/purescript/purescript-validation/pull/12

natefaubion [5:44 PM]
@joncfoo what would an alternative be?
The commit just added the instance. Presumably it didn’t exist before.

joncfoo [5:49 PM]
I don’t know if there should be an alternative. I don’t think a general purpose validation type ought to have those requirements for a
It’d be nice to at least have an explanation documented?

natefaubion [5:50 PM]
Sorry I didn’t mean an Alternative instance. I meant what would you do for the Monoid if you didn’t require a Monoid constraint on a?
The instance is only required if you use the instance
If you don’t try to use append on it, you won’t incur the requirement

joncfoo [5:53 PM]
Ah ok, thats ok then I think. I didn’t realise that the requirement wasn’t necessary if you don’t attempt to use it

monoidmusician [5:53 PM]
lift2 (<>) / pure mempty is the “default” instance for applicatives

jkachmar [10:05 AM]
It’s especially useful if you want to foldMap over validations

jkachmar [10:06 ]
If I’m just applying a set of rules and not transforming the input, I’ll sometimes make the result type Unit and then foldMap to run everything