如何从列表中删除某些坐标

时间:2017-03-14 11:30:32

标签: haskell

我是Haskell的新手并且正在尝试创建一个网格函数,该函数将网格中的所有坐标作为列表返回。我想过滤此列表以删除x = y给定[(x,y)]的任何坐标(基本上摆脱了网格中的所有对角线坐标),但我不知道该怎么做。任何帮助/指针将不胜感激。

grid :: Int -> [(Int,Int)]
grid n = [(x,y) | x <- [0..n], y <- [0..n]]

2 个答案:

答案 0 :(得分:2)

你的功能足够好,只需在其上添加一个过滤器:

grid :: Int -> [(Int,Int)]
grid n = [(x,y) | x <- [0..n], y <- [0..n], x /= y]

在列表推导中使用过滤器(x /= y)非常简单,并描述了您尝试完成的任务。

答案 1 :(得分:1)

你应该使用过滤器。

对于非对角元素,以下谓词为True

 predicate (x,y)=x/=y

然后您可以定义过滤器:

gridFilter g=filter predicate g

使用以下命令运行:

gridFilter $ grid 2

收率:

[(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]

当然你也可以把它变成一个单行:

gridFiltered=filter (\(x,y)->x/=y) $ grid 2