← Back to context

Comment by SideburnsOfDoom

9 hours ago

It's very unclear which you mean by that.

To me that "compiler-verified" maps to "sealed", not "on the fly". Probably.

Their example is:

public union Pet(Cat, Dog, Bird);

Pet pet = new Cat("Whiskers");

- the union type is declared upfront, as is usually the case in c#. And the types that it contains are a fixed set in that declaration. Meaning "sealed" ?

OK then, what is the opposite of this, the adhoc union?

  • I don’t know for sure, but I’m guessing something like

    (Dog, Cat) pet = new Cat();

    So without defining the union with an explicit name beforehand.

    • Well, you can do this in c#:

        var someUser = new { Name = "SideburnsOfDoom", CommentValue = 3 };
      
      

      What type is `someUser` ? Not one that you can reference by name in code, it is "anonymous" in that regard. But the compiler knows the type.

      A type can be given at compile-time in a declaration, or generated at compile-time by the compiler like this. But it is still "Compiler-verified" and not ad-hoc or at runtime.

      the type (Dog, Cat) pet seems similar, it's known at compile-time and won't change. A type without a usable name is still a type.

      Is this "ad-hoc"? It depends entirely on what you mean by that.

I mean that Cat, Dog and Bird don't have to inherit from the union, you can declare a union of completely random types, as opposed to saying "Animal has three subtypes, no more, no less", which is what F# does more or less.