Я не совсем уверен, что понимаю вопрос, поэтому простите, если это не полезный ответ, но, насколько я понимаю, суть вопроса такова:
Так что было бы невозможно выполнить операцию, которая выдает итоговое значение, подобное этому, в пределах блока do
?
Правильно, это было бы невозможно. Запись do
в Haskell - это синтаксический сахар свыше Monad
, поэтому в основном синтаксический сахар превышает >>=
и return
.
return
, как вы знаете, не позволяет вам «получить доступ» к содержимому Monad
, поэтому единственный доступ к содержимому у вас есть через >>=
, и в случае монады списка например, это дает вам только одно значение за раз.
Обратите внимание, что Foldable
даже не требует, чтобы контейнер данных был Functor
(намного меньше Monad
). Известно, что Set не является экземпляром Functor
, но является экземпляром Foldable
.
Например, вы можете найти минимальное значение в наборе:
Prelude Data.Foldable Set> foldr (\x -> Just . maybe x (min x)) Nothing $ Set.fromList [42, 1337, 90125, 2112]
Just 42