The monoid instance for
[a] is left-biased. One way to demonstrate what I'm aiming at is with the following two definitions:
good ∷ Applicative f ⇒ Semigroup (f ()) ⇒ f () good = pure () <> good bad ∷ Applicative f ⇒ Semigroup (f ()) ⇒ f () bad = bad <> pure ()
Here we can see that
good @ is productive whereas
bad @ diverges. The same issue can have similar consequences for performance (runtime and memory usage). So my question is, is there a general guideline for whether I should design my semigroup to be left- or right biased? I'd argue that similar things should be taken into consideration when writing/using
Foldables. Perhaps this is the reason that both
foldr are instance methods?
(This is a bit opinion based, but I will answer anyway)
Other things being equal, I would make it left-biased.
I'm suggesting that only because there already are left-biased monoids (
[a]), and I can't think of any existing right-biased ones. (Well, snoc-lists, but these are far less common.)
Further, left-to-right is a common order for "effects" like non-termination, or applicatives/monads. I would argue that most programmers are already used to such order of effect-sequencing.