这个问题涉及到Data.MultiSet类型,https://hackage.haskell.org/package/multiset-0.3.4.3/docs/Data-MultiSet.html我想在给定的MultiSet上迭代以创建一个新的MultiSet。对于MultiSet中的每个元素,要么在新的多集中创建一个元素,要么在新的MultiSet中创建两个新元素。我认为可以使用尾递归来实现这一点,但是我认为不可能使用MultiSet。
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实现这一点?
发布于 2021-12-08 14:46:55
与列表类似,多集提供了一个concatMap函数。
concatMap :: Ord b => (a -> [b]) -> MultiSet a -> MultiSet bconcatMap是您的通用用途“对数据结构的每个元素做一些事情,并且某些东西可能产生零或更多的结果”操作。
concatMap (\x -> if check x then [oneElement] else [firstElement, secondElement]) myMultiSet请注意,concatMap只是一元绑定操作符>>= (实际上,它确实是列表上的),但是MultiSet不能是monad,因为只有当底层类型是Ord时,它才能正确地工作。
https://stackoverflow.com/questions/70276808
复制相似问题