如何在列表中执行的一组操作中正确链接F#函数?

dja*_*azz 4 .net f#

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

let ls = [3; 9; 2; 15; 3]
Run Code Online (Sandbox Code Playgroud)

我想sortDescending然后采取3.我可以做这个链接:

let orderList ls = List.sortDescending ls
let take3 ls = List.take(3) ls
let main ls = (orderList >> take3) ls
Run Code Online (Sandbox Code Playgroud)

这很好用,在使用F#Interactive调试器时可以满足我的需求.但我试图在所有一个表达式中内联,而不是正确的语法.是否可能,我只是没有得到语法.

let main2 ls = List.sortDescending >> List.take(3) ls
Run Code Online (Sandbox Code Playgroud)

我正在从更多的面向对象心态转向C#我可以做到这一点:

var ls = new List<int>{ 3, 9, 2, 15, 3 };
var subset = ls.OrderByDescending(x => x).Take(3).ToList();
Run Code Online (Sandbox Code Playgroud)

我只是期待你可以像流畅的语法INLINE一样继续链接,但看起来我缺少语法或者没有简单的东西.我最近才学习F#,但到目前为止我都在挖掘它.我只是很难将某些东西链接在一起.

Eri*_*ert 15

>>运算符采用两个功能,并产生一个函数,该函数的这两个函数组成.

|>操作者需要一个值和功能与值传递给函数,产生另一个值.

假设我们有

let addone x = x + 1
let double x = x * 2
Run Code Online (Sandbox Code Playgroud)

然后,(addone >> double) 100100 |> addone |> double都是202你知道为什么吗?确保这一点很清楚.

想想他们是这样的. f >> g是组成:

let compose f g =
  fun x -> g (f x)
Run Code Online (Sandbox Code Playgroud)

所以

(addone >> double) 100
Run Code Online (Sandbox Code Playgroud)

是相同的

(fun x -> double ( addone x ) ) 100
Run Code Online (Sandbox Code Playgroud)

哪个是一样的

double (addone 100)
Run Code Online (Sandbox Code Playgroud)

虽然x |> f是管:

let pipe x f = f x
Run Code Online (Sandbox Code Playgroud)

所以

100 |> addone |> double
Run Code Online (Sandbox Code Playgroud)

是相同的

(addone 100) |> double
Run Code Online (Sandbox Code Playgroud)

是相同的

double (addone 100)
Run Code Online (Sandbox Code Playgroud)

在C#中,将扩展方法链接在一起的业务基本上是管道操作符:

customers.Take(100).ToList()
Run Code Online (Sandbox Code Playgroud)

是相同的

Enumerable.ToList(Enumerable.Take(customers, 100))
Run Code Online (Sandbox Code Playgroud)