我正在编写一个名为allCoords
的函数,它返回一个包含网格宽度w
和高度h
中所有可能坐标的列表。 width
和height
必须是非负整数才能返回合理结果。
例如:allCoords 3 2
应返回[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2)]
这是我目前编写的全部内容,但我不知道如何开始编写这个函数。
type GridCoord = (Int, Int)
allCoords :: Int -> Int -> [GridCoord]
我正在编写一个名为allCoords
的函数,它返回一个包含网格宽度w
和高度h
中所有可能坐标的列表。 width
和height
必须是非负整数才能返回合理结果。
例如:allCoords 3 2
应返回[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2)]
这是我目前编写的全部内容,但我不知道如何开始编写这个函数。
type GridCoord = (Int, Int)
allCoords :: Int -> Int -> [GridCoord]
[ (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] ]
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)]