Haskell 使用foldMap而不是其变体的性能或其他类似原因?
我有一个自定义数据类型Haskell 使用foldMap而不是其变体的性能或其他类似原因?,haskell,fold,monoids,Haskell,Fold,Monoids,我有一个自定义数据类型观测值::[Obs]中约10.000个观测值的列表,我想将其聚合到一个统计对象::Stat。折叠似乎是明智的选择。我发现自己有两个选择 (1) 定义一个函数accumulate::Stat->Obs->Stat,然后(严格地)左折foldl'累积acc0观察值 但是我的统计对象只包含累加器,比如Count和Sum,所以应该有一个幺半结构。这给了我更多的选择 (2) 定义一个convert::Obs->Stat并使用来自数据的折叠式映射。折叠式类似于foldMap conve
观测值::[Obs]
中约10.000个观测值的列表,我想将其聚合到一个统计对象::Stat
。折叠似乎是明智的选择。我发现自己有两个选择
(1) 定义一个函数accumulate::Stat->Obs->Stat
,然后(严格地)左折<代码>foldl'累积acc0观察值
但是我的统计对象只包含累加器,比如Count和Sum,所以应该有一个幺半结构。这给了我更多的选择
(2) 定义一个convert::Obs->Stat
并使用来自数据的折叠式映射。折叠式类似于foldMap convert observations
我的问题
为什么要走单向线呢?演出可维护性?其他?FWIW我认为使用foldMap可以更清楚地了解您的意图,并且更难搞砸。foldl非常灵活,您可能会在折叠功能中出错,它模糊了您仅映射然后聚合的意图:其他人必须仔细阅读您的折叠功能,才能意识到它只是在做foldMap所做的事情。@amalloy这是一个重要原因。我想我会从这开始,如果需要的话,以后再切换到严格的折叠。