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)
正如@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)
归档时间: |
|
查看次数: |
93 次 |
最近记录: |