有时我不得不写:
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#里有这样的东西吗?
在F#中没有办法定义具有明确指定的关联性的自定义运算符-关联性是根据构成运算符的符号来确定的(您可以在MSDN文档中找到它)。
在这种情况下,F#没有任何内置的运算符可以让你避免使用括号,惯用的方法是按照你最初写代码的方式写代码,使用括号:
myList |> List.iter (fun x -> x)
如果你来自Haskell,这就是风格上的差异,但我看不出写括号有任何真正的缺点——这只是写F#一段时间后你会习惯的风格问题。如果你想避免括号(例如写一个漂亮的DSL),那么你总是可以命名函数并写一些类似的东西:
myList |> List.iter id
(我知道您的示例实际上只是一个示例,所以id
不适用于您的真实用例,但如果这样可以使代码更可读,那么您总是可以定义自己的函数)。
不,在标准F#库中没有这样的库。然而,您几乎已经创建了自己的运算符(通过计算其名称必须以^
开头)。
Stephen Swensen的这段代码演示了一个高优先级、右关联后向管道、(^<|)
。
let inline (^<|) f a = f a
链接页面中的这一行演示了如何使用它:
{1..10} |> Seq.map ^<| fun x -> x + 3
下面是一个如何将它用于多行函数的示例。我发现它对现实世界中的多行程序最有用,因为您不再需要在末尾保留右括号:
myList
|> List.map
^<| fun x ->
let ...
returnValue
在F#
中是<|
所以它看起来像:
myList |> List.iter <| fun x -> x