为什么索引镜头的定义方式如何?

时间:2018-05-05 21:12:59

标签: haskell lens

关于如何定义索引镜头,this reddit thread中有一些非常有用的解释,但我想知道细节。

所以主要的一点是,索引镜头的定义使得它们也可以被视为非索引镜头。这两个类负责:

0

问题:

0)为什么将索引镜头视为非索引镜头是有用的?爱德华(见上面的链接)说

  

这让我们删除了30多个组合名称,让我们为大多数操作的索引和非索引版本共享一个组合器。

那些组合器是什么?我很欣赏一些例子。

无论class (Choice p, Corepresentable p, Comonad (Corep p), Traversable (Corep p), Strong p, Representable p, Monad (Rep p), MonadFix (Rep p), Distributive (Rep p), ArrowLoop p, ArrowApply p, ArrowChoice p ) => Conjoined p where distrib :: Functor f => p a b -> p (f a) (f b) conjoined :: (p ~ (->) => q (a -> b) r) -> q (p a b) r -> q (p a b) r class Conjoined p => Indexable i p where indexed :: p a b -> i -> a -> b 如何聪明,我猜它仍然更有效率(不需要捕获全内联,因此字典不会被传递)并且在可能的情况下灵活地使用非索引光学器件。事实上,我看到了这一点:

Conjoined

(因为-- If you don't need access to the index, then 'mapped' is more flexible in what it accepts. imapped :: IndexedSetter i (f a) (f b) a b 最好用class Functor f => FunctorWithIndex i f | f -> i替换imap (const id) ≡ id法律吗?

忽略前一个索引并返回后一个索引的imap (const f) ≡ fmap f行为看起来很隐蔽,让我感到困惑。这使类型推断和错误变得复杂。另外,我看到某个地方itraversed . itraversed对“工作”的某些定义不起作用,这是正确的吗?

我是否应该只为我的库编写索引光学器件并使用它,或者是否仍然需要提供组合器的索引和非索引变体?

1)traversed . traversed是一个非常巧妙的技巧,但它远非显而易见且未被记录。我想,有些人定义了他们自己的索引光学组合器(这是常见的吗?)并不知道他们应该使用Conjoin。是否有可能以某种方式强制使用conjoin

conjoin是否需要约MonadFix (Rep p)ArrowLoop p约束?什么是Conjoin?它与distrib有什么关系?

Mapping

什么是class (Traversing p, Closed p) => Mapping p where map' :: Functor f => p a b -> p (f a) (f b) 实例?

2)是否有比Conjoined ReifiedGetter更少的临时结构?说,像

Indexable

0 个答案:

没有答案