在monad状态下使用镜头访问数组元素

时间:2016-01-12 21:34:49

标签: haskell lens

在状态中访问数组元素的推荐方法是什么 如果值类型,则为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

1 个答案:

答案 0 :(得分:2)

有一个功能preuse听起来就像你正在寻找的那样:

accessElemInState :: Int -> State MyArray (Maybe Char)
accessElemInState i = preuse $ ix i

-- or
accessElemInState = preuse . ix