我有一个记录/元组列表。和列表上处理的几个函数。像max_min,它取一个列表并返回最小,最大对。 有没有办法在不修改的情况下组合这些功能? 每个功能都不会对原始列表进行任何修改。 但可能会减少,映射,过滤。
stream ---> Process1 ----> Process2
[ (x:4,y:2,value:10) , (x:3,y:1,value:2), ... ]
function min_max (list) = .... a function that takes a list and return (min,max) pair
function count(list) = .... count occurrences and return [(item, times)]
function average(list) = ....
以命令的方式,我可以使用一个大的for循环并包含每个函数的所有逻辑。 有没有优雅的方法来做到这一点?
在python中,生成器发送可以将每个列表元素发送到所有函数。我认为这可行。 如何以功能方式抽象出来?单子?折?
答案 0 :(得分:3)
在Haskell中,简单的方法是使用Gabriel Gonzalez的foldl
包。此程序包支持Fold
类型,表示在折叠Foldable
容器时要执行的所有计算,以及您希望如何组合/转换这些计算的结果。你可以写点像
import Control.Foldl as L
avg :: (Foldable f, Fractional n) => f n -> n
avg = L.fold $ (/) <$> L.sum <*> (fromIntegral <$> L.length)
生成一个计算容器元素平均值的函数。该软件包是“包含电池”,提供了相当多的基本操作作为构建块,但如果需要,您也可以编写自己的Fold
。如果应用程序需要,可以很容易地编写函数来将Fold
应用于流式源而不是可折叠容器。