F#中的右关联运算符

  • 本文关键字:关联 运算符 f#
  • 更新时间 :
  • 英文 :


有时我不得不写:

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

最新更新