【发布时间】:2018-04-01 17:20:19
【问题描述】:
这是我的代码:
findY mnozP a =
if null(Set.toList $ mnozP)==False
then (
if (((null(intersect ( Set.toList $ head $ Set.toList $ mnozP) (a))==False) && (null(( Set.toList $ head $ Set.toList $ mnozP) \\ (a))==False)))
then (((intersect ( Set.toList $ head $ Set.toList $ mnozP) (a)) ++ (( Set.toList $ head $ Set.toList $ mnozP) \\ (a))) ++ findY ( Set.fromList $ tail $ Set.toList $ mnozP) (a))
else findY ( Set.fromList $ tail $ Set.toList $ mnozP) (a)
)
else []
findY _ a = []
findY _ _ = []
该函数检查列表mnozP是否为空,如果不是,则取第一项并检查其与列表a的交集是否为空and其差值不为空。在条件为真的情况下,实现这两个操作,并为列表b的尾部再次递归调用。
我实际上有两个问题:
- 让我们假设以下列表:
a = ["3","4"]和mnozP = [["1","6"],["2","4","3","5"]]。输出为["3","4","2","5"]。 是否有任何函数可以根据每次迭代将该列表拆分为列表列表? 预期输出应类似于[["3","4"],["2","5"]]。 -
编译 GHCi 时说:
Warning: Pattern match(es) are overlapped In an equation for `findY': findY _ a = ... findY _ _ = ...我不确定我的模式有什么问题。我试图涵盖所有可能发生的情况。 有什么想法吗?
编辑:(简短摘要:) 函数 findY 应该返回一个列表列表。每个内部列表都与一个具体的递归迭代相关(如果条件为真)。
【问题讨论】:
-
我认为您在这里使代码变得复杂。您最好首先使用
where子句、守卫等来使语法更干净。 -
首先指定您的函数的目标可能也很有用?
-
编译器还说最后两行实际上是重复的,因此没有理由同时写这两行。所以你可以删除两者之一。
-
@WillemVanOnsem 这不是这个问题的主题。首先,我需要通过测试 mnozP 的每个子集(子列表)来获得该列表列表。如果mnozP的实际子集(让调用是
P)的条件匹配,我实现P和a的交集和差异,将这两个创建的集合(列表)插入最终列表。而这份清单就是我的目标。 -
@WillemVanOnsem 我想这就是 OP 想要的。