你能封装多案例歧视联盟吗?

Mas*_*low 1 f# discriminated-union

我看到你可以强制使用单个案例区分联合的构造函数,你可以用多案例做同样的事吗?

例如

type MemberId = 
  | MemberId of int
  | MemberGuid of Guid
Run Code Online (Sandbox Code Playgroud)

我现在正在尝试fsi这样的

val create : int -> T option
val create : Guid -> T option
Run Code Online (Sandbox Code Playgroud)

但我猜是像C#,F#将不允许你根据返回类型重载以进行解包:

val value : T -> string
Run Code Online (Sandbox Code Playgroud)

编辑---------------

MemberId.fsi =

module MemberId
open System
type _T

val createId : int -> _T option
val createGuid : Guid -> _T option

val value : _T -> 'a
Run Code Online (Sandbox Code Playgroud)

MemberId.fs =

module MemberId
open System
type _T = 
    | Id of int
    | MemberGuid of Guid

let createId id = match id with
                | x when x>0 -> Some(Id(id))
                | _ -> None
let createGuid guid = Some(MemberGuid( guid))

let value (e:_T):int = e
Run Code Online (Sandbox Code Playgroud)

看起来非常接近,但是unwrapper没有编译,我似乎无法弄清楚如何编写它

TestConsumer MemberIdClient.fs =

module MemberIdClient
open System
open MemberId

let address1 = MemberId.create(-1)
let address2 = MemberId.create(Guid.Empty)

let unwrapped1 = 
  match address1 with
  | MemberId x -> () // compilation error on 'MemberId x'
  | _ -> ()
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 5

函数不能重载,但方法可以:

type MemberId = 
    private
    | MemberId of int
    | MemberGuid of Guid

    static member create id = MemberId id
    static member create guid = MemberGuid guid
Run Code Online (Sandbox Code Playgroud)