haskell - Traversable 到 Traversable 只遍历指定索引的元素

标签 haskell lenses

我想知道是否可以构造以下函数

ix :: (Applicative a, Traversable t) => Int -> (v -> a v) -> (t v -> a (t v))

对除第i个元素之外的所有元素使用pure,其中第i个元素使用v -> a v(遍历具有指定索引的值)。

基本上,我试图概括所有可遍历的以下函数。 或者说这是不可能的? Traversable 始终可以转换为 Zipper我认为这可以推广。

idx _ _ []     = pure []
idx 0 f (x:xs) = (:xs) <$> f x
idx i f (x:xs) = (x:)  <$> idx (i - 1) f xs

最佳答案

这是一次临时尝试。我确信还有更优雅的选择:

import Control.Applicative
import Control.Monad.State
import Data.Traversable as T

ix :: (Applicative a, Traversable t) => Int -> (v -> a v) -> (t v -> a (t v))
ix i f =
    sequenceA
  . flip evalState 0
  . T.mapM (\ x -> do
                     j <- get
                     put (j + 1)
                     if i == j then return (f x)
                               else return (pure x))

关于haskell - Traversable 到 Traversable 只遍历指定索引的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27062321/

相关文章:

list - 在 Haskell 中生成一组 bool 变量的所有组合

haskell - 使用WinGHCi时的一些问题

javascript - 如何使用 van Laarhoven Lens 删除对象的聚焦属性?

haskell - 在 Haskell 中构建组合自参照镜头

haskell - 如何使用 Lenses 遍历并分配给 Map 中的某些(但不是全部)元素

haskell - 将列表转换为类型安全向量

opencv - Haskell 中的问号关键字

haskell - 为什么使用在同一个模块中定义的函数比在另一个模块中定义的相同函数更快?

haskell - 使用 ekmett 的 Lens 更新一个字段的多个子字段

list - 如果列表的元素符合某些条件,则更改列表元素,如果不符合,则使用 Data.Lens 添加新元素