gpt4 book ai didi

haskell - 将元组转换为可折叠

转载 作者:行者123 更新时间:2023-12-02 15:44:59 25 4
gpt4 key购买 nike

有没有办法从Tuple派生Foldable?至少当元组是同构的时候?

例如,假设我有 (1,2,3),我想反转它或将其转换为 [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) 

无法编译

最佳答案

but I would need instead

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

which doesn't compile

无法编译的原因是 (:)::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]

关于haskell - 将元组转换为可折叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55990665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com