gpt4 book ai didi

Haskell "transform"函数

转载 作者:行者123 更新时间:2023-12-02 08:36:22 24 4
gpt4 key购买 nike

我已经编写了我想象的 Haskell 中的常见函数,但我找不到它在任何地方实现。由于缺乏更好的词,我将其称为“转变”。

“转换”执行三个参数:一个列表、一个初始状态以及一个函数,该函数从列表、一个状态中获取一个元素,并为输出列表生成一个元素,以及一个新状态。输出列表的长度与输入列表的长度相同。

如果它也接受状态参数,那么它有点像“scanl”,或者如果您可以向它提供一个列表,则它有点像“unfoldr”。

事实上,我已经用两种不同的方式实现了下面的这个函数,但得到了相同的结果:

transform1 :: (b -> c -> (a, c)) -> c -> [b] -> [a]
transform1 f init x = unfoldr f' (x, init)
where
f' ((l:ls), accum) = let (r, new_accum) = f l accum in Just (r, (ls, new_accum))
f' ([], _) = Nothing

transform2 :: (b -> c -> (a, c)) -> c -> [b] -> [a]
transform2 f init x = map fst $ tail $ scanl f' init' x where
f' (_,x) y = f y x
init' = (undefined, init)

这种操作似乎相对常见,即获取一个列表并以某种状态遍历它并生成一个新列表,所以我想知道是否有一个函数已经存在并且我正在重新发明轮子。如果是这样,我只会使用它,但如果不是,我可能会将我所获得的内容打包到一个(非常)小的库中。

最佳答案

这几乎是,但不完全是 Data.List.mapAccumL 。不同之处在于 mapAccumL 还包括最终状态。而且它最近被推广到Traversable

mapAccumL :: Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c)

关于Haskell "transform"函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33283054/

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