......还是FSharpx?
let tee sideEffect =
fun x ->
do sideEffect x
x
用法可能类似
f >> tee (printfn "F returned: %A") >> g >> h
或者还有另一种简单的方法吗?
谢谢!
答案 0 :(得分:5)
我见过的最接近的是WebSharper。定义是:
let inline ( |>! ) x sideEffect =
do sideEffect x
x
用法:
(x |>! printf "%A") |> nextFunc
答案 1 :(得分:3)
ExtCore包含一个名为tap
的函数,可以完全按照您的要求执行。我主要用它来检查F#“管道”中的中间值(因此得名)。
例如:
[| 1;2;3 |]
|> Array.map (fun x -> x * 2)
|> tap (fun arr ->
printfn "The mapped array values are: %A" arr)
|> doOtherStuffWithArray
答案 2 :(得分:2)
据我所知,这个函数并没有在F#核心库的任何地方定义 - 虽然库缺少很多很容易自己定义的标准函数,所以我的建议只是添加在你项目的某个地方 - 你的tee
似乎是最好的方式。
那就是说,如果我需要副作用并写下类似的内容,我可能更喜欢使用较少的声明式样式:
let fResult = f fInput
printfn "F returned: %A" fResult
fResult |> g |> h
这只是一种风格问题,但是当涉及副作用时,我更喜欢完全声明性代码的声明式样式和命令式样式。作为奖励,使用局部变量可以使调试更容易。但是使用像tee
这样的函数是F#社区中很多人都喜欢的同样好的选择。