但我需要
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]