加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Haskell相当于Scala的groupBy

发布时间:2020-12-16 09:39:12 所属栏目:安全 来源:网络整理
导读:Scala在列表中具有一个功能组,该列表接受从列表项中提取密钥的功能,并返回另一个列表,其中项目是由密钥和产生该密钥的项目列表组成的元组。换句话说,这样的东西: List(1,2,3,4,5,6,7,8,9).groupBy(_ % 2)// List((0,List(2,8)),(1,List(1,9))) (实际上
Scala在列表中具有一个功能组,该列表接受从列表项中提取密钥的功能,并返回另一个列表,其中项目是由密钥和产生该密钥的项目列表组成的元组。换句话说,这样的东西:

List(1,2,3,4,5,6,7,8,9).groupBy(_ % 2)
// List((0,List(2,8)),(1,List(1,9)))

(实际上,它看起来像在当前的版本,它提供了一个地图,但这并不重要)。 C#有一个更有用的版本,可以让你同时映射值(非常有用的,如果说,你的键功能只是提取一部分元组)。

Haskell有一个groupBy,但它有些不同 – 它根据一些比较功能对事物进行分组。

在我去写下之前,哈斯克尔有没有相当于Scala的groupBy? Hoogle没有什么可以预期的签名看起来像(下),但我可能只是错了。

Eq b => (a -> b) -> [a] -> [(b,[a])]

解决方法

你可以很容易地编写函数,但是如果你想要一个有效的解决方案,你需要对分类器函数的结果放置一个Ord或Hashable约束。例:

import Control.Arrow ((&&&))
import Data.List
import Data.Function

myGroupBy :: (Ord b) => (a -> b) -> [a] -> [(b,[a])]
myGroupBy f = map (f . head &&& id)
                   . groupBy ((==) `on` f)
                   . sortBy (compare `on` f)

> myGroupBy (`mod` 2) [1..9]
[(0,[2,8]),[1,9])]

您也可以使用像Data.HashMap.Strict这样的哈希映射,而不是按预期的线性时间进行排序。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读