LINUX.ORG.RU

Потому что множества (которые Data.Set) имеют смысл только для упорядоченных типов. То есть, которые можно сравнивать. Если попытаешься написать (>>=), то лучшее, что у тебя получится, будет иметь тип

Ord a => Set a -> (a -> Set b) -> Set b
То есть, близко, но не то.

Если хочется, можно воспользоваться стандартным continuation trick.

Miguel ★★★★★
()

Вообще, смотрю Data.Edison и не понимаю, почему не встроены any и all, как это сделано для списков? Почему реализованы minimum и maximum, но нет более общей утилиты best? И почему этих полезных мелочей нет в Data.Set?

eugine_kosenko ★★★
() автор топика
Ответ на: комментарий от eugine_kosenko
import qualified Data.Set as S
newtype SetWrapper r x = SetWrapper {runWrapper :: (x -> S.Set r) -> S.Set r}
wrap :: Ord r => S.Set x -> SetWrapper r x
wrap set = SetWrapper {runWrapper = \h -> S.unions [h x | x <- S.toList set]}
unWrap :: SetWrapper r r -> S.Set r
unWrap setW = runWrapper setW S.singleton
instance Ord r => Monad (SetWrapper r) where
    return r = SetWrapper {runWrapper = \h -> h r}
    setW >>= g = SetWrapper {runWrapper = \h -> runWrapper setW $ \x -> runWrapper (g x) h}
Miguel ★★★★★
()
Ответ на: комментарий от AlexVR

Синтаксической избыточностью и скоростью вычисления, возможно. Написать обертки не проблема, просто хочется это все из коробки.

eugine_kosenko ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.