2012-09-01 20 views
25

aşağıdaki tek vaka ayrımcılık birliği olduğunu varsayalım F # birliği ayrımcılık. Ayıklamak için bulduğum yol:Özlü desen maç

Bunu yapmanın daha kısa bir yolu var mı?

benim kullanımı özel bir durumudur ve maç yapmak amacıyla mantıklı olduğunu anladığından emin gibi bir şey yapmanın bir yolu varsa sadece merak, olanakları ele aldık:

let OrderId id = orderId 

cevap

37

You' Neredeyse orada. Parantez derleyici yorumladığı sırayla gereklidir bir izin bağlı desen eşleştirme olarak: Bir işlevin bir parametredir

let (OrderId id) = orderId 

orderId, ayrıca doğrudan oraya eşleşen deseni kullanabilirsiniz:

let extractId (OrderId id) = id 
18

zaman

type OrderId = 
    | OrderId of string 
    member x.Value = let (OrderId v) = x in v 
: Eğer o zaman değerini erişmek için bir özelliğiyle tanımlamak için mantıklı olabilir, (yararlı bir F # programlama tekniğidir) tek bir değeri tutmak için bir ayrımcılık birliği kullanıyorsanız

Value'un uygulanması, ped ile gönderilen let kullanarak desen eşleştirmesini kullanıyor. Eğer tip OrderId değeri orderId varsa Şimdi, sadece yazabilirsiniz:

let id = orderId.Value 

Ancak (OrderId id) hala oldukça yararlıdır kullanarak eşleştirme desen, derleyici zaten türünü bilir ne zaman mülkiyet erişimi sadece çalışacaktır çünkü orderId (bu nedenle, genellikle işlev argümanında şablon eşleştirmesi kullanırsınız, ancak diğer değerler için özellik erişimi).