我看到你可以强制使用单案例区分联合的构造函数,你可以对多案例做同样的事情吗?
例如
type MemberId =
| MemberId of int
| MemberGuid of Guid
我目前正在尝试fsi
这样
val create : int -> T option
val create : Guid -> T option
但我猜像 C#,F# 不允许你根据返回类型重载展开:
val value : T -> string
编辑 - - - - - - - -
MemberId.fsi =
module MemberId
open System
type _T
val createId : int -> _T option
val createGuid : Guid -> _T option
val value : _T -> 'a
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
似乎很接近,但解包器无法编译,我似乎无法弄清楚如何编写它
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'
| _ -> ()