在F#库的某个地方是否存在T恤功能?

时间:2014-10-31 10:07:48

标签: f#

......还是FSharpx?

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

用法可能类似

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

或者还有另一种简单的方法吗?

谢谢!

3 个答案:

答案 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#社区中很多人都喜欢的同样好的选择。