在状态中访问数组元素的推荐方法是什么 如果值类型,则为lens的monad 不是幺半群。
以下将无法编译,因为镜头不知道该怎么做
给定索引i
没有元素。
type MyArray = Array Int Char
-- accessElemInStateWrong :: Int -> State MyArray Char
-- accessElemInStateWrong i = use $ ix i
可以通过组合gets
来实现工作版本
来自Control.Monad.State.Class
的{{1}} preview
。
Control.Lens.Fold
这很好用。但是,考虑到过多的功能和操作员 镜头定义,我很惊讶地发现似乎没有 对于这个特殊情况。
所以,我的问题是:镜头是否定义了像accessElemInState :: Int -> State MyArray (Maybe Char)
accessElemInState i = gets $ preview $ ix i
这样的东西?而如果
不是,实施gets . preview
的推荐方法是什么?
我问的原因是因为accessElementInState
确实定义了一个特殊的运算符
在州Monad之外。虽然以下内容不会编译相同
原因如上。
lens
我们可以使用运算符-- accessElemWrong :: Int -> MyArray -> Char
-- accessElemWrong i a = a ^. ix i
将结果包装在(^?)
中并执行安全操作
查找。
Maybe
答案 0 :(得分:2)
有一个功能preuse
听起来就像你正在寻找的那样:
accessElemInState :: Int -> State MyArray (Maybe Char)
accessElemInState i = preuse $ ix i
-- or
accessElemInState = preuse . ix