Эта-конвертация для функций
Большое спасибо Лайкони за этот совет в одном из моих решений .
Рассмотрим функцию, скажем, для суммирования строки с 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
) вместе. С eta-преобразованием определение функции стало бы:
let counter = Seq.filter Char.IsLetter >> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
Крис Смит написал отличную статью об >>
операторе в своем блоге MSDN .