2016-05-17 11 views

risposta

8

Tutto quanto sopra sono le stesse.

Una variante ovvia sarebbe

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

E questo è un caso particolare dei seguenti, simile a asum.

import Data.Monoid 
import Control.Applicative 

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

Il motivo che non troverete da nessuna parte questo è che pure a <|> x === pure a. Quindi è buono per questo e non molto altro. Potrebbe essere migliorata per

foldAltMap f = getAlt . foldMap (Alt . f) 

o

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

ma probabilmente è più chiaro solo scrivere fuori.

+2

Mi chiedevo se la comunità ha raggiunto un consenso su ciò che dovrebbe essere chiamato. Sembra un candidato per l'inclusione in 'base' da qualche parte. – ErikR

+0

@ErikR, non lo so. Scusate. – dfeuer

+0

@dfeuer Forse 'foldAlt = asum. fmap pure' rende più chiaro esattamente come è simile a 'asum'. –

Problemi correlati