F# Spec doesn't mention private representation Discriminated unions
For example, in this type:
type HtmlAttribute =
private | HtmlAttribute of name:string * value:string
What's the effect that private should have? I see that in C# projects, I no longer have the NewHtmlAttribute constructor, but I can keep doing pattern matching and create new values with HtmlAttribute("a", "b") in F#. Is that the intended behaviour? I was expecting to not be able to create new values using the union case constructor, and force people to use a static method that normalizes the arguments
Just thinking out loud, it would be nice if we could expose an API over DUs for consumption from C# so that if we want to change the representation somehow (like support for GADTs) it wouldn't be as much of an issue.
Actually, the case constructor is only available inside the current project, not outside, so this seem like a bug
The meaning is "private to the enclosing module or namespace fragment and internal to the assembly". So this correctly gives an error:
module M =
type HtmlAttribute =
private | HtmlAttribute of name:string * value:string
let x = M.HtmlAttribute("","")
let f x =
match x with
| M.HtmlAttribute(a,b) -> a + b