我正在阅读 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# 环境中如何工作吗?
谢谢, 此致, 汤姆。
最佳答案
在某些方面,管道技术并没有什么特别之处;而不是写f (g (h x))
,你可以写x |> h |> g |> f
,这看起来并不是一个明显的改进。不过,有两点值得牢记:
- 有时,对于管道版本来说,读取顺序更好:“将 x 发送到 h,将结果发送到 g,将结果发送到 f”比“将 f 应用于应用 g 的结果”更容易理解将 h 应用于 x"的结果。
- 对于管道版本,类型推断通常效果更好。这可能是 F# 中大量使用流水线的最大原因。由于类型推断从左到右进行,
x |> Array.map (fun s -> s.Length)
当 x 是string[]
时有效,但是Array.map (fun s -> s.Length) x
惯于;你需要做Array.map (fun (s:string) -> s.Length) x
相反。
关于f# - 在 F# 中,流水线意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2177110/