fsharp.org icon indicating copy to clipboard operation
fsharp.org copied to clipboard

F# Spec doesn't mention private representation Discriminated unions

Open ovatsus opened this issue 11 years ago • 3 comments

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

ovatsus avatar Oct 14 '14 21:10 ovatsus

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.

Rickasaurus avatar Oct 14 '14 21:10 Rickasaurus

Actually, the case constructor is only available inside the current project, not outside, so this seem like a bug

ovatsus avatar Oct 14 '14 22:10 ovatsus

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

dsyme avatar Oct 15 '14 11:10 dsyme