我想知道是否可以构建以下功能
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
答案 0 :(得分: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))