gpt4 book ai didi

haskell - 为 RVarT 实现 MFunctor 实例

转载 作者:行者123 更新时间:2023-12-01 04:50:23 25 4
gpt4 key购买 nike

是否可以实现 MFunctor RVarT 的实例?

到目前为止,我想出了以下几点:

{-# LANGUAGE RankNTypes #-}
import Data.RVar -- from rvar
import Control.Monad.Trans.Class (lift) -- from transformers

hoistRVarT :: Monad m => (forall t. n t -> m t) -> RVarT n a -> RVarT m a
hoistRVarT f rv = sampleRVarTWith (lift . f) rv

然而,这不能用作 hoist 的定义。为 MFunctor , 由于 Monadm 的约束由 lift 引起的.问题是,我找不到另一种方法将生成的 monad 提升到 RVarT 中。没有 lift .但我认为从概念上讲应该是可能的,因为 RVarT应该类似于 StateT并且有一个 MFunctor StateT 的实例.问题是我在 rvar的API中找不到任何东西或 random-fu暴露了这样的功能。

最佳答案

RVarT m anewtypePromptT Prim m a ,其中 PromptT Control.Monad.Prompt 中定义. PromptT Prim m anewtypePrompt (Lift Prim m) a .反过来,这是一个 newtype为了

forall b. (a -> b) -> (forall x. Lift Prim m x -> (x -> b) -> b) -> b

您可以使用 unsafeCoerce 打开整个东西:
fromRVarT :: RVarT m a -> (a -> b) -> (forall x. Lift Prim m x -> (x -> b) -> b) -> b
fromRVarT = unsafeCoerce

toRVarT :: (forall b. (a -> b) -> (forall x. Lift Prim m x -> (x -> b) -> b) -> b) -> RVarT m a
toRVarT = unsafeCoerce
Prim没有导出,但是因为您一开始就不需要接触它,而且您正在使用 unsafeCoerce 组装和拆卸整个东西。 ,你可以定义:
data Prim a

你可以写一个 MFunctor Lift 的实例:
instance MFunctor (Lift f) where
hoist _ (Effect p) = Effect p
hoist phi (Lift m) = Lift (phi m)

然后你可以打开 RVarT ,吊机所有 Lift s 传递给它的提示函数,并再次包装它:
instance MFunctor RVarT where
hoist phi rv = toRVarT $ \done prm -> fromRVarT rv done (\l -> prm $ hoist phi l)

关于haskell - 为 RVarT 实现 MFunctor 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41797501/

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