Function 基于分离条件的Haskell链函数

Function 基于分离条件的Haskell链函数,function,haskell,chain,Function,Haskell,Chain,当将函数链接到一个参数时,是否有一种有效/简单的方法,仅应用满足其要求的函数才能应用?例如: 我有1个参数'Obj'和3个函数:func1,func2,func3。每个函数都有自己的要求,需要满足这些要求才能将函数应用于参数。例如,伪代码: (if condition1 then func1) . (if condition2 then func2) . (if condition3 then func3) Obj 因此,如果所有条件都合格,则所有3个功能都将应用于Obj 有什么方法可以正确执

当将函数链接到一个参数时,是否有一种有效/简单的方法,仅应用满足其要求的函数才能应用?例如:

我有1个参数'Obj'和3个函数:func1,func2,func3。每个函数都有自己的要求,需要满足这些要求才能将函数应用于参数。例如,伪代码:

(if condition1 then func1) . (if condition2 then func2) . (if condition3 then func3) Obj
因此,如果所有条件都合格,则所有3个功能都将应用于Obj


有什么方法可以正确执行此操作吗?

首先,在
Obj
之前,您缺少一个
$
。我认为在回答您的问题时,您只需要提供一个
else
子句:

(if c0 then f0 else id) $ (if c1 then f1 else id) $ (if c2 then f2 else id) $ arg

您可以定义链中的函数列表,如下所示

let fChain = [f1 | cond1] ++ [f2 | cond2] ++ ....
然后像这样评估列表

let result = fChain `apply` value
在哪里


当然,每个fn的类型必须是
(a->a)
(因为对于
condn==False
,我们在
id
中进行替换)

如果不满足
条件2
怎么办。那么会发生什么呢?那么func2不应该应用于参数,如:func2不应该执行,只有func1和func3应该与as参数Obj一起执行(如果它们满足条件,否则应该不返回任何且仅返回Obj)啊,对了!我忘记了id函数,并认为可能有一种更简单/更有效的方法来实现这一点。谢谢为什么不改为使用
apply fs conds=foldl(.)id。过滤器fst。zip conds fs
如果你要走那条路线?使用长函数链可以获得更好的性能,因为不需要进行串联,然后使用
apply::[a->a]->[Bool]->a->a
@bheklillr-因为我发现
fChain=[f1 | cond1]+[f2 | cond2]+..
非常容易阅读。我将链接在一起的函数的数量通常为10个或更少,因此我甚至不会因此而损失性能(尽管如果是在内部循环中,我可能会重新考虑)。我认为类型为
[((a->a),Bool)]->a->a
的应用程序可能是可读的。我可能会避免
apply::[a->a]->[Bool]->a->a
,因为函数和条件是分开的,可能会意外地不匹配。
apply = foldl (.) id