Scala的函数列表中有一个函数groupBy
,它接受一个从列表项中提取关键字的函数,并返回另一个列表,其中的项目是由关键字和产生该关键字的项目列表组成的元组。换句话说,这样的事情:Haskell相当于Scala的组合
List(1,2,3,4,5,6,7,8,9).groupBy(_ % 2)
// List((0, List(2,4,6,8)), (1, List(1,3,5,7,9)))
(事实上,它看起来像在当前版本中,它提供了一个Map
代替,但是这并不重要)。 C#有一个更有用的版本,可以让你同时映射这些值(如果你的关键函数只是提取元组的一部分,非常有用)。
Haskell有一个groupBy
,但它有些不同 - 它根据一些比较函数对事情进行分组。
在我写和写之前,Haskell中是否有相当于Scala的groupBy
? Hoogle没有任何我期望的签名看起来像(下面),但我可能刚刚弄错了。
Eq b => (a -> b) -> [a] -> [(b,[a])]
我对此进行了一些修改,使C#选项可以在同一时间对值应用一个函数:'myGroupBy fg xs = map (f。head &&& g)。 groupBy((==)\'on \'f)。 sortBy(比较\'f)$ xs' – Impredicative 2013-03-15 10:53:52
@Impredicative:这看起来非常有用! – 2013-03-15 10:58:30
@Impredicative:'myCSharpGroupby f g xs = map(second g)$ myGroupBy f xs'也可以工作 – cheecheeo 2013-03-22 06:28:56