Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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
Python 列表上的多个函数_Python_Haskell_Functional Programming - Fatal编程技术网

Python 列表上的多个函数

Python 列表上的多个函数,python,haskell,functional-programming,Python,Haskell,Functional Programming,我有一个记录/元组列表。以及列表中处理的两个函数。比如max_min,它接受一个列表并返回min,max pair。 有没有办法不经修改就组合这些功能? 每个函数都不会对原始列表进行任何修改。 但可能会减少、映射、过滤 stream ---> Process1 ----> Process2 [ (x:4,y:2,value:10) , (x:3,y:1,value:2), ... ] function min_max (list) = .... a fun

我有一个记录/元组列表。以及列表中处理的两个函数。比如max_min,它接受一个列表并返回min,max pair。 有没有办法不经修改就组合这些功能? 每个函数都不会对原始列表进行任何修改。 但可能会减少、映射、过滤

    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中,GeneratorSend可以将每个列表元素发送给所有函数。我想那可能行得通。
我们如何以函数的方式来抽象这一点?蒙纳德?折叠?

在哈斯克尔,最简单的方法是使用加布里埃尔·冈萨雷斯的包裹。此软件包支持一个
折叠
类型,表示折叠可折叠容器时要执行的所有计算,以及如何组合/转换这些计算的结果。你可以这样写

import Control.Foldl as L

avg :: (Foldable f, Fractional n) => f n -> n
avg = L.fold $ (/) <$> L.sum <*> (fromIntegral <$> L.length)
导入控制。Foldl为L
平均值::(可折叠f,分数n)=>FN->n
平均=L.fold$(/)L.sum(从整数L.length)

生成计算容器元素平均值的函数。该软件包是“含电池”,提供了相当多的基本操作作为构建块使用,但如果需要,您也可以编写自己的
Fold
s。如果您的应用程序需要,编写将
Fold
s应用于流媒体源而不是可折叠容器的函数也非常容易。

这个问题是关于什么编程语言的?Perl、Python还是Haskell?请删除不适用的语言标记。min/max/count-在折叠功能由使用过的功能组成的情况下,将进行一次折叠,平均值不会出现在一次折叠中,因为sum和len的除法运算不能出现在折叠中,但它可以很容易地在后面完成。但是我建议从一个简单的开始——在其他程序之后完成每一步——看看它是否足够快(如果你使用haskell,我建议使用“标准”),如果不是,那么就开始编写一个组合的折叠函数,并记录它的功能以及您选择这样做的原因(例如,出于性能原因),您希望编写多个函数的“组合”版本,以便只需在列表上进行一次循环/折叠即可计算。这可能可行,也可能不可行,具体取决于要组合的功能。此外,问题并不那么清楚:“不加修改”需要什么?也许您只想编写
组合(fun1,fun2,…)
并自动创建一个单折叠函数。我认为这不容易做到,除非
fun1,…
有一些特殊的形式。@simbabque哪种编程语言都不重要。这不是一个特定于编程语言的问题。