返回该宽度和高度的网格中每个可能坐标的列表
Returning a list of every possible coordinate in a grid of that width and height
所以我正在编写一个函数 allCoords
,其中 return 是宽度 w
和高度 h
的网格中每个可能坐标的列表 width
和 height
必须是非负整数才能 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))
我们可以利用列表的 Functor
和 Applicative
实例来生成此列表:
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)]
所以我正在编写一个函数 allCoords
,其中 return 是宽度 w
和高度 h
的网格中每个可能坐标的列表 width
和 height
必须是非负整数才能 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))
我们可以利用列表的 Functor
和 Applicative
实例来生成此列表:
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)]