4

I am well-versed in using the >> and << operators in F#. However, after looking in the F# source to establish a deeper understanding I became confused with this:

let inline (>>) f g x = g(f x)
let inline (<<) f g x = f(g x)

How do I interpret these expressions conceptually? Also, how would you describe these expressions? Are they defining a type?

4

2 回答 2

5

我认为描述它的最好方法是用一个例子,因为看定义可能会有点混乱。假设你有这个:

let isEven x = x % 2 = 0
[1 .. 99] |> List.filter (fun x -> not (isEven x))

使用组合运算符,您可以将其重写为以下之一:

[1 .. 99] |> List.filter (isEven >> not)
[1 .. 99] |> List.filter (not << isEven)

更一般地说,如果你有这样的事情:

data |> a |> b |> c

你可以像这样重写它:

data |> (a >> b >> c)

并解释a >> b >> c做 a,然后做 b,然后做 c。如果您更喜欢更传统的反向排序:

(a (b (c data)))

您可以将其重写为

((a << b << c) data)

这也称为无点样式。在正常情况下,它可能比使用普通样式更难阅读,但是当传递给高阶函数时,它可能更容易阅读,因为您避免了添加(fun x -> )噪音。

于 2013-08-01T10:45:20.513 回答
2

正如F# 函数的 msdn 页面所说,“F# 中的函数可以由其他函数组合而成。两个函数 function1 和 function2 的组合是另一个函数,代表 function1 在 function2 的应用之后的应用。”

可以认为它类似于管道运算符,只是没有指定最后/最深的参数;例如以下两行是等价的:

let composed = f >> g
let piped x = g <| f x

另请参阅问题以获取更多信息。

于 2013-07-31T22:59:47.290 回答