列表上的多个功能

时间:2015-10-19 10:57:18

标签: python haskell functional-programming

我有一个记录/元组列表。和列表上处理的几个函数。像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中,生成器发送可以将每个列表元素发送到所有函数。我认为这可行。 如何以功能方式抽象出来?单子?折?

1 个答案:

答案 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应用于流式源而不是可折叠容器。