【问题标题】:Haskell chain functions based on separate conditions基于单独条件的 Haskell 链函数
【发布时间】:2014-10-28 16:27:15
【问题描述】:

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

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

(if condition1 then func1) . (if condition2 then func2) . (if condition3 then func3) Obj

因此,如果所有条件都符合条件,则所有 3 个函数都将应用于 Obj。

有什么方法可以让我正确地做到这一点吗?

【问题讨论】:

  • 如果不满足condition2 怎么办。那应该怎么办?
  • 那么 func2 不应该应用于参数,如: func2 不应该被执行,只有 func1 和 func3 应该作为参数 Obj 被执行(如果他们满足他们的条件,否则没有,只有 Obj应该返回)

标签: function haskell chain


【解决方案1】:

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

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

【讨论】:

  • 啊对!我忘记了 id 功能,并认为可能有一种更简单/更有效的方法。谢谢!
【解决方案2】:

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

let fChain = [f1 | cond1] ++ [f2 | cond2] ++ ....

然后像这样评估列表

let result = fChain `apply` value

在哪里

apply = foldl (.) id

当然,每个fn的类型必须是(a->a)(因为condn==False,我们代入id

【讨论】:

  • 如果你要走那条路,为什么不改用apply fs conds = foldl (.) id . filter fst . zip conds fs?由于您不会进行串联,因此使用长链函数可以获得更好的性能,然后您将拥有apply :: [a -> a] -> [Bool] -> a -> a
  • @bheklilr- 因为我发现fChain = [f1 | cond1] ++ [f2 | cond2] ++ .... 真的很容易阅读。我将链接在一起的函数的数量通常为 10 或更少,因此我什至不会因此而发生性能损失(尽管如果它在内部循环中,我可能会重新考虑)。我想[((a->a), Bool)]->a->a 类型的申请可能是可读的。不过,我可能会避免使用apply :: [a -> a] -> [Bool] -> a -> a,因为函数和条件是分开的,你可能会不小心不匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多