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
我可以看到這種使用活動模式的一些優點,但我認爲有一種更有效的方法來查看列表中的任何項目是否匹配(或不)沒有寫入的行爲模式一個專門用於它的lambda表達式,並使用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
想法?
+1:coolness!我不知道你可以將'(| Odd | _ |)'作爲一個值傳遞給函數:) – Juliet 2010-04-19 23:40:05
我很驚訝,當我發現這是可能的。實際上,活動模式有點像運營商。通過運算符,可以聲明'let(++)a b = a + b'並使用它們'List.map(++)'。使用活動模式:'let(| Xyz | _ |)a = None'和'List.map(| Xyz | _ |)'(名稱中的空格實際上也是允許的!) – 2010-04-19 23:45:14
謝謝。我原本是將它寫成標準功能(儘管不那麼雄辯),並且開始用主動模式來玩弄*解鎖他們的力量。好的信息在那裏 - 再次感謝你 – akaphenom 2010-04-20 00:07:49