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