了解 F# 组合运算符

问题描述 投票:0回答:2

我精通 F# 中使用

>>
<<
运算符。然而,在查看 F# 源代码以建立更深入的理解后,我对此感到困惑:

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

我如何从概念上解释这些表达式?另外,你会如何描述这些表达方式?他们定义了一种类型吗?

f# pointfree function-composition
2个回答
7
投票

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

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 -> )
噪音。


4
投票

正如 F# 函数的 msdn 页面所说,

F# 中的函数可以由其他函数组成。两个函数

function1
function2
的组合是继
function1
应用之后又一个代表
function2
应用的函数。

可以认为与管道运算符类似,只是不指定最后/最深的参数;例如以下两行是等效的:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.