Можете ли вы распаковать дискриминированные союзы без файла подписи?

Проектирование с единичными типами DU

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

И я вижу через ответы на упаковку Multi-case DU, вы можете сделать конструктор затенения без .fsi подать очень легко.

Я имею в виду распаковку let value (EmailAddress e):string = e из статьи (которая должна быть в .fsi файл или применяется к этому DoB Тип будет выглядеть let value (DoB dob):DateTime = dob если бы у нас был .fsi файл.

Можете ли вы сделать то же самое для развертывания, что было сделано с помощью конструктора?

могу ли я как-то определить развёртку или какое-то дополнение?

1 ответ

Решение

Если я понимаю, что вы подразумеваете под развертыванием, вы можете использовать активный шаблон:

//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"

Это работает без дублирования функции с тем же именем, потому что активные шаблоны находятся в отдельной области именования.

Другие вопросы по тегам