为什么在Haskell的镜头库中同时具有itraverse和itraversed函数?

无聊

Haskell库镜头包含一个类型类TraversableWithIndex,它定义了itraverseitraversed两个函数

class
    (FunctorWithIndex i t, FoldableWithIndex i t, Traversable t)
    => TraversableWithIndex i t | t -> i where
  itraverse :: Applicative f => (i -> a -> f b) -> t a -> f (t b)
  itraversed :: IndexedTraversal i (t a) (t b) a b

IndexedTraversal 扩展如下:

type IndexedTraversal i s t a b =
  forall p f. (Indexable i p, Applicative f) => p a (f b) -> s -> f t

itraverse并且itraversed看起来非常相似。为什么两者都需要?


从玩弄itraverseitraversed,似乎itraversed是可以与使用两个唯一一个%@~作为AnIndexedSetter

出于完整性考虑%@~以下是AnIndexedSetter,和的类型Indexed

(%@~) :: AnIndexedSetter i s t a b -> (i -> a -> b) -> s -> t 

type AnIndexedSetter i s t a b =
  Indexed i a (Identity b) -> s -> Identity t 

newtype Indexed i a b = Indexed { runIndexed :: i -> a -> b }

为什么%@~要求AnIndexedSetter为什么Indexed仍然必须使用?

Indexed由于它不是正常功能,因此使用似乎会使合成更加困难。我在这里想念什么?

phadej

索引光学元件不像常规光学元件那么简单。常规Traversal很简单:

type Traversal s t a b = forall f. Applicative f => (a -> f b) -> s -> f t

这正是traversewiths = c a的类型t = c b,其中cTraversable

您可以想象IndexedTraversal i与相似(i -> a -> f b)但事实并非如此!

type IndexedTraversal i s t a b =
    forall p f. (Indexable i p, Applicative f) => p a (f b) -> s -> f t

Indexable i p约束是满足(->)Indexed,所以:

itraverse  :: Applicative f => (i -> a -> f b) -> s -> f t
itraversed :: Applicative f =>      (a -> f b) -> s -> f t  -- (->)
itraversed :: Applicativef  =>   Indexed i a b -> s -> f t

哪里

newtype Indexed i a b = Indexed { runIndexed :: i -> a -> b } 

为什么两者都需要?itraverse更容易实现。通常它已经在那里(例如traverseWithKey中的containers)。


业务的需要,光学系统的具体实例(如set需要ASetter)。很快:由于我们不使用,因此编译器更容易找出问题Rank2Types

Indexednewtype需要分开,这样我们就可以讨论a -> bi -> a -> b作为实例Indexable; 让我们将分度光学元件降级为常规光学元件:

Prelude Control.Lens> over itraversed (+1) [1,2,3]
[2,3,4]

p a (f b) -> q s (f t)p可以是(->)Indexable)组成索引光学和常规光学:

Prelude Control.Lens> over (itraversed . traversed)  (+1) [[1,2],[3]]
[[2,3],[4]]

要么

Prelude Control.Lens> iover (itraversed . traversed) (,) [[1,2],[3]]
[[(0,1),(1,2)],[(0,3)]]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么C ++ Concepts TS中同时具有变量和函数概念?

为什么WPF中同时具有TypeConverters和IValueConverter?

为什么同时具有params和muti-object构造函数?

为什么HttpClientHandler同时具有Proxy和UseProxy属性?

为什么标准同时具有seekpos()和seekoff()?

为什么Kotlin同时具有Regex和Pattern类?

为什么TypeScript同时具有`void`和`undefined`?

为什么Clickhouse同时具有WHERE和PREWHERE构造?

Haskell中具有LHS和RHS功能的功能定义如何/为什么起作用?

为什么“同时”在Haskell中不是单子?

为什么在 Haskell 中 flip 和 flip(:) 是不同的函数?

为什么FilterInputStream和FilterOutputStream在其构造函数中具有不同的访问修饰符?

为什么构造函数中的全局变量和参数变量不能具有相同的名称?

为什么函数组成和应用程序在Agda中具有依赖的实现?

为什么在此类中复制构造函数,operator =和引用具有编译问题

为什么在TypeScript中接口可以同时具有数字和字符串索引签名?

为什么Angular具有isDefined和isUndefined函数?

如果Kotlin已经具有getter和setter,为什么它们在数据类中具有componentN函数?

为什么在Haskell中没有runConst函数?

为什么我不能像普通变量一样绑定和重用haskell镜头?

当我使用javascript登录时,为什么类和函数中的函数具有不同的表达式?

JavaScript中的函数是否具有先前的属性?为什么?

为什么javascript中的匿名函数具有名称?

具有相互依赖(同时)更新的镜头

为什么Stream.Builder同时具有添加和接受方法?

为什么SCSI标准允许设备同时具有多个“端口”和多个“逻辑单元”?

为什么Linux需要同时具有`/ dev / cdrom`和`/ media / cdrom`?

为什么顺序容器同时具有size_type和difference_type?

为什么必须同时具有目录的写和执行权限才能删除文件?