4

我想知道是否可以构造以下功能

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

用于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
4

1 回答 1

4

这是一个临时的尝试。我敢肯定还有更优雅的选择:

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))
于 2014-11-21T13:39:46.807 回答