【发布时间】:2011-06-03 17:37:39
【问题描述】:
这是一个很简单的问题,但我没有找到答案:
F# 中是否有任何 Seq/List 操作来匹配 LINQ SelectMany?
- 我知道如果我可以在 F# 中使用 System.Linq 想要。
- 我知道我可以做一个递归方法 并使用 F# 计算表达式 (并制造更强大的东西)。
但如果我试图证明 F# List 操作比 LINQ 更强大...
- .Where = List.filter
- .Select = List.map
- .Aggregate = List.fold
- ...
在 C# 中,SelectMany 的使用语法非常简单:
var flattenedList = from i in items1
from j in items2
select ...
有没有简单的直接匹配,List.flatten,List.bind 之类的?
SelectMany 有几个签名,但最复杂的似乎是:
IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(
this IEnumerable<TSource> source,
Func<TSource, IEnumerable<TCollection>> collectionSelector,
Func<TSource, TCollection, TResult> resultSelector
);
在 F# 术语中,这将是:
('a -> 'b list) -> ('a -> 'b -> 'c) -> 'a list -> 'c list
【问题讨论】:
-
您如何证明 F# 列表比 C# 列表更强大?如果是哪个功能更多的问题,那并没有表现出更强大,只是更臃肿。您是否想通过使用列表来证明您可以在 F# 中做一些您在 C# 中无法做到的事情?