Возможно, rangemin
библиотека делает то, что вы хотите?
Старый добрый Data.Map
(и его более эффективный Data.IntMap
двоюродный брат) имеет функцию
splitLookup :: Ord k => k -> Map k a -> (Map k a, Maybe a, Map k a)
, которая разбивает карту на подкарты ключей меньше / больше, чем данный ключ. Это может быть использовано для определенных видов поиска диапазона.