我知道有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]
有更好的方法吗?
编辑:我想我真正要问的是,为什么这个功能不包含在包中?我认为这对抽象来说既有用又自然。对我来说很奇怪,我在包中找不到这样的功能。
答案 0 :(得分:3)
您可以只使用insert
而不是S.union (S.singleton lower)
。
另外,请注意,upper <= lower
时代码有问题,因为当上限是独占的时,这样的间隔为空,输出应该为空,无论如何,如果{,则代码返回S.singleton lower
{1}}位于输入集中。
lower