我经常需要将多个函数映射到相同的数据。我已经实现了 dpMap 来为我做这件事
dpMap fns = (`map` fns) . flip ($)
dpMap 是一个功能,这是否意味着我只读取数据 dt 一次(就像一个只有相同输入的电路。一个毫无意义的系统提醒一个电路;只是管道没有数据)?
例如,考虑计算列表 dt 的最小值和最大值。
minimax dt = (dpMap [minimum, maximum]) dt
(我可以摆脱 dt 但必须使用 -XNoMonomorphismRestriction)
与以这样的全点形式实现相同的功能相比,是否有性能优势?:
minimax2 dt = [minimum dt, maximum dt]
编辑: dpMap 是否有一个通用的实现,它适用于常量内存?
我发现了另一篇不错的博文:http ://www.haskellforall.com/2013/08/composable-streaming-folds.html ;希望对您有所帮助。
EDIT2:在获得更多上下文之后,这是一个解决方案,即使我没有 dpMap 的确切实现,该模式也很简单,不需要单独的函数:
minimax = (,) <$> minimum <*> maximum
用法:
> minimax [1..100]
(1,100)
如果您还想计算总和和长度
func = (,,,) <$> minimum <*> maximum <*> sum <*> length
用法:
> func [1..100]
(1,100,5050,100)