在Scala中阅读有关for comprehensions的信息时,由于.net的linq引起了deja vu的影响。
它们都允许简明的序列定义。

现在-问题是如何使用for comprehension简洁地表示分组?

更加具体。在C#中:

from entry in new[] {
    new { Name="Joe", ShoeSize="23" },
    new { Name="Alice", ShoeSize="23" },
    new { Name="Mary", ShoeSize="17" },
    new { Name="Yeti", ShoeSize="170" },
}
group entry by entry.ShoeSize into grouped
select grouped;


产生:

Key=23, Items=(Joe, Alice)
Key=17, Items=(Mary)
Key=170, Items=(Yeti)


如何使用Scala for comprehensions简洁地实现相同目标?

最佳答案

Scala的理解能力没有分组能力。它只是mapflatMapfilter(实际上是withFilter,但filter更容易理解)或foreachfilter的组合。

它们背后的原理并没有完全不同,但是LINQ是在SQL之后建模的,而理解是在monadic转换之后建模的。例如,您的示例可能会使用以下内容进行建模以进行理解:

for {
    (shoeSize, groups) <- entry groupBy (_.shoeSize)
    names = for (group <- groups) yield group.name
    grouped = (shoeSize, names)
}
yield grouped


我希望LINQ可以做几乎相同的事情,但是因为预期,它会将这些转换包括在其基本语法中。

10-06 11:35