haskell - 在 ReaderT 上获取带有透镜的元组子集
问题描述
我想以这种方式玩元组和镜头:
myfct :: ReaderT (a,b,c,d,e) m a -> ReaderT (a,c,d) m a
myfct = zoom ...
能够将输入元组修改为它的子集...
伪代码将是这样的:
zoom (_1,_3,_4)
解决方案
正如@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)
推荐阅读
- python - 我想使用 ForeignKey 序列化器
- unsupervised-learning - 如何使用无监督模型设计异常检测系统
- c++ - 尝试做多项选择题
- powershell - Invoke-Command 不带参数运行
- dictionary - Map getter 没有为 Map 定义
- node.js - npm 链接抛出错误但仍然有效
- regex - Flutter 不允许在 TextField 中使用前导空格
- node.js - 使用nodejs中的流将多个文件写入http响应
- swiftui - 通用结构“ObservedObject”要求符合“ObservableObject”
- google-sheets - 如何根据两个不同单元格中的数据设置条件格式?