Hacker News new | ask | show | jobs
by randomdata 844 days ago
> Go has constants

That's literally what enums are: A set of named constants.

You might be thinking of what is traditionally known as sum types, which some people have recently started calling enums[1]. Indeed, Go does not have sum types.

[1] Presumably because of Rust using the wrong term when specifying its sum types

2 comments

is there any further information on why Rust and other recent languages have started using `enum` to refer to sum types? I don't use Rust or TypeScript (edit: apparently TS doesn't have this, my memory is bad) or any of those languages and it's been very strange to see this redefinition occur
Maybe to appeal to C and C++ developers. Rust makes its syntax superficially similar to C/C++ syntax in many other ways: pointer/reference syntax, declaration of "struct" types, generic types using <T>, curly brace block structure, and the naming conventions enforced by their lints. To be fair, many of these traits of C and C++ are also copied by other programming languages (e.g. curly braces). But they could have gone in a different direction and had pointer and record syntax more like Pascal, or made a syntax more like OCaml, Standard ML, or Haskell.
I think it might be due to the O'Caml influence on early Rust. They call them enums there[0].

[0] https://www.ocamlwiki.com/index.php?title=Enums_in_OCaml

They are called variants in OCaml (and inductive data types in Roqc).

But way more important: this OCaml wiki is an AI generated mess full of, well, bullshit. https://discuss.ocaml.org/t/whats-up-with-ocamlwiki/13605

Ah, I see. That's sad :(

... and now that you mention it, I do remember the variants terminology, esp. around the polymorphic variants feature. It's been 20+ years since I used OCaml, I'm afraid...

My best guess is Java.

Edit: I guess if you've never seen that this is, uh, controversial. Or something. Anyway, Java enums are full-strength classes, look at the planet example here https://docs.oracle.com/javase/tutorial/java/javaOO/enum.htm...

This is more like a Rust enum than a C one, I think you'll find.

Typescript has actual enums. They behave just like Go's (for better or worse).

It's not clear why Rust got confused.

yep, sorry about that, I misremembered TypeScript as having the same "kind of enums" as Rust.
TypeScript has discriminated unions if that's what you were thinking of

https://www.typescriptlang.org/docs/handbook/2/narrowing.htm...

The article is about enums, which are lacking in Go.
No, Go definitely has enums. It is sum types (that some people have recently started calling enums) that Go lacks.
Go does not model enums as separate types (like e.g. Pascal), they are essentially just integers like C.
No, Go enums are definitely separate types. Sure, technically there is also an integer (or some other base representation) hidden in there somewhere, but that's what an enumeration is. Without that you don't have an enum.
Creating new types wrapping int is not really the same thing. It's not a closed set. Presumably one could define additional overlapping constants with the same integer type elsewhere?
Go types do not support value constraints, no. That has nothing to do with enums, though. That's a different feature altogether.