F#中的右关联运算符

时间:2014-01-12 20:56:04

标签: 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#中有这样的东西吗?

3 个答案:

答案 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#库中没有这样的东西。但是,您几乎已经创建了自己的运算符(通过确定其名称必须以^开头)。

This snippet之前的{p> Stephen Swensen演示了高优先级,右关联反向管道(^<|)

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