.net - 如何为在列表上执行的一组操作正确地内联 F# 函数?

标签 .net f#

所以基本上如果我在 F# 中有一个简单的列表

let ls = [3; 9; 2; 15; 3]

我想 sortDescending 然后取 3。我可以做这个链接:
let orderList ls = List.sortDescending ls
let take3 ls = List.take(3) ls
let main ls = (orderList >> take3) ls

这工作得很好,并且在使用 F# 交互式调试器时可以满足我的需求。但我试图在所有一个表达式中内联执行它,而不是正确使用语法。有可能吗,我只是没有得到语法。
let main2 ls = List.sortDescending >> List.take(3) ls

我正在摆脱更多面向对象的思维方式,在 C# 中我可以这样做:
var ls = new List<int>{ 3, 9, 2, 15, 3 };
var subset = ls.OrderByDescending(x => x).Take(3).ToList();

我只是期待你可以像流畅的语法 INLINE 一样链接 continue,但似乎我缺少语法或没有得到简单的东西。我最近才在学习 F#,但到目前为止我一直在挖掘它。我只是很难理解一些事物被链接在一起的方式。

最佳答案

>>运算符接受两个函数并生成一个函数,该函数是这两个函数的组合。
|>运算符接受一个值和一个函数并将该值传递给该函数,从而产生另一个值。

假设我们有

let addone x = x + 1
let double x = x * 2

然后(addone >> double) 100100 |> addone |> double都是 202。你明白为什么吗?确保这很清楚。

像这样想他们。 f >> g是组成:
let compose f g =
  fun x -> g (f x)

所以
(addone >> double) 100

是相同的
(fun x -> double ( addone x ) ) 100

这与
double (addone 100)

x |> f是管道:
let pipe x f = f x

所以
100 |> addone |> double

是相同的
(addone 100) |> double

是相同的
double (addone 100)

在 C# 中,将扩展方法链接在一起的业务基本上是管道运算符:
customers.Take(100).ToList()

是相同的
Enumerable.ToList(Enumerable.Take(customers, 100))

关于.net - 如何为在列表上执行的一组操作正确地内联 F# 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40028832/

相关文章:

c# - 命令行编译器在特定项目中停止工作

c# - 取消任务时不执行延续任务

c# - IComparable 和 IComparable<T>

c# - Blob 检测中的大位图图像内存分配,C# .Net

F# 查找列表中值的出现次数

winforms - 在 F# 中绘制 Windows 窗体

.net - 收集和传达编译器错误的方法有哪些

c# - 在 Win7 中刷新 Windows 资源管理器

f# - fsharp 编译器是否将冗余函数组合减少为空操作?

f# - 如何在可观察对象之间创建依赖关系?