Chuyển đổi Eta cho các chức năng
Rất cám ơn Laikoni cho mẹo này trong một trong những giải pháp của tôi .
Hãy xem xét một hàm để, tổng hợp một chuỗi có 3 cho chữ in hoa và 1 cho tất cả các ký tự khác. Vì thế:
let counter input = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1) input
Bằng cách chuyển đổi eta, điều này có thể được viết lại thành:
let counter = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
và được gọi theo cùng một cách như trước đây:
counter "Hello world!" |> printfn "%i"
Hàm toán tử chuyển tiếp thành phần >>
Bây giờ, giả sử thử thách ban đầu của chúng tôi là tổng hợp một chuỗi có 3 chữ cái in hoa và 1 cho chữ cái viết thường và tất cả các ký tự khác đều bị loại trừ.
Chúng tôi có thể viết điều này như:
let counter input = Seq.filter Char.IsLetter input |> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
Chúng ta có thể sử dụng toán tử chuyển tiếp thành phần ( >>
) để xâu chuỗi hai hàm ( Seq.filter
và Seq.sumBy
) lại với nhau. Với chuyển đổi eta, định nghĩa hàm sẽ trở thành:
let counter = Seq.filter Char.IsLetter >> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
Chris Smith đã viết một bài tuyệt vời về >>
nhà điều hành trên blog MSDN của mình .