F#:用管道对括号调用函数是一种惯用的方法吗?

Rom*_*hin 1 f#

如果具有以下功能:

let test arg func =
    func arg
Run Code Online (Sandbox Code Playgroud)

它是使用管道调用的惯用方式,

test 1 <| fun n -> n = 2
Run Code Online (Sandbox Code Playgroud)

而不是用括号来称呼它?

test 1 (fun n -> n = 2)
Run Code Online (Sandbox Code Playgroud)

而且什么时候不应该以这种方式使用管道?

Mar*_*ann 5

tl; dr

我认为这很好:

test 1 (fun n -> n = 2)
Run Code Online (Sandbox Code Playgroud)

由于参数的顺序,它可能无法很好地组合在一起,因此下面将介绍更多详细信息。这些是您可以根据需要使用的选项。

细节

我认为将test函数的参数翻转过来会更惯用:

let test' func arg = func arg
Run Code Online (Sandbox Code Playgroud)

因为这将使您可以编写以下表达式:

1 |> test' (fun n -> n = 2)
Run Code Online (Sandbox Code Playgroud)

如果您无法更改的签名test,则可以引入一个flip函数

let flip f x y = f y x
Run Code Online (Sandbox Code Playgroud)

该函数翻转函数的参数,以便您可以编写以下代码:

1 |> (flip test) (fun n -> n = 2)
Run Code Online (Sandbox Code Playgroud)

在此处给出的示例中,这使事情变得比必须的复杂,因此我很可能更喜欢原始建议之一:

test 1 (fun n -> n = 2)
Run Code Online (Sandbox Code Playgroud)

就个人而言,我发现它比倒退管道更容易理解,这总是让我感到困惑。

顺便说一句,您可以减少此特定示例中的功能:

test 1 ((=) 2)
Run Code Online (Sandbox Code Playgroud)