Eta-conversión para funciones
Muchas gracias a Laikoni por este consejo en una de mis soluciones .
Considere una función para, por ejemplo, sumar una cadena con 3 para letras mayúsculas y 1 para todos los demás caracteres. Entonces:
let counter input = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1) input
Mediante eta-conversion, esto puede reescribirse como:
let counter = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
y llamado de la misma manera que antes:
counter "Hello world!" |> printfn "%i"
La función operador de composición directa >>
Ahora suponga que nuestro desafío original sería sumar una cadena con 3 para letras mayúsculas y 1 para letras minúsculas, y todos los demás caracteres están excluidos.
Podríamos escribir esto como:
let counter input = Seq.filter Char.IsLetter input |> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
Podemos usar el operador de composición directa ( >>
) para encadenar las dos funciones ( Seq.filter
y Seq.sumBy
) juntas. Con eta-conversion la definición de la función sería:
let counter = Seq.filter Char.IsLetter >> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
Chris Smith hizo una gran reseña sobre el >>
operador en su blog de MSDN .