你可以在没有签名文件的情况下打开被歧视的联盟吗?

时间:2014-06-18 19:06:46

标签: f# discriminated-union

Designing with Single-Type-Case DUs 给出

type DoB = | DoB of System.DateTime

let DoB (dt:DateTime) = // shadow constructor
    if(dt.Year>1914) // business defines what a min Date of Birth should be
    then Some(DoB dt) 
    else None

我通过Answers看到wrapping Multi-case DU's你可以很容易地在没有.fsi文件的情况下进行构造函数遮蔽。

通过展开我的意思是文章中的let value (EmailAddress e):string = e(必须在.fsi文件中或应用于此DoB类型看起来像 let value (DoB dob):DateTime = dob如果我们有.fsi个文件。

你能以某种方式对构造函数进行解包吗?

我可以以某种方式定义某种解包器或某种扩充吗?

1 个答案:

答案 0 :(得分:4)

如果我通过展开了解你的意思,你可以使用活动模式:

//File1.fs
let (|DoB|) (DoB dt) = dt

//File2.fs
let dob = DoB DateTime.Now //using `DoB` "constructor" function
match dob with
| Some (DoB dt) -> //using `DoB` active pattern
    printfn "DOB: %A" dt 
| None -> 
    printfn "Not a DOB"

这可以在不影响同名功能的情况下工作,因为活动模式存在于单独的命名范围内。