首页 > 解决方案 > 在 ReaderT 上获取带有透镜的元组子集

问题描述

我想以这种方式玩元组和镜头:

myfct :: ReaderT (a,b,c,d,e) m a -> ReaderT (a,c,d) m a
myfct = zoom ...

能够将输入元组修改为它的子集...

伪代码将是这样的:

zoom (_1,_3,_4)

标签: haskellhaskell-lenslenses

解决方案


正如@dfeuer 所说,您可能打算写:

myfct' :: Monad m => ReaderT (a,c,d) m a -> ReaderT (a,b,c,d,e) m a

这需要一个只需要访问上下文(a,c,d)的操作,并将其提升为可以在提供的更大上下文中运行的操作(a,b,c,d,e)。这可以这样写magnify

myfct' = magnify . to $ \(a,_,c,d,_) -> (a,c,d)

另一方面,如果您的意思是您所写的:

myfct :: Monad m => ReaderT (a,b,c,d,e) m a -> ReaderT (a,c,d) m a

那么你将不得不解释这应该做什么。特别是,如果您有访问b :: String组件的操作:

action :: Reader (Int,String,Int,Int,Int) Int
action = asks $ \(_,b,_,_,_) -> length (b :: String)

你想如何在没有 no 的上下文中运行它b :: String

test' :: Int
test' = runReader (myfct action) (1,2,3)

推荐阅读