2016-05-17 2 views

ответ

8

Все вышеперечисленное одинаковы.

Очевидный вариант был бы

maybeAlt :: Alternative f => Maybe a -> f a 
maybeAlt = maybe empty pure 

И это особый случай следующего, подобно asum.

import Data.Monoid 
import Control.Applicative 

foldAlt :: (Foldable f, Alternative m) => f a -> m a 
foldAlt = getAlt . foldMap (Alt . pure) 

Причина, по которой вы не найдете это в любом месте, это pure a <|> x === pure a. Так что это хорошо для этого и не больше. Это может быть улучшена до

foldAltMap f = getAlt . foldMap (Alt . f) 

или

foldrAltMap f = foldr (\x r -> f x <|> r) empty 

, но это, наверное, понятнее просто написать его.

+2

Мне было интересно, если сообщество пришло к консенсусу относительно того, как его следует называть. Кажется, как кандидат на включение в «базу» где-то. – ErikR

+0

@ErikR, я не знаю об этом. Сожалею. – dfeuer

+0

@dfeuer Возможно, 'foldAlt = asum. fmap pure' делает более понятным, как он похож на 'asum'. –

Смежные вопросы