Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#库中是否存在tee函数?_F# - Fatal编程技术网

F#库中是否存在tee函数?

F#库中是否存在tee函数?,f#,F#,…还是在FSX中 let tee sideEffect = fun x -> do sideEffect x x 用法可能类似于 f >> tee (printfn "F returned: %A") >> g >> h 还是有其他简单的方法可以做到这一点 谢谢 我见过的最近的一次是在。定义是: let inline ( |>! ) x sideEffect = do sideEffect x

…还是在FSX中

let tee sideEffect =
    fun x ->
        do sideEffect x
        x
用法可能类似于

f >> tee (printfn "F returned: %A") >> g >> h
还是有其他简单的方法可以做到这一点


谢谢

我见过的最近的一次是在。定义是:

let inline ( |>! ) x sideEffect =
    do sideEffect x
    x
用法:

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

据我所知,像这样的函数在F#core库中的任何地方都没有定义-尽管库中缺少许多很容易定义的标准函数,所以我的建议是将其添加到项目中的某个地方-您的
tee
似乎是最好的方法

也就是说,如果我需要副作用,我可能更喜欢使用较少的陈述式风格,并写一些类似于:

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

这只是风格的问题,但对于完全声明性代码,我更喜欢声明性风格,而对于涉及副作用的命令式风格,我更喜欢。另外,使用局部变量可以使调试更容易。但是使用像
tee
这样的函数也是F#社区中许多人喜欢的一个同样好的选择。

ExtCore包含一个名为的函数,它完全满足您的需要。我主要使用它来检查F#“管道”(因此得名)中的中间值

例如:

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

我同意你的观点,陈述式和祈使式应该分开。我的用法是在调试过程中,当我需要轻松地查看合成链中的中间结果时。我不太喜欢操作符。如果|>!是定义的,那么我希望>>!也有待定义。为什么不呢!当然它在WebSharper中的用途是将事件处理程序附加到DOM DSL元素。(翻译成JavaScript)检查问题。它在很大程度上与您的相关,只是您需要一个函数,而不是运算符。就个人而言,我建议使用
|>运算符。