gpt4 book ai didi

haskell - MaybeT m 的应用实例假设 Monad m

转载 作者:行者123 更新时间:2023-12-03 23:54:23 26 4
gpt4 key购买 nike

我一直在使用Haxl monad(在此处描述:http://www.reddit.com/r/haskell/comments/1le4y5/the_haxl_project_at_facebook_slides_from_my_talk),它具有 <*> 的有趣功能因为它的 Applicative 实例与 ap 不同来自 Control.Monad。这是一个关键特性,允许它在不阻塞的情况下进行并发计算。例如,如果 hfha是长计算,那么

let hf :: Haxl (a -> b) = ...
ha :: Haxl a = ...
in do
f <- hf
a <- ha
return (f a)

将按顺序进行,而
hf <*> ha

将并行执行它们,然后合并结果。

我希望能够在 MaybeT Haxl 中运行计算,但问题是 MaybeT m 的 Applicative 实例在变压器包中使用一元绑定(bind):
instance (Functor m, Monad m) => Applicative (MaybeT m) where
pure = return
(<*>) = ap

在哪里 ap = liftM2 id来自 Control.Monad .这使得
let hmf :: MaybeT Haxl (a -> b) = ...
hma :: MaybeT Haxl a = ...
in hmf <*> hma

依次运行。似乎更好的实例更像
instance (Applicative m) => Applicative (MaybeT m) where
pure = MaybeT . pure . Just
MaybeT f <*> MaybeT x = MaybeT $ (<*>) <$> f <*> x

(这里,右侧的 (<*>) 用于 Maybe monad,而右侧未加括号的 <*> 用于 m。)请注意上下文不同——以上实例仅假设 Applicative m , 而变形金刚中的实例假设 Functor m, Monad m .

我的主要问题是实际的:我应该怎么做?我应该自己动手 MaybeT单子(monad)变压器?如果我尝试编写上述内容,是否有某种方法可以解决 ghc 给我的“重复实例声明”投诉?

我还想知道:当前设置是变压器包中的设计缺陷吗?如果不是,为什么不呢?

最佳答案

诀窍是(与 monad 不同)应用仿函数是可组合的,因此您不需要(应用)转换器,例如 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

组合始终是 Applicative 的正确实例并且只使用 Applicative它们的组件的实例。例如:
test = getZipList . getCompose
$ (+) <$> Compose (ZipList [Just 1, Nothing, Just 3])
<*> Compose (ZipList [Nothing, Just 20, Just 30])

生产 [Nothing,Nothing,Just 33] .

关于haskell - MaybeT m 的应用实例假设 Monad m,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22750315/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com