MaybeT m的应用实例假设Monad m

dav*_*dsd 13 monads haskell monad-transformers applicative haxl

我一直在使用Haxlmonad(在这里描述:http://www.reddit.com/r/haskell/comments/1le4y5/the_haxl_project_at_facebook_slides_from_my_talk),它有一个有趣的特性,<*>因为它的Applicative实例ap与Control不同.单子.这是一个关键功能,允许它在不阻塞的情况下进行并发计算.例如,如果hfha是长计算,然后

let hf :: Haxl (a -> b) = ...
    ha :: Haxl a = ...
in do
  f <- hf
  a <- ha
  return (f a)
Run Code Online (Sandbox Code Playgroud)

将按顺序执行它们

hf <*> ha
Run Code Online (Sandbox Code Playgroud)

将并行完成它们然后结合结果.

我希望能够运行计算MaybeT Haxl,但问题是MaybeT m变换器包中的Applicative实例使用monadic绑定:

instance (Functor m, Monad m) => Applicative (MaybeT m) where
    pure = return
    (<*>) = ap
Run Code Online (Sandbox Code Playgroud)

ap = liftM2 id来自哪里Control.Monad.这使得

let hmf :: MaybeT Haxl (a -> b) = ...
    hma :: MaybeT Haxl a = ...
in hmf <*> hma
Run Code Online (Sandbox Code Playgroud)

顺序运行.似乎更好的实例会更像

instance (Applicative m) => Applicative (MaybeT m) where
    pure = MaybeT . pure . Just
    MaybeT f <*> MaybeT x = MaybeT $ (<*>) <$> f <*> x
Run Code Online (Sandbox Code Playgroud)

(这里,(<*>)右侧是Maybemonad,而<*>右侧是非括号的m.)请注意,上下文不同 - 上面的实例只假设Applicative m,而变换器中的实例则假定Functor m, Monad m.

我的主要问题是实际问题:我该怎么做?我应该推出自己的MaybeTmonad变压器吗?有没有办法解决ghc给我的"重复实例声明"投诉,如果我尝试编写上述内容?

我也想知道:目前的设置是变压器封装中的设计缺陷吗?如果没有,为什么不呢?

Pet*_*lák 7

诀窍是(与monads不同)applicative functor是可组合的,因此你不需要(应用)变换器,如MaybeT.相反,您可以Compose将两个应用函子组合在一起:

import Control.Applicative
import Data.Functor.Compose

type HaxlM = Compose Haxl Maybe

-- if you prefer to have a function for constructing values:
haxlM :: Haxl (Maybe a) -> HaxlM a
haxlM = Compose
Run Code Online (Sandbox Code Playgroud)

组合始终是适当的实例,Applicative仅使用Applicative其组件的实例.例如:

test = getZipList . getCompose
       $ (+) <$> Compose (ZipList [Just 1,  Nothing, Just 3])
             <*> Compose (ZipList [Nothing, Just 20, Just 30])
Run Code Online (Sandbox Code Playgroud)

生产[Nothing,Nothing,Just 33].

  • 只要我们走上这条道路,值得注意的是"Applicative"产品也是"Applicative".与"Applicative"相同,只要有一个让偏见起作用的自然变换:http://comonad.com/reader/2012/abstracting-with-applicatives/ (2认同)