【问题标题】:Iterate over a MultiSet迭代 MultiSet
【发布时间】:2021-12-08 22:46:55
【问题描述】:

这个问题与 Data.MultiSet 类型有关,https://hackage.haskell.org/package/multiset-0.3.4.3/docs/Data-MultiSet.html 我想迭代给定的 MultiSet 以创建一个新的 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 的 Multiset 映射到大小为 x>n 的 Multiset。

如何使用 Data.MultiSet 来实现?

【问题讨论】:

  • 你说的是hackage.haskell.org/package/multiset-0.3.4.3/docs/…吗?请始终在问题中明确说明此类内容。此外,还不清楚这个问题到底在问什么。
  • 是的,我正在谈论这个,Data.MultiSet
  • :[a] 的数据构造函数,而不是用于检索可迭代值的下一项的通用语法。

标签: haskell


【解决方案1】:

与列表类似,多重集提供concatMap 函数。

concatMap :: Ord b => (a -> [b]) -> MultiSet a -> MultiSet b

concatMap 是您的通用“对数据结构的每个元素执行某些操作,并且某些操作可能会产生零个或多个结果”的操作。

concatMap (\x -> if check x then [oneElement] else [firstElement, secondElement]) myMultiSet

请注意,concatMap 只是一元绑定运算符>>=(事实上,它列表上的那个),但MultiSet可以'不是一个 monad,因为它只有在底层类型是 Ord 时才能正常工作

【讨论】:

    猜你喜欢
    • 2021-06-01
    • 2016-05-22
    • 2019-04-09
    • 2014-03-25
    • 2021-12-01
    • 2021-03-01
    • 1970-01-01
    • 2022-01-22
    • 2015-08-01
    相关资源
    最近更新 更多