fsharp / fsharp.org

The F# Software Foundation website
https://fsharp.org
291 stars 276 forks source link

F# Spec doesn't mention private representation Discriminated unions #321

Open ovatsus opened 10 years ago

ovatsus commented 10 years ago

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

Rickasaurus commented 10 years ago

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.

ovatsus commented 10 years ago

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

dsyme commented 10 years ago

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