gpt4 book ai didi

functional-programming - 用功能语言,如何有条件地选择要在zip或zipWith样式函数中使用的元素?

转载 作者:行者123 更新时间:2023-12-04 18:16:34 27 4
gpt4 key购买 nike

我熟悉对两个序列的相应元素进行操作的标准zipWith函数,但是在功能语言(或具有某些功能特征的语言)中,最简洁的方法是根据以下条件有条件地选择要压缩的元素对第三个顺序?

当在Excel中进行一些操作时,这种好奇心就产生了。
对于A1:A10,B1:B10,C1:C10,D1,E1和F1中的数字,我使用的是这样的公式:

{=AVERAGE(IF((D1<=(A1:A10))*((A1:A10)<=E1),B1:B10/C1:C10))}

IF语句中乘法的每一半将产生一个 bool 值数组,然后将它们相乘(与)在一起。这些 bool 控制最终将对十个商中的哪一个进行平均,因此就好像要评估十个独立的IF语句一样。

例如,如果仅A1:A10中的10个值中的第二个和第三个值满足条件(> = D1和<= E1),则该公式将最终得出结果:
AVERAGE(FALSE,B2/C2,B3/C3,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE)

AVERAGE函数恰好会忽略 bool 值和文本值,因此我们只获得第二和第三商的平均值。

能用Haskell简洁地完成此操作吗? lang LINQ还是F#? Python?等等..

请注意,对于这个特定示例,上面给出的公式并不完全正确,为了简化基本含义,将其缩写。当A1:A10中的十个元素中的任何一个都不满足条件时,十个FALSE值将被传递给AVERAGE,这将错误地将其评估为0。
公式应这样写:
{=AVERAGE(IF(NOT(OR((D1<=(A1:A10))*((A1:A10)<=E1))),NA(),
IF((D1<=(A1:A10))*((A1:A10)<=E1),B1:B10/C1:C10)))}
NA()产生错误的地方,指示平均值未定义。

更新:

感谢您的回答。我意识到,当第一个列表中的相应元素满足某些特定条件时,对第二个列表和第三个列表中的元素对应用函数时,我的第一个问题相当琐碎。我接受了诺曼·拉姆齐(Norman Ramsey)的回答。

但是,我接下来想知道该函数是否可以应用于表示任意数量列表中相应元素的元组,因此我向Lebertram询问有关 zipWithN的限制。

Apocalisp提供的有关应用仿函数的信息使我了解了有关python解压缩参数列表的信息-将函数应用于任意数量的参数。

对于我在上面给出的特定示例,平均列表元素的商(其中 nums是列表列表),看起来python可以做到这一点:
from operator import div

def avg(a): return sum(a,0.0)/len(a)
avg([reduce(div,t[1:]) for t in zip(*nums) if d<=t[0] and t[0]<=e])

更一般地,使用函数 f和谓词 p(以及 avg),它变为:
avg([f(t[1:]) for t in zip(*nums) if p(t[0])])

最佳答案

How to conditionally select elements in zip?



首先压缩,然后选择。

在这种情况下,我使用 catMaybes进行选择,wihch在此设置中通常很有用。进行类型检查是一个巨大的痛苦(必须将 fromIntegral放在正确的位置),但是这是我要编写的代码,它通常像往常一样依赖于优化器:
average as bs cs d1 e1 = avg $ catMaybes $ zipWith3 cdiv as bs cs
where cdiv a b c = if a >= d1 && a <= e1 then Just (b/c) else Nothing
avg l = sum l / fromIntegral (length l)

函数 cdiv代表“条件除法”。

要获取 catMaybes,您必须导入 Data.Maybe

这段代码会进行类型检查,但我还没有运行它。

关于functional-programming - 用功能语言,如何有条件地选择要在zip或zipWith样式函数中使用的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2306620/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com