【发布时间】:2019-06-16 03:36:56
【问题描述】:
我有两个函数,它们仅在 C 是特定模式时才起作用。 每个函数输出一个 C 列表。
我的目标是,在给定 [C] 的情况下,我希望在列表中调用 f1 和 f2 的所有可能性,而其余的保持不变。例如:
假设 C 的列表是:
c1
c2 --matches the pattern
c3
那么我想要一个包含两个列表的列表
[[c1] ++ (f1 c2) ++ [c3],[c1] ++ (f2 c2) ++ [c3]]
但是,如果我有
c1
c2 --matches the pattern
c3 --matches the pattern
那么我们应该有 4 个列表,因为我们想要调用 f1 和 f2 的所有组合。 所以它会是:
[(f1 c1) ++ (f1 c2) ++ [c3], (f2 c1) ++ (f2 c2) ++ [c3],
(f1 c1) ++ (f2 c2) ++ [c3], (f2 c1) ++ (f1 c2) ++ [c3]]
目前,我的代码结构大致如下:
f1 :: C -> [C]
f2 :: C -> [C]
combine :: [C] -> [[C]]
combine my_pattern:xs = ?
combine (x:xs) = ?
combine [] = []
where first_set = (f1 my_pattern)
second_set = (f2 my_pattern)
有人可以就我如何填写剩余部分给出直觉吗? Data.List 中是否有任何有用的功能?我查看了文档,但无法立即注意到哪一个可能有用。
【问题讨论】:
-
对我来说听起来像
traverse(在列表中)。 -
如果
x匹配该模式,您的可能值为[f1 x, f2 x];如果不是,他们是[x]。您可以计算列表[[c1], [f1 c2, f2 c2], [c3]](例如,在您的第一个示例中,只有c2匹配)?你能清楚地说明这里还有什么工作要做吗?
标签: list haskell functional-programming pattern-matching