例如,给出一对配对列表
[(1, 2), (1, 3), (1, 4), (2, 1), (3, 1), (4, 1)]
Run Code Online (Sandbox Code Playgroud)
所以,我试图删除对重复,我认为一对是重复if(x,y)==(y,x),例如:(1,2)with(3,1)
我正在生成带有理解列表的列表,它来自一个列表
MyList = [(intA, intB) | x <- integerList, y <- integerList, x /= y]
integerList = [1, 2, 3];
Run Code Online (Sandbox Code Playgroud)
请注意,我写的第一件事只是我想要发生的事情的一个例子,它不是上面的理解列表的输出.
我最近开始使用Haskell,我该如何解决这个问题?什么是最好的选择?我尝试使用地图,但没有成功,我应该将地图与在其中使用反向的foldl/foldr组合吗?我该怎么办?
这是使用Hoogle的最佳时机!让我们考虑一下你在寻找什么.要删除重复项,我们需要一些能够获取列表[a]并从中删除内容的内容,并[a]根据某些谓词返回a -> a -> Bool.这意味着我们正在寻找具有以下形式的功能:
ourFunction :: (a -> a -> Bool) -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)
我们实际上可以使用函数签名搜索Hoogle(a -> a -> Bool) -> [a] -> [a],并且第一个结果是nubBy,这正是我们想要的!
话虽这么说,你不需要用它来解决你的问题.你已经走在正确的轨道上了.想想你在问什么 - 你想要没有重复的元组(x, y) == (y, x).因此,只需选择您是否需要y < x或反过来,并在列表理解中使用它:
> let fn xs = [(a, b) | a <- xs, b <- xs, a < b]
> fn [1, 2, 3]
[(1,2),(1,3),(2,3)]
Run Code Online (Sandbox Code Playgroud)
如果你需要两个列表(一个有重复,一个没有),我建议使用两个单独的列表推导.它的性能较差,因为你编写的列表理解是O(n ^ 2),但在我看来,它更清晰,更容易学习.