返回该宽度和高度的网格中每个可能坐标的列表

Returning a list of every possible coordinate in a grid of that width and height

所以我正在编写一个函数 allCoords,其中 return 是宽度 w 和高度 h 的网格中每个可能坐标的列表 widthheight 必须是非负整数才能 return 一个合理的结果。

示例:allCoords 3 2 应该 return [(0,0),(0,1),(0,2),(1,0),(1,1),(1,2)]

这就是我目前所掌握的全部内容,但我什至不知道如何开始编写函数

type GridCoord = (Int, Int)

allCoords :: Int -> Int -> [GridCoord]

您可以使用 list comprehension

[ (x,y) | x <- [0..1], y <- [0..2] ]

将在您的示例中给出列表。

您的函数需要定义为:

type GridCoord = (Int, Int)

allCoords :: Int -> Int -> [GridCoord]
allCoords height width = [ (x,y) | x <- [0..width-1], y <- [0..height-1] ]

range 函数可以做到这一点。

import Data.Ix
allCoords h w = range ((0,0), (w,h))

我们可以利用列表的 FunctorApplicative 实例来生成此列表:

allCoords :: (Num a, Enum a, Num b, Enum b) => a -> b -> [(a, b)]
allCoords h w = (,) <$> [0 .. h-1] <*> [0 .. w-1]

此处 (,) <$> [0 .. h-1] 将生成一个函数列表 b -> (a, b),其中元组的第一项已填入。启用 TupleSection 后,此列表等同于 [(0,), (1,), …, (w-1,)].

然后 (<*>) 函数将从这个列表中获取一个函数,并且对于每个这样的函数在列表 [0 .. w-1] 中的每个值上调用它,从而构造 2 元组。

例如:

Prelude> allCoords 3 4
[(0,0),(0,1),(0,2),(0,3),(1,0),(1,1),(1,2),(1,3),(2,0),(2,1),(2,2),(2,3)]