Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 使用foldMap而不是其变体的性能或其他类似原因?_Haskell_Fold_Monoids - Fatal编程技术网

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这是一个重要原因。我想我会从这开始,如果需要的话,以后再切换到严格的折叠。