有时我必须写:
myList |> List.iter (fun x -> x)
我真的想避开括号。在Haskell中有一个运算符($)
看起来像这样
myList |> List.iter $ fun x -> x
我创建了一个自定义运算符
let inline (^!) f a = f a
现在我可以像这样写
myList |> List.iter ^! fun x -> x
F#中有这样的东西吗?
答案 0 :(得分:7)
无法在F#中使用明确指定的关联性定义自定义运算符 - 关联性是根据构成运算符的符号确定的(您可以在MSDN documentation for operators中找到它。)
在这种情况下,F#没有任何内置运算符可以让你避免使用括号,而惯用的方法是在你最初编写代码时用括号编写代码:
myList |> List.iter (fun x -> x)
如果你来自Haskell,这种风格是不同的,但是我没有看到编写括号的任何真正的缺点 - 在写F#一段时间之后你会习惯的风格问题。如果你想避免使用括号(例如写一个漂亮的DSL),那么你总是可以命名函数并编写如下内容:
myList |> List.iter id
(我知道你的例子只是一个例子,所以id
对你的实际用例不起作用,但如果能使代码更具可读性,你总能定义自己的函数。)
答案 1 :(得分:7)
不,在标准的F#库中没有这样的东西。但是,您几乎已经创建了自己的运算符(通过确定其名称必须以^
开头)。
(^<|)
。
let inline (^<|) f a = f a
链接页面中的这个单行演示了如何使用它:
{1..10} |> Seq.map ^<| fun x -> x + 3
以下是如何将其用于多行功能的示例。我发现它对于真实世界的多线程最有用,因为你不再需要在最后保持右括号:
myList
|> List.map
^<| fun x ->
let ...
returnValue
答案 2 :(得分:0)
F#
<|
所以它看起来像:
myList |> List.iter <| fun x -> x