2017-03-14 6 views
1

Ich bin neu bei Haskell und habe versucht, eine Rasterfunktion zu erstellen, die alle Koordinaten im Raster als Liste zurückgibt. Ich möchte diese Liste filtern, um alle Koordinaten zu entfernen, wo x = y gegeben [(x,y)] gegeben wird (im Wesentlichen loswerden aller diagonalen Koordinaten im Raster), aber ich bin nicht sicher, wie man es macht. Jede Hilfe/Zeiger würde geschätzt werden.So entfernen Sie bestimmte Koordinaten aus einer Liste

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

Antwort

1

Sie sollten Filter verwenden.

Das folgende Prädikat ist True für Nicht-Diagonalelemente:

predicate (x,y)=x/=y 

Dann können Sie Ihre Filter definieren:

gridFilter g=filter predicate g 

Run mit:

gridFilter $ grid 2 

Ausbeuten:

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

Natürlich können Sie es auch machen einen Einzeiler:

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

@ Daniels Antwort ist viel einfacher, wenn er bereits ein Listenverständnis hat imho –

2

Ihre Funktion war gut genug, fügen Sie einfach einen Filter auf sie:

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

unter Verwendung eines Filters (x /= y) in Die Liste Comprehensions ist ziemlich einfach und beschreibt, was Sie versuchen zu erreichen.

+0

Haskell verwendet '/ =' anstelle von '! =' Wie die meisten Sprachen verwenden. (Ich habe keine Ahnung, warum Haskell hier nicht C kopiert hat, zum Beispiel '&&', '||' und '==') – chi

+0

@chi, genau, ich habe es nur knapp verpasst, danke, dass du es behoben hast. – Netwave

Verwandte Themen