管道,组合和卷曲

时间:2012-04-10 15:00:13

标签: f# functional-programming

在我看来,所有这些都是相关的。有什么区别?

2 个答案:

答案 0 :(得分:48)

  • 管道用于对某些值执行一系列操作(就像Unix中的管道一样)。每个函数的输入是前一个函数的输出。显然,这需要每个函数只需一个arg。

  • 组合(<< / >>)的类似之处在于它按顺序调用两个函数(即,第一个的输出是第二个的输入),但它返回一个函数而不是立即调用序列。

  • Currying通过将 N -1 args 1应用于 N args

  • 的函数来创建新函数

因此,组合和currying用于创建函数,而管道用于调用。组合和currying在创建新函数的方式上有所不同(通过应用args vs chaining)。

答案 1 :(得分:32)

除了Daniel写的内容之外,管道(|><|运算符)与函数组合(>><<运算符之间存在非常密切的对应关系)。

当您使用管道将一些数据传递给一系列函数时:

nums |> Seq.filter isOdd
     |> Seq.map square
     |> Seq.sum

...那么这相当于将输入传递给使用函数组合获得的函数:

let composed = 
     Seq.filter isOdd
  >> Seq.map square
  >> Seq.sum

composed nums

实际上,这通常意味着您可以使用函数组合替换在参数上使用管道的函数声明(并使用函数可用作值的事实)。这是一个例子:

// Explicit function declaration
foo (fun x -> x |> bar |> goo)

// Equivalent using function composition
foo (bar >> goo)