【发布时间】:2015-12-07 16:37:34
【问题描述】:
我有这样的事情:
[[1,3,2],[5,6],[3,8],[10,11],[13,6]]
而我想过滤掉第三个也是最后一个列表,让它变成:
[[1,3,2],[5,6],[10,11]]
如果有任何数字“出现在之前”,则逻辑是删除列表(在[3,8] 的情况下,数字3 出现在第一个列表中)。
我只能想到非 FP 方法来做到这一点。我的目标是以“好的方式”学习 Haskell。如何做到这一点?
【问题讨论】:
-
考虑在调用扫描列表的函数之间传递一组已经看到的数字。 (请记住在调用
fold期间如何传递部分结果)。 -
我没有心情对此做出正确的回答(而且效率不高),但可能的解决方案是
nubBy (\l m -> not . null $ intersect l m)。 -
假设你有一个列表
[[1,3,2],[5,6],[3,8],[10,11],[8],[13,6]],[8]也应该是输出的一部分吗?你没有“发出”[3,8],但可以这么说仍然观察到它。 -
@cambraca:read the documentation。当您不知道文档在哪里时,ask Hayoo。当您甚至不知道所需函数的名称时,ask Hoogle。
-
@cambraca CommuSoft 的问题不是关于
[3,8]项目——我们都同意不应该发出它——而是关于稍后出现在他们的示例输入列表中的[8]项目。一个更简短的例子是:[[0], [0,1], [1]]、[[0]]或[[0], [1]]上的行为应该是什么?