У меня есть записи типов
type tradeLeg = {
id : int ;
tradeId : int ;
legActivity : LegActivityType ;
actedOn : DateTime ;
estimates : legComponents ;
entryType : ShareOrDollarBased ;
confirmedPrice: DollarsPerShare option;
actuals : legComponents option ;
type trade = {
id : int ;
securityId : int ;
ricCode : string ;
tradeActivity : TradeType ;
enteredOn : DateTime ;
closedOn : DateTime ;
tradeLegs : tradeLeg list ;
}
Очевидно, что tradeLegs - это тип сделки. Нога может быть решена или неурегулирована (или неурегулирована, но подтверждена цена) - таким образом, я определил активный шаблон:
let (|LegIsSettled|LegIsConfirmed|LegIsUnsettled|) (l: tradeLeg) =
if Helper.exists l.actuals then LegIsSettled
elif Helper.exists l.confirmedPrice then LegIsConfirmed
else LegIsUnsettled
а затем определить, разрешена ли сделка (на основе всех ног, соответствующих шаблону LegIsSettled:
let (|TradeIsSettled|TradeIsUnsettled|) (t: trade) =
if List.exists (
fun l ->
match l with
| LegIsSettled -> false
| _ -> true) t.tradeLegs then TradeIsSettled
else TradeIsUnsettled
Я могу видеть некоторые преимущества этого использования активных шаблонов, однако я бы подумал, что есть более эффективный способ увидеть, соответствует ли какой-либо элемент списка (или не соответствует) шаблону actie без необходимости писать лямбда выражение специально для него и использование List.exist.
Вопрос два раза:
- есть ли более сжатый способ выразить это?
-
Есть ли способ абстрагировать функциональность/выражение
(fun l -> match l with | LegIsSettled -> false | _ -> true)
Таким образом,
let itemMatchesPattern pattern item =
match item with
| pattern -> true
| _ -> false
такой я мог бы написать (поскольку я повторно использую этот шаблон дизайна):
let curriedItemMatchesPattern = itemMatchesPattern LegIsSettled
if List.exists curriedItemMatchesPattern t.tradeLegs then TradeIsSettled
else TradeIsUnsettled
Мысли?