gpt4 book ai didi

haskell - 为 newtype 创建 MonadBaseControl 实例

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

假设我有简单的 newtype 声明

newtype Foo a = Foo { unFoo :: ReaderT Int IO a }

我想制作 MonadBaseControl IO 的 Foo 实例。这应该很容易,因为 ReaderT Int IO 已经是 MonadBaseControl IO 的一个实例。但是,使用 GeneralizedNewtypeDeriving 自动派生它不起作用,因为 MonadBaseControl 类具有关联的类型。

如何为 Foo 编写 MonadBaseControl IO 实例? defaultLiftBaseWith 和 defaultRestoreM 应该会有所帮助,但是要破译它们的类型有点困难。

最佳答案

Foo既不是“基础”单子(monad),也不是单子(monad)转换器。 defaultLiftBaseWith在这里不会有帮助,因为您需要 Foo 的实例与 ReaderT Int IO 的相同.

首先,使用 GND 来获取无聊的实例:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

import Control.Monad.Trans.Control
import Control.Monad.Base
import Control.Monad.Reader
import Control.Applicative

newtype Foo a = Foo { unFoo :: ReaderT Int IO a }
deriving (Monad, Applicative, Functor, MonadBase IO)
MonadBaseControl IO 的实例只是删除新类型,使用 ReaderT 中的函数实例,并将结果放回新类型:
instance MonadBaseControl IO Foo where
type StM Foo a = a
liftBaseWith f = Foo $ liftBaseWith $ \q -> f (q . unFoo)
restoreM = Foo . restoreM

请注意,如果 StM不是关联的类型系列,您可以执行类似的操作
newtype Foo a = Foo { unFoo :: ReaderT Int IO a } 
deriving (Monad, Applicative, Functor, MonadBase IO, MonadBaseControl IO)

type instance StM Foo a = a

关于haskell - 为 newtype 创建 MonadBaseControl 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28137838/

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