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
个文件。
你能以某种方式对构造函数进行解包吗?
我可以以某种方式定义某种解包器或某种扩充吗?
答案 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"
这可以在不影响同名功能的情况下工作,因为活动模式存在于单独的命名范围内。