Свернуть сворачиваемое в альтернативу
Jul. 27th, 2016 02:01 pmВ стандартной библиотеке (Data.Foldable) имеется функция
> :t asum asum :: (Alternative f, Foldable t) => t (f a) -> f a > asum [Nothing, Just 1, Just 2] Just 1 > asum [[1,2,3],[4,5]] [1,2,3,4,5]Можете ли вы написать afold с естественной для своего типа семантикой:
> :t afold afold :: (Alternative f, Foldable t) => t a -> f a > afold "abc" :: Maybe Char Just 'a' > afold "abc" :: [Char] "abc"Я знаю три решения: кривое (требующее FlexibleInstances и IncoherentInstances), обычное (утилизирующее избыточно богатый интерфейс Foldable) и современное, элегантно выпрямляющее кривизну кривого.