2014-10-31 18 views
8

... lub w FSharpx?czy funkcja tee istnieje gdzieś w bibliotece F #?

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

Wykorzystanie może być coś podobnego

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

Lub czy istnieje inny prosty sposób to zrobić?

dziękuję!

+0

wyboru [to], (http://stackoverflow.com/questions/17109624/built-in-f-operator-to-compose-functions-with-the-same- input-but-different-outp) pytanie. Jest w dużej mierze spokrewniony z twoim, z wyjątkiem tego, że potrzebujesz funkcji, a nie operatora. Osobiście sugerowałbym użycie operatora '|>!' Dla przepływów pracy podobnych do przykładu w zaakceptowanej odpowiedzi tam. – bytebuster

Odpowiedz

3

ExtCore zawiera funkcję o nazwie tap, która wykonuje dokładnie to, co chcesz. Używam go przede wszystkim do sprawdzania wartości pośrednich w obrębie potoku F # "(stąd nazwa).

Na przykład:

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

Najbliższe, jakie widziałem, to w rzeczywistości WebSharper. Definicja brzmi:

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

Zastosowanie:

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

Nie jestem wielkim fanem operatorów. Także jeśli |>! jest zdefiniowany wtedy oczekiwałbym >>! również być zdefiniowanym. A dlaczego nie! <| i! < vidi

+0

Pewnie! Jego użycie w WebSharper polega na dołączaniu procedur obsługi zdarzeń do DOM DSL Elements. (Które zostaną przetłumaczone na JavaScript.) –

2

O ile mi wiadomo, to funkcja tak nie jest nigdzie zdefiniowane w F # podstawowej bibliotece - choć biblioteka brakuje wiele standardowych funkcji, które są dość łatwe do zdefiniowania, więc moim zaleceniem byłoby dodanie go gdzieś w twoim projekcie - Twój tee wydaje się najlepszym sposobem.

Powiedział, że pewnie wolą używać mniej deklaratywny styl czy muszę skutków ubocznych i napisać coś takiego:

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

To tylko kwestia stylu, ale wolę styl deklaratywny całkowicie deklaratywny kod i obowiązkowy styl w przypadku wystąpienia efektów ubocznych. Jako bonus, używanie lokalnych zmiennych ułatwia debugowanie. Ale używanie funkcji takiej jak tee jest równie dobrą alternatywą, którą wolałby wielu ludzi ze społeczności F #.

+0

Zgadzam się z tobą, że deklaratywna i imperatywna powinna być oddzielona. Moje użycie jest podczas debugowania, kiedy muszę z łatwością przeglądać wyniki pośrednie w łańcuchu kompozycji. – vidi

Powiązane problemy