2014-10-31 17 views
8

... veya FSharpx'de mi?F # kütüphanesinde bir yerde bir fonksiyon var mı?

let tee sideEffect = 
    fun x -> 
     do sideEffect x 
     x 

kullanım

f >> tee (printfn "F returned: %A") >> g >> h 

Veya bunu yapmanın başka basit bir yolu yoktur gibi bir şey olabilir mi?

Teşekkürler!

+0

Giriş [Bu] (http://stackoverflow.com/questions/17109624/built-in-f-operator-to-compose-functions-with-the-same-: Örneğin

giriş-ama-farklı-çıkış) soru. Bir işleve değil, bir operatöre ihtiyaç duymanız dışında, büyük ölçüde sizinkilerle ilgilidir. Şahsen, buradaki kabul edilen cevaptaki örneğe benzer iş akışları için '|>!' Operatörünü kullanmanızı öneriyorum. – bytebuster

cevap

3

ExtCore, tam olarak istediğiniz şeyi yapan tap adlı bir işlev içerir. Öncelikle bir F # "boruhattı" içindeki ara değerleri kontrol etmek için kullanıyorum (dolayısıyla isim).

[| 1;2;3 |] 
|> Array.map (fun x -> x * 2) 
|> tap (fun arr -> 
    printfn "The mapped array values are: %A" arr) 
|> doOtherStuffWithArray 
5

Gördüğüm en yakın değer aslında WebSharper. tanımı şöyledir:

let inline (|>!) x sideEffect = 
    do sideEffect x 
    x 

Kullanımı:

(x |>! printf "%A") |> nextFunc 
+1

Operatörlerin büyük bir hayranı değilim. Ayrıca eğer |>! tanımlanırsa beklerim >>! tanımlı olmak. Ve neden olmasın! <| ve! << Böylece dağınık olmaya başlar. Bu yüzden isimlendirilmiş fonksiyona sahip olmayı tercih ederim. Ama bağlantı için teşekkürler! – vidi

+0

Elbette! WebSharper'da kullanmak, olay işleyicilerini DOM DSL Elemanlarına eklemektir. (Javascript'e çevrilir.) –

2

Bildiğim kadarıyla böyle bir fonksiyon F # çekirdek kitaplığında yerde tanımlanmamış bildiği gibi - kütüphanesi birçok standart fonksiyonları eksik olsa o Kendinizi tanımlamak oldukça kolay, bu yüzden benim önerim sadece projenize bir yer eklemek olurdu - sizin için tee gitmek için en iyi yol gibi görünüyor.

Ben yan etkileri ihtiyaç ve böyle bir şey yazarsam muhtemelen daha az bildirime stilini kullanmayı tercih ediyorum, dedi ki: Bu sadece stil meselesi

let fResult = f fInput 
printfn "F returned: %A" fResult 
fResult |> g |> h 

ama tamamen bildirime için bildirim tarzını tercih yan etkileri olduğunda kod ve emir stili. Bonus olarak, yerel değişkenleri kullanmak hata ayıklamayı kolaylaştırır. Ancak, tee gibi bir işlev kullanmak, F # topluluğundaki pek çok kişinin tercih edeceği iyi bir alternatiftir.

+0

Beyannamenin ve zorunluluğun ayrılması gerektiği konusunda size katılıyorum. Kullanımım, ara sonuçların bir bileşim zincirine kolayca göz atmam gerektiğinde, hata ayıklama sırasında kullanımımdır. – vidi

İlgili konular