Lens.Internal.Indexed如何连接到键控容器?

问题描述 投票:0回答:1

[A traversable may be labelled.为更进一步,可将函数应用于可通过其索引遍历的任何元素。

import Control.Monad.State

updateAt :: forall a. Int -> (a -> a) -> [a] -> [a]
updateAt i f = flip evalState [0..] . traverse g
  where
    g :: a -> State [Int] a
    g x = do
        js <- get
        case js of
            [ ]      -> error ""
            (j: js') -> do
                put js'
                if j == i
                   then return (f x)
                   else return x

在Haskell中,试图对这样的操作进行概括或分类。首先是keys,然后成长为lens。现在是一个巨大的包裹。我正试图弄明白这一点。

为此,我首先尝试做简单的事情。一个简单的事情就是我开始的-标记一个遍历。能做到吗此外,可以在“ low level”上完成吗?

element似乎与上面的示例相同,因此我检查了其定义。它导致我到element,然后到Indexable

Indexable

我承认这有点让我烦恼。我喜欢“ indexable”的声音-它必须有用。但这似乎也是Haskell编写过的最难的部分。我知道this是高级的发音器,所以基本上...函数?我不确定这可能是什么,以及如何将它们全部连接到键控容器。

是否适用于我的问题?这是为了什么我该如何理解?

haskell traversal lens
1个回答
0
投票

class ( Choice p, Corepresentable p, Comonad (Corep p) , Traversable (Corep p), Strong p, Representable p, Monad (Rep p) , MonadFix (Rep p), Distributive (Rep p), Costrong p, ArrowLoop p , ArrowApply p, ArrowChoice p, Closed p ) => Conjoined p 实际上只是意味着“ ConjoinedIndexable i pp(->))”。 Indexed i程序包建立在非常抽象的类的塔上,这使得所有内容都非常通用。具体来说,它不使用函数,而是尝试与普通提示器一起工作,但是尝试处理索引基本上会使整个过程崩溃(如您所见,非常嘈杂),只是“该提示器是Indexed i a b = i -> a -> blens“。

无论如何,您都不关心(->)。您正在谈论的“索引”是Indexed i的参数。同样,如果其他人想要得到它,则Indexable产生的“索引”就是该参数。你不知道要恢复element,只需将IndexedTraversable的返回值传递给updateAt,将element专门化为over,然后丢弃重复的索引:

p

我想说(->)很“低级”

updateAt :: Traversable t => Int -> (a -> a) -> t a -> t a
updateAt = over . element
-- updateAt i f = over (element i) f
-- "over element i do f"
© www.soinside.com 2019 - 2024. All rights reserved.