f# - 在 F# 中,流水线意味着什么?

标签 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# 环境中如何工作吗?

谢谢, 此致, 汤姆。

最佳答案

在某些方面,管道技术并没有什么特别之处;而不是写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 是 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/

相关文章:

list - Scala插入列表中的特定位置

f# - 我的 rec 函数是尾递归的吗?

lambda - Simply Scheme 第 09 章。Lambda。还有更多的 Lambda 练习吗?

programming-languages - 在方案或一般情况下使用的 'thunk' 是什么?

java - 使用流、无映射、无键值对计算和打印文本中的字符频率

c++ - "Deep"使用模板元编程在 C++ 中进行函数柯里化(Currying)

f# - 内联时扩展方法出错

f# - 如何解构构造函数参数?

f# - 纯模式匹配

f# - extern 访问修饰符不起作用