Como posso impor a criação de um valor de União Discriminada por meio de uma função dedicada?

Como posso impor a criação de um valor de União Discriminada por meio de uma função dedicada?

Intenção:

Eu quero confiar nos padrões criacionais para produzir estruturas que tenham apenas dados válidos.

Portanto, acredito que precisarei restringir o uso de um valor de DU, tornando-o somente leitura. No entanto, não é óbvio para mim como fazer isso.

module File1 =

    type EmailAddress = 
        | Valid   of string 
        | Invalid of string

    let createEmailAddress (address:System.String) =
        if address.Length > 0
        then Valid    address 
        else Invalid  address

module File2 =

    open File1

    let validEmail = Valid "" // Shouldn't be allowed

    let isValid = createEmailAddress ""

    let result = match isValid with
                 | Valid x -> true
                 | _       -> false

Eu tentei o seguinte:

type EmailAddress =
    private
    | Valid   of string 
    | Invalid of string

No entanto, definir o tipo de DU como privado interrompe a capacidade de executar a correspondência de padrões no resultado da função de criação.

questionAnswers(4)

yourAnswerToTheQuestion