通过 ReaderT 获取带镜头的元组子集

Nic*_*nin 1 haskell lenses haskell-lens

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

myfct :: ReaderT (a,b,c,d,e) m a -> ReaderT (a,c,d) m a
myfct = zoom ...
Run Code Online (Sandbox Code Playgroud)

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

伪代码将是这样的:

zoom (_1,_3,_4)
Run Code Online (Sandbox Code Playgroud)

K. *_*uhr 5

正如@dfeuer 所指出的,您可能打算写:

myfct' :: Monad m => ReaderT (a,c,d) m a -> ReaderT (a,b,c,d,e) m a
Run Code Online (Sandbox Code Playgroud)

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

myfct' = magnify . to $ \(a,_,c,d,_) -> (a,c,d)
Run Code Online (Sandbox Code Playgroud)

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

myfct :: Monad m => ReaderT (a,b,c,d,e) m a -> ReaderT (a,c,d) m a
Run Code Online (Sandbox Code Playgroud)

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

action :: Reader (Int,String,Int,Int,Int) Int
action = asks $ \(_,b,_,_,_) -> length (b :: String)
Run Code Online (Sandbox Code Playgroud)

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

test' :: Int
test' = runReader (myfct action) (1,2,3)
Run Code Online (Sandbox Code Playgroud)