haskell 在累加器类型上组合多个文件夹的一般方法?

n53p2ov0  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(51)

最近我想到了一个函数的想法:

gridFoldr :: (a -> Grid -> Grid) -> [a] -> Grid -> Grid
gridFoldr f g xs = foldr f xs g

字符串
因此,我可以使用普通(.)运算符轻松地将合并多个网格计算组合在一起:

let grid' = gridFoldr gridOp1 args1 . gridFoldr gridOp2 args2 $ myGrid


但是我有一种感觉,我错过了一些通用的haskell概念,使用类似的方法,而不引入新的函数。我是对的吗?有一些标准的函数/包/或者一些聪明的Monad来完成这项任务吗?

dfddblmv

dfddblmv1#

看起来你对“网格更新”感兴趣,也就是对函数Grid -> Grid感兴趣。这种类型同构于Endo GridEndo Grid是一个著名的幺半群。
因此,您的功能类似于

foldGrid :: (a -> Endo Grid) -> [a] -> Endo Grid
foldGrid f = mconcat . map f

字符串
甚至是开发更多的库

foldGrid = foldMap


实际上,foldMap是你的函数的推广。

foldMap :: (Foldable t, Monoid m) => (a -> m) -> t a -> m

相关问题