Tôi nghĩ rằng câu trả lời từ @kvb bao gồm đủ deta ils lý do tại sao bạn có thể sử dụng các mẫu trong các đối số của fun
. Đây không phải là một tính năng đặc biệt - trong F #, bạn có thể sử dụng các mẫu ở bất kỳ nơi nào bạn có thể liên kết một biến. Để hiển thị một số ví dụ bởi @kvb trong những bối cảnh khác:
// When declaring normal functions
let foo [it] = it // Return the value from a singleton list
let fst (a, b) = a // Return first element of a pair
// When assigning value to a pattern using let
let [it] = list
let (a, b) = pair
Tương tự như vậy, bạn có thể sử dụng các mẫu khi viết fun
. Cấu trúc match
mạnh hơn một chút vì bạn có thể chỉ định nhiều mệnh đề.
Hiện tại, các mẫu hoạt động không thực sự huyền diệu. Chúng chỉ là những chức năng bình thường với những cái tên đặc biệt. Trình biên dịch tìm kiếm các mẫu hoạt động trong phạm vi khi nó tìm thấy một mẫu có tên. Ví dụ, mô hình bạn đang sử dụng chỉ là một chức năng:
val (|KeyValue|) : KeyValuePair<'a,'b> -> 'a * 'b
Các mô hình hóa một đối tượng KevValuePair
thành F # tuple bình thường mà sau đó được kết hợp bởi một mô hình lồng nhau (k, v)
(mà gán các yếu tố đầu tiên để k
và thứ hai đến v
). Trình biên dịch về cơ bản dịch mã của bạn thành:
myDictionary |> Seq.iter (fun _arg0 ->
let _arg1 = (|KeyValue|) _arg0
let (k, v) = _arg1
doSomething k v)
Nguồn
2012-11-27 18:43:25
Cảm ơn, đây là một công cụ mở mắt, kvb! Tôi chắc chắn sẽ phải giữ ví dụ cuối cùng trong tâm trí, đặc biệt. – MiloDC