A instância aplicável para MaybeT m assume Monad m
Eu tenho usado oHaxl
mônada (descrita aqui:http://www.reddit.com/r/haskell/comments/1le4y5/the_haxl_project_at_facebook_slides_from_my_talk), que tem o recurso interessante que<*>
para sua instância Aplicativa não é o mesmo queap
do Control.Monad. Esse é um recurso essencial que permite realizar cálculos simultâneos sem bloquear. Por exemplo, sehf
eha
são cálculos longos, então
let hf :: Haxl (a -> b) = ...
ha :: Haxl a = ...
in do
f <- hf
a <- ha
return (f a)
fará sequencialmente, enquanto
hf <*> ha
irá fazê-los em paralelo e depois combinar os resultados.
Eu gostaria de poder executar cálculos emMaybeT Haxl
, mas o problema é que a instância Aplicative paraMaybeT m
no pacote transformadores usa ligação monádica:
instance (Functor m, Monad m) => Applicative (MaybeT m) where
pure = return
(<*>) = ap
Ondeap = liftM2 id
é deControl.Monad
. Isto faz
let hmf :: MaybeT Haxl (a -> b) = ...
hma :: MaybeT Haxl a = ...
in hmf <*> hma
executar sequencialmente. Parece que um exemplo melhor seria mais
instance (Applicative m) => Applicative (MaybeT m) where
pure = MaybeT . pure . Just
MaybeT f <*> MaybeT x = MaybeT $ (<*>) <$> f <*> x
(Aqui,(<*>)
no lado direito é para oMaybe
mônada, enquanto o não parênteses<*>
no lado direito é param
.) Observe que o contexto é diferente - a instância acima assume apenasApplicative m
, enquanto a instância em transformadores assumeFunctor m, Monad m
.
Minha principal pergunta é prática: o que devo fazer sobre isso? Devo rolar meu próprioMaybeT
transformador de mônada? Existe alguma maneira de contornar a reclamação "Declarações de instância duplicada" que o ghc me fornece se eu tentar escrever o acima?
Eu também gostaria de saber: a configuração atual é uma falha de design no pacote de transformadores? Se não, por que não?