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)
函数不能重载,但方法可以:
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)
| 归档时间: |
|
| 查看次数: |
410 次 |
| 最近记录: |