gpt4 book ai didi

haskell - 在状态 monad 中使用 lens 访问数组元素

转载 作者:行者123 更新时间:2023-12-02 01:30:09 25 4
gpt4 key购买 nike

在状态中访问数组元素的推荐方法是什么带有 lens 的单子(monad)如果值类型不是幺半群。

下面会编译失败,因为 lens 不知道该怎么办在给定索引 i 处没有元素。

type MyArray = Array Int Char
-- accessElemInStateWrong :: Int -> State MyArray Char
-- accessElemInStateWrong i = use $ ix i

一个工作版本可以通过组合 gets 来实现Control.Monad.State.Class 和来自 Control.Lens.Foldpreview

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

这很好用。然而,考虑到过多的函数和运算符镜头定义,我惊讶地发现似乎没有对于这种特殊情况。

所以,我的问题是:lens 是否定义了类似 gets 的东西。预览?而如果不是,推荐的实现 accessElementInState 的方法是什么?


我问的原因是因为 lens 确实定义了一个特殊的运算符在状态 monad 之外。虽然以下内容不会编译相同原因如上。

-- accessElemWrong :: Int -> MyArray -> Char
-- accessElemWrong i a = a ^. ix i

我们可以使用运算符 (^?) 将结果包装在 Maybe 中并执行安全查找。

accessElem :: Int -> MyArray -> Maybe Char
accessElem i a = a ^? ix i

最佳答案

有一个函数preuse这听起来正是您要查找的内容:

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

-- or
accessElemInState = preuse . ix

关于haskell - 在状态 monad 中使用 lens 访问数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34754199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com