FWIW you can model a sum as a product plus a tag. That is, you can implement
Maybe[T] = None | Some T match m { case None: // do thing case Some v: // do thing with v } as type Maybe[T any] struct { Case int // 0 or 1 None struct{} Some T } switch m.Case { case 0: // do thing case 1: v := m.Some // do thing with v } This seems fairly straight forward, and it would work fine with interfaces. It's not an incredibly efficient implementation. But (especially if we allow reordering of struct fields, which I believe is something the Go team is considering) the compiler can always pack things more efficiently. On Tue, 2 Sept 2025 at 13:12, Axel Wagner <axel.wagner...@googlemail.com> wrote: > On Tue, 2 Sept 2025 at 12:56, Cliff <cliff.programs.sou...@gmail.com> > wrote: > >> From an implementation, language theory, and sanity point of view: >> putting non-concrete types in a sum type won't work. If the design >> principles of go demand interfaces in sum types, they will never be >> workable. > > > Why not? In a union they don't work, but in a sum I can't see a reason why > they wouldn't work. If I'm overlooking something, I'd be super interested > (I intend to give a talk on this topic soon, so I would want to avoid being > wrong). > > Have you seen https://github.com/golang/go/issues/54685 ? It has a very > well-worked design for how sum types could work in Go. I have not found a > problem with it and it doesn't preclude using interfaces. > > >> The one 'escape hatch' for this I could see is using bounded interfaces >> where you limit the concrete types that can have that interface and then >> use those. >> >> >> type example interface (typea | typeb) { >> area() float64 >> perim() float64 >> } >> >> You could use an interface like that in a sum type because it is >> explicitly bounded, but I think it's an ugly concept that is only necessary >> if you want to wedge an open-set behavioral contract concept into a closed >> set identity concept. A concept and syntax similar to this explanation (in >> support of generics) https://go.dev/blog/intro-generics would be >> necessary. >> >> it is my opinion that sum types are low-hanging fruit that demand no >> change if implemented without interfaces. They remain as complicated and >> disruptive as the team has maintained if you do. There is huge value in a >> small language and using extension budget for a feature like this this is a >> social/value judgement that has technical impacts. >> >> *tldr; Sum types are trivial if you don't allow behavioral contracts or >> anonymous types in. Sum types are doable if you allow type restrictions on >> interfaces. Sum types are not doable without a) compromise or b) change.* >> >> Thanks for looking y'all - seriously - this was a design exercise for me >> - and it helped me understand the go-team's perspective. >> >> On Tuesday, September 2, 2025 at 5:04:36 AM UTC-4 Axel Wagner wrote: >> >>> I should proof-read *before* hitting send: >>> >>> On Tue, 2 Sept 2025 at 11:00, Axel Wagner <axel.wa...@googlemail.com> >>> wrote: >>> >>>> It seems most likely (based on statements by the Go team) that we would >>>> not want to add a new concept that has this much semantic overlap with >>>> `interface{ a | b | c }`. But if we did that, the result would lack most of >>>> the power people want from it. >>>> >>> >>> To clarify: by "if we did that" I mean "reuse `interface{ a | b | c }`", >>> not "add a new concept". >>> >> -- >> You received this message because you are subscribed to the Google Groups >> "golang-nuts" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to golang-nuts+unsubscr...@googlegroups.com. >> To view this discussion visit >> https://groups.google.com/d/msgid/golang-nuts/f9d02f5d-0fd2-41ef-8882-89aa49cf602an%40googlegroups.com >> <https://groups.google.com/d/msgid/golang-nuts/f9d02f5d-0fd2-41ef-8882-89aa49cf602an%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/golang-nuts/CAEkBMfFOEiA92Oe1_0t-_dA6hJacPFBxsX%3DpQGCKqkYB4Hj0dg%40mail.gmail.com.