在F#中,流水线是什么意思?

t0m*_*13b 8 f# functional-programming

我正在阅读Tomas Petricek撰写的这篇文章,它提到了|>如下例子中的流水线:

> let nums = [1; 2; 3; 4; 5];;
val nums : list<int>

> let odds_plus_ten = 
        nums
        |> List.filter (fun n-> n%2 <> 0)
        |> List.map (add 10)
val odds_plus_ten : list<int> = [11; 13; 15];;

流水线是什么意思?最初,我认为它类似于在内核中流水线化的CPU指令.你能解释它是什么以及它如何在F#的背景下起作用?

谢谢,最好的问候,汤姆.

kvb*_*kvb 15

在某些方面,流水线没有什么特别之处; 而不是写作f (g (h x)),你可以写x |> h |> g |> f,这似乎不是一个明显的改进.但是,有两点值得记住:

  1. 有时读取顺序对于流水线版本更好:"取x并将其发送到h,将结果发送到g,将结果发送到f"比"将f应用于结果g应用于结果"更容易理解将h应用于x".
  2. 对于流水线版本,类型推断通常效果更好.这可能是F#中使用流水线的最大原因.由于类型推断从左到右进行,x |> Array.map (fun s -> s.Length)当x是a时会起作用string[],但是Array.map (fun s -> s.Length) x不会; 你需要做的Array.map (fun (s:string) -> s.Length) x.


Ste*_*eve 11

流水线操作意味着将一个函数的结果传递给另一个函数.在示例中,您将"nums"传递给List.Filter,然后将过滤后的结果传递给List.Map.

更多信息:http://msdn.microsoft.com/en-us/magazine/cc164244.aspx#S6