2017-03-14 45 views
1

我是Haskell的新手,嘗試製作一個網格函數,它將網格中的所有座標作爲列表返回。我想過濾這個列表來刪除任何座標,其中x = y給定爲[(x,y)](實質上是擺脫網格中的所有對角線座標),但我不知道如何去做。任何幫助/指針將不勝感激。如何從列表中刪除某些座標

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

回答

1

您應該使用過濾器。

下斷言是True非對角線元素:

predicate (x,y)=x/=y 

然後你可以定義過濾器:

gridFilter $ grid 2 

產量:

gridFilter g=filter predicate g 

與運行它

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

當然,你也可以把它一個班輪:使用過濾器(x /= y

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

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

@丹尼爾的答案是更簡單,如果他已經有一個列表理解imho –

2

你的功能是不夠好,只是把它添加過濾器列表解析非常簡單,並描述了你試圖完成的任務。

+0

像大多數語言使用的,Haskell使用'/ ='而不是'!='。 (我不知道爲什麼Haskell沒有在這裏拷貝C,例如'&&','||'和'==') – chi

+0

@chi,正好,我錯過了,謝謝修復它。 – Netwave