purescript-prelude
purescript-prelude copied to clipboard
Split Semiring into Semiring and Dioid
From @mikesol in Discord:
Would it make sense to revamp
Semiring
so that it had only the operatorsadd
andmul
and then useDioid
forzero
andone
? There is some precedent for that: https://en.m.wikipedia.org/wiki/Semiring. It would create a nice symmetry between semigroup/monoid/group and semiring/dioid/ring. It'd be a breaking change for folks usingzero
andone
, but otherwise I think it wouldn't be too disruptive. Also, it would allow for the generalization of semiring to an analogous biproduct class, which now isn't possible becausezero
andone
necessarily leave out all but one of the types in the biproduct or biCCC class. Thoughts?
See also https://encyclopediaofmath.org/wiki/Idempotent_semi-ring, which is where they redirect from dioid.
Idempotent semi-ring is the wrong concept. We don't want something that requires idempotence.
@MonoidMusician, in general, does the idea seem interesting, or do you see any pitfalls in there?
I'd want to see a use-case for the extra generality before making a breaking change. I personally don't have use for it.
The thought came up when I was working on a shader compiler for WebGPU.
WebGPU shaders have tons of overloaded primitive operations, for example multiplying a vector by a float. That expressivity is really nice when writing shaders and is industry-standard stuff: it gets unergonomic if you can't do that because of how often you're doing vector and matrix transforms.
Obviously, mul a b
in PureScript will fail if a
is a Number
and b
is a Vec3 Number
. But, I could use a custom Prelude with:
class Bisemiring a b c | a b -> c where
add :: a -> b -> c
mul :: a -> b -> c
instance Bisemiring Number (Vec3 Number) (Vec3 Number) where...
instance Bisemiring (Vec3 Number) Number (Vec3 Number) where...
instance Bisemiring (Vec3 Number) (Vec3 Number) (Vec3 Number) where...
instance Bisemiring Number Number Number where...
Without Dioid
, it gets klunky to define one
and zero
. If Dioid
existed separately, I could just import it and use the one
and zero
instances from that, but now I have to import Semiring
, hide add
and mul
, etc.
It's a minor nit, but hopefully you can see the line of thinking that got me there.