Tôi muốn thêm một giải pháp làm việc với các trích dẫn cho mọi trường hợp công đoàn, dựa trên một giải pháp được cung cấp. Ở đây nó đi:
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."
Được xác định theo cách này, isUnionCase hoạt động như desco đã hiển thị, nhưng ngay cả trên trường hợp công đoàn trống hoặc có nhiều giá trị. Bạn cũng có thể nhập một tuple các trường hợp nghiệp đoàn được phân cách bằng dấu phẩy. Hãy xem xét điều này:
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"
Đầu tiên làUnionCase tôi chỉ cung cấp để kiểm tra trường hợp đơn. Sau đó tôi đã thêm kiểm tra biểu thức cho NewTuple và nghĩ rằng bạn có thể thích nó. Chỉ cần chắc chắn rằng nếu bạn thay đổi mã các precomputations vẫn hoạt động, đây là lý do tại sao iucs
được định nghĩa bên ngoài hàm trả về vô danh.
Nguồn
2012-08-03 15:34:17
(hơi OT) Điều này nhắc tôi, thời gian cao mà [làm nổi bật mã được hỗ trợ cho F #] (http://meta.stackexchange.com/questions/58934/hight-time-for-code-highlighting-f-snippets) (!) – Abel
Xem http://meta.stackexchange.com/questions/981/syntax-highlighting-hints không có đánh dấu ngôn ngữ cụ thể trên SO. – Brian