在log n time中提取Set(或Map)中的一系列元素的简洁方法是什么?

时间:2015-11-17 02:01:20

标签: haskell

我知道有split,但使用此功能获得范围确实很让人满口:

import qualified Data.Set as S

-- The lower bound is inclusive and the upper bound is exclusive.
range' :: Ord a => (a, a) -> S.Set a -> S.Set a
range' (lower, upper) s = 
    let (_, e, right) = S.splitMember lower s
        (left, _)     = S.split upper right
    in  if e
          then S.union (S.singleton lower) left
          else left

main :: IO ()
main = do
    print $ range' (0, 3) (S.fromList [-1,2,0,1,5,6,3,7])
    return ()

-- output:
--   fromList [0,1,2]

有更好的方法吗?

编辑:我想我真正要问的是,为什么这个功能不包含在包中?我认为这对抽象来说既有用又自然。对我来说很奇怪,我在包中找不到这样的功能。

1 个答案:

答案 0 :(得分:3)

您可以只使用insert而不是S.union (S.singleton lower)

另外,请注意,upper <= lower时代码有问题,因为当上限是独占的时,这样的间隔为空,输出应该为空,无论如何,如果{,则代码返回S.singleton lower {1}}位于输入集中。

lower