İşlevler için eta dönüştürme
Çözümlerimden birinde bu ipucu için Laikoni'ye teşekkür ederim .
Örneğin, büyük harfler için 3, diğer tüm karakterler için 1 ile bir dize toplamı için bir işlev düşünün. Yani:
let counter input = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1) input
By eta-dönüşüm bu şekilde yeniden yazılabilir:
let counter = Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
ve daha önce olduğu gibi çağrıldı:
counter "Hello world!" |> printfn "%i"
Fonksiyon ileri kompozisyon operatörü >>
Şimdi, asıl meselemizin, büyük harfler için 3, küçük harfler için 1 ve diğer tüm karakterler hariç tutulacağı bir dize toplamak olduğunu varsayalım.
Bunu şu şekilde yazabiliriz:
let counter input = Seq.filter Char.IsLetter input |> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
>>
İki işlevi ( Seq.filter
ve Seq.sumBy
) bir araya getirmek için ileri kompozisyon operatörünü ( ) kullanabiliriz . Eta dönüşümü ile işlev tanımı şöyle olacaktır:
let counter = Seq.filter Char.IsLetter >> Seq.sumBy (fun x -> if Char.IsUpper x then 3 else 1)
Chris Smith, >>
operatöre MSDN blogunda harika bir yazı yazdı .