F#中的右关联运算符

Mai*_*ein 4 f#

有时我必须写:

myList |> List.iter (fun x -> x)
Run Code Online (Sandbox Code Playgroud)

我真的想避开括号.在Haskell中有一个运算符($)

它看起来像这样

myList |> List.iter $ fun x -> x
Run Code Online (Sandbox Code Playgroud)

我创建了一个自定义运算符

let inline (^!) f a = f a
Run Code Online (Sandbox Code Playgroud)

现在我可以像这样写

myList |> List.iter ^! fun x -> x
Run Code Online (Sandbox Code Playgroud)

F#中有这样的东西吗?

Tom*_*cek 7

在F#中无法定义具有明确指定关联性的自定义运算符 - 关联性是根据构成运算符的符号确定的(您可以在运算符MSDN文档中找到它).

在这种情况下,F#没有任何内置运算符可以让你避免使用括号,而惯用的方法是在你最初编写代码时用括号编写代码:

myList |> List.iter (fun x -> x)
Run Code Online (Sandbox Code Playgroud)

如果你来自Haskell,这种风格是不同的,但是我没有看到编写括号的任何真正的缺点 - 在写F#一段时间后你会习惯这样的风格问题.如果你想避免使用括号(例如写一个漂亮的DSL),那么你总是可以命名函数并编写如下内容:

myList |> List.iter id
Run Code Online (Sandbox Code Playgroud)

(我知道你的例子实际上只是一个例子,所以id不适用于你的实际用例,但如果能使代码更具可读性,你总能定义自己的函数).


byt*_*ter 7

不,在标准的F#库中没有这样的东西.但是,您几乎已经创建了自己的运算符(通过确定其名称必须以^)开头.

该片段斯蒂芬·斯文森演示了一个高优先级,右结合的落后管,(^<|).

let inline (^<|) f a = f a
Run Code Online (Sandbox Code Playgroud)

链接页面中的这个单线程演示了如何使用它:

{1..10} |> Seq.map ^<| fun x -> x + 3
Run Code Online (Sandbox Code Playgroud)

以下是如何将其用于多线功能的示例.我发现它对于真实世界的多线程最有用,因为你不再需要在最后保持右括号:

myList
|> List.map
    ^<| fun x ->
        let ...
        returnValue
Run Code Online (Sandbox Code Playgroud)