gpt4 book ai didi

haskell - mapEvery可以用foldr实现吗

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

对于将函数映射到列表中每个第 n 个元素的函数:

mapEvery :: Int -> (a -> a) -> [a] -> [a]
mapEvery n f = zipWith ($) (drop 1 . cycle . take n $ f : repeat id)

是否可以像普通map一样用foldr来实现这个?

编辑:在标题中,将“文件夹”更改为“foldr”。自动更正...

最佳答案

这是一个解决方案

mapEvery :: Int -> (a -> a) -> [a] -> [a]
mapEvery n f as = foldr go (const []) as 1 where
go a as m
| m == n = f a : as 1
| otherwise = a : as (m+1)

这使用“foldl as foldr”技巧在折叠时沿着列表从左到右传递状态。本质上,如果我们将 foldr 的类型读取为 (a -> r -> r) -> r -> [a] -> r 那么我们实例化 r as Int -> [a] 其中传递的整数是我们在未调用函数的情况下传递的当前元素数。

关于haskell - mapEvery可以用foldr实现吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26261873/

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