首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MultiSet上迭代

在MultiSet上迭代
EN

Stack Overflow用户
提问于 2021-12-08 14:39:06
回答 1查看 65关注 0票数 1

这个问题涉及到Data.MultiSet类型,https://hackage.haskell.org/package/multiset-0.3.4.3/docs/Data-MultiSet.html我想在给定的MultiSet上迭代以创建一个新的MultiSet。对于MultiSet中的每个元素,要么在新的多集中创建一个元素,要么在新的MultiSet中创建两个新元素。我认为可以使用尾递归来实现这一点,但是我认为不可能使用MultiSet。

代码语言:javascript
复制
tailRecursion :: (Multiset String) -> (MultiSet String)
tailRecursion (x:xs) = do 
  -- if check x then (add one element tailRecursion xs) else (add two elements to the MultiSet tailRecursion xs)

我正在考虑使用map来完成这个任务,但是,不可能(据我理解)将大小n的多个集合映射到多个大小集( x>n )。

如何用Data.MultiSet实现这一点?

EN

回答 1

Stack Overflow用户

发布于 2021-12-08 14:46:55

与列表类似,多集提供了一个concatMap函数。

代码语言:javascript
复制
concatMap :: Ord b => (a -> [b]) -> MultiSet a -> MultiSet b

concatMap是您的通用用途“对数据结构的每个元素做一些事情,并且某些东西可能产生零或更多的结果”操作。

代码语言:javascript
复制
concatMap (\x -> if check x then [oneElement] else [firstElement, secondElement]) myMultiSet

请注意,concatMap只是一元绑定操作符>>= (实际上,它确实是列表上的),但是MultiSet不能是monad,因为只有当底层类型是Ord时,它才能正确地工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70276808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档