Ета-перетворення для функцій
Велике спасибі Лайконі за цю пораду в одному з моїх рішень .
Розглянемо функцію, скажімо, підсумовувати рядок з 3 для великих літер та 1 для всіх інших символів. Так:
let counter input = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1) input
За допомогою ета-перетворення це можна переписати як:
let counter = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
і називається так само, як і раніше:
counter "Hello world!" |> printfn "%i"
Функція оператора прямого складу >>
Тепер припустимо, що нашим початковим завданням було б скласти рядок з 3 для великих літер та 1 для малих літер, а всі інші символи виключені.
Ми можемо написати це так:
let counter input = Seq.filter Char.IsLetter input |> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
Ми можемо використовувати оператор прямої композиції ( >>
) для з'єднання двох функцій ( Seq.filter
і Seq.sumBy
) разом. З ета-перетворенням визначення функції стане:
let counter = Seq.filter Char.IsLetter >> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
Кріс Сміт чудово написав >>
оператора на своєму блозі MSDN .