我精通 F# 中使用
>>
和 <<
运算符。然而,在查看 F# 源代码以建立更深入的理解后,我对此感到困惑:
let inline (>>) f g x = g(f x)
let inline (<<) f g x = f(g x)
我如何从概念上解释这些表达式?另外,你会如何描述这些表达方式?他们定义了一种类型吗?
我认为描述它的最好方法是用一个例子,因为看定义可能有点令人困惑。假设你有这个:
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 -> )
噪音。