【问题标题】:Cut list before last element that is equal to parameter等于参数的最后一个元素之前的切割列表
【发布时间】:2021-04-22 22:00:05
【问题描述】:

我需要一个函数:

splitOn :: (Eq p) => p -> [p] -> ([p], [p])

这样:


splitOn 'b' ['a', 'b', 'b', 'b', 'c', 'a'] = (['a', 'b', 'b'], ['c', 'a'])
splitOn 'b' ['a', 'b', 'c', 'a'] = (['a'], ['c', 'a'])

传递的参数保证在中间的连续块中。

有没有办法在列表中一次性完成splitOn

对不起,如果这是重复的,我找不到搜索它的方法。

【问题讨论】:

  • 你是想从头开始写这个,还是把标准库函数放在一起来做?
  • 我正在尝试将标准库函数组合在一起。
  • 目前我正在对元素进行排序,以便在“分隔符”元素之后拆分,然后从左侧列表中删除它,但这似乎不是最好的解决方案。
  • 不,这基本上是倒退。您为什么不解释一下您实际上要做什么,以确保这不是 XY 问题?上下文是什么?
  • 根据您目前所说的,看看breakdropWhile。但在上下文中可能会做得更好。

标签: list haskell


【解决方案1】:

首先我们这样做,然后我们这样做,然后我们停止:

splitOn :: Eq a => a -> [a] -> ([a], [a])
splitOn b xs = g xs
  where
  g []                 = ([], [])
  g (x:xs) | x==b      = f xs
           | otherwise = first (x:) $ g xs
  f []                 = ([], [])
  f (x:xs) | x==b      = first (x:) $ f xs
           | otherwise = ([], x:xs)

【讨论】:

    【解决方案2】:

    根据我的模糊理解,听起来您有一组点要存储在由第一个组件索引的有点平衡的二叉搜索树中。要采用现成的平衡二叉搜索树,可能如下所示:

    {-# LANGUAGE DeriveFoldable #-}
    import Data.Map.Strict (Map)
    import qualified Data.Map.Strict as M
    import Data.Set (Set)
    import qualified Data.Set as S
    
    -- | A `PointTree` stores, for each `a`, a set of second
    -- components `b`.
    newtype PointTree a b = PT
      { getPT :: Map a (Set b) }
    
    fromList :: (Ord a, Ord b) => [(a, b)] -> PointTree a b
    fromList = PT . M.fromListWith Set.union . map S.singleton
    
    toList :: PointTree a b -> [(a, b)]
    toList (PT m) = [(a, b) | (a, bs) <- M.assocs m, b <- S.elems bs]
    

    以上将丢弃重复的点。如果你想保留这些,你可以使用列表而不是集合。

    现在,如果您想构建自己的平衡树,则必须选择一棵。 Data.MapData.Set 使用亚当斯树(近似权重平衡)。您还可以使用 AVL 树、红黑树等。

    【讨论】:

    • 我需要splitOn 其他信息是上下文,我想知道如何创建该功能,请帮帮我。谢谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多