voglio aggiungere un altro soluzione che funziona con le quotazioni per ogni caso sindacale, in base a quello desco fornito. Qui si va:
open Microsoft.FSharp.Quotations.Patterns
open Microsoft.FSharp.Reflection
let rec isUnionCase = function
| Lambda (_, expr) | Let (_, _, expr) -> isUnionCase expr
| NewTuple exprs ->
let iucs = List.map isUnionCase exprs
fun value -> List.exists ((|>) value) iucs
| NewUnionCase (uci, _) ->
let utr = FSharpValue.PreComputeUnionTagReader uci.DeclaringType
box >> utr >> (=) uci.Tag
| _ -> failwith "Expression is no union case."
Definito in questo modo, isUnionCase funziona come desco ha dimostrato, ma anche su casi sindacali che sono vuoti o hanno più di un valore. Puoi anche inserire una tupla di casi di unione separati da virgola. Considera questo:
type SomeType =
| SomeCase1
| SomeCase2 of int
| SomeCase3 of int * int
| SomeCase4 of int * int * int
| SomeCase5 of int * int * int * int
let list =
[
SomeCase1
SomeCase2 1
SomeCase3 (2, 3)
SomeCase4 (4, 5, 6)
SomeCase5 (7, 8, 9, 10)
]
list
|> List.filter (isUnionCase <@ SomeCase4 @>)
|> printfn "Matching SomeCase4: %A"
list
|> List.filter (isUnionCase <@ SomeCase3, SomeCase4 @>)
|> printfn "Matching SomeCase3 & SomeCase4: %A"
Il primo isUnionCase che ho fornito ha funzionato solo per i singoli casi. In seguito ho aggiunto l'espressione check per NewTuple e ho pensato che ti sarebbe piaciuto. Assicurati che se modifichi il codice, le precomputazioni funzionano ancora, questo è il motivo per cui iucs
è definito al di fuori della funzione anonima restituita.
fonte
2012-08-03 15:34:17
(leggermente OT) Questo mi ricorda, molto tempo che [l'evidenziazione del codice è supportata per F #] (http://meta.stackexchange.com/questions/58934/hight-time-for-code-highlighting-f-snippets) (!) – Abel
Vedere http://meta.stackexchange.com/questions/981/syntax-highlighting-hints su SO non è presente un'evidenziazione specifica della lingua. – Brian