Haskell——标签集分区用什么?

发布于 2024-11-26 05:16:12 字数 462 浏览 0 评论 0 原文

初学者问题——您通常使用什么作为多重地图?我想要一个带有标签函数并按每个标签对元素进行分区的函数。例如,

f x | x `mod` 2 == 0 = EVEN
    | otherwise = ODD

partition f lst 的输出,其中 lst :: [Int] 会很

EVEN --> [list of even numbers]
ODD --> [sublist of odd numbers]

抱歉打扰,我在 Hoogle 上找不到类似的东西。我想我可以通过 Data.List.Keygroup 函数、sort 和一些映射来到达那里,但必须有一个更简单的方法怎么样,不是吗?这似乎是一个普遍有用的功能。

Beginner question -- what do you usually use as a multimap? I want a function that takes a labelling function and partitions elements by each label. For example,

f x | x `mod` 2 == 0 = EVEN
    | otherwise = ODD

the output of partition f lst where lst :: [Int] would be

EVEN --> [list of even numbers]
ODD --> [sublist of odd numbers]

Sorry for the bother, I could not find something similar on Hoogle. I think I can get there via Data.List.Key's group function, sort, and some mapping, but there must be a simpler way, no? This seems like a generally useful function.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

独行侠 2024-12-03 05:16:12

当只有两种情况时,您可以将它们映射为布尔值并使用 Data.List.partition

Prelude Data.List> partition odd [1, 23, 42, 7, 1337, 8]
([1,23,7,1337],[42,8])

在一般情况下,您可以使用 Data.Map 使用列表或设置作为值类型。您可以使用 < 轻松构建一个代码>Data.Map.fromListWith

Prelude Data.Map> let partition f xs = fromListWith (++) [(f x, [x]) | x <- xs]
Prelude Data.Map> partition (`mod` 3) [1, 23, 42, 7, 1337, 8]
fromList [(0,[42]),(1,[7,1]),(2,[8,1337,23])]

When there are only two cases, you can map them to booleans and use Data.List.partition.

Prelude Data.List> partition odd [1, 23, 42, 7, 1337, 8]
([1,23,7,1337],[42,8])

In the general case, you can use a Data.Map with a list or set as the value type. You can build one easily using Data.Map.fromListWith.

Prelude Data.Map> let partition f xs = fromListWith (++) [(f x, [x]) | x <- xs]
Prelude Data.Map> partition (`mod` 3) [1, 23, 42, 7, 1337, 8]
fromList [(0,[42]),(1,[7,1]),(2,[8,1337,23])]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文