所以基本上如果我在 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) 100
和 100 |> 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/