有时我必须写:
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#中有这样的东西吗?
在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不适用于你的实际用例,但如果能使代码更具可读性,你总能定义自己的函数).
不,在标准的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)