19

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

4

2 回答 2

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

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

  • Currying 通过将 1 到N -1 args 应用于 N args 的函数来创建一个新函数

因此,组合和柯里化用于创建函数,而管道用于调用。组合和柯里化在创建新函数的方式上有所不同(通过应用 args 与链接)。

于 2012-04-10T15:54:07.647 回答
37

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

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

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)
于 2012-04-10T21:04:19.643 回答