2

有没有办法从中Foldable派生Tuple?至少当元组是齐次的时?

例如,假设我有(1,2,3)并且我想要reverse它或将其转换为[1,2,3]类似的东西。

我试图做类似的事情

over each (\x -> 4 -x) (1,2,3) -- lol

但我需要一种等效的镜头折叠...

实际上我看到我可以做到

 foldr1Of each (\a x -> a+x) (1,2,3)

但我需要

 foldr1Of each (\a x -> a:x) (1,2,3) 

哪个不编译

4

2 回答 2

3

但我需要

foldr1Of each (\a x -> a:x) (1,2,3) 

哪个不编译

这不编译的原因是因为(:) :: a -> [a] -> [a]需要一个列表作为第二个参数,但是使用foldr1Of,你提供它折叠的最后一个元素,这里是一个数字。

您可以通过使用来解决它foldrOf :: Getting (Endo r) s a -> (a -> r -> r) -> r -> s -> r

Prelude Control.Lens> foldrOf each (:) [] (1,2,3)
[1,2,3]

因此,这里我们[]作为“初始累加器”传递。

因此,我们可以将几个“容器”转换为列表:

toList :: Each s s a a => s -> [a]
toList = foldrOf each (:) []

例如:

Prelude Control.Lens> toList (1,2)
[1,2]
Prelude Control.Lens> toList (1,2,3)
[1,2,3]
Prelude Control.Lens> toList (1,2,3,4)
[1,2,3,4]
Prelude Control.Lens> toList [1,2,3]
[1,2,3]
Prelude Control.Lens> toList Nothing
[]
Prelude Control.Lens> toList (Just 2)
[2]
于 2019-05-05T09:49:11.153 回答
3

In addition to Willem's answer, it is worth noting that Control.Lens.Fold offers analogues for pretty much everything in Data.Foldable. That includes toList, which becomes toListOf:

GHCi> toListOf each (1,2,3)
[1,2,3]
于 2019-05-05T22:52:13.893 回答