Eta-conversão para funções
Muito obrigado a Laikoni por esta dica em uma das minhas soluções .
Considere uma função para, digamos, somar uma sequência com 3 para letras maiúsculas e 1 para todos os outros caracteres. Tão:
let counter input = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1) input
Por conversão eta, isso pode ser reescrito como:
let counter = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
e chamado da mesma maneira que antes:
counter "Hello world!" |> printfn "%i"
O operador de composição direta da função >>
Agora, suponha que nosso desafio original seria somar uma sequência com 3 para letras maiúsculas e 1 para letras minúsculas, e todos os outros caracteres são excluídos.
Podemos escrever isso como:
let counter input = Seq.filter Char.IsLetter input |> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
Podemos usar o operador de composição direta ( >>
) para encadear as duas funções ( Seq.filter
e Seq.sumBy
) juntas. Com a conversão eta, a definição da função se tornaria:
let counter = Seq.filter Char.IsLetter >> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
Chris Smith fez um ótimo artigo sobre o >>
operador em seu blog do MSDN .