返回一个宽高分别为指定值的网格中每个可能坐标的列表。

9

我正在编写一个名为allCoords的函数,它返回一个包含网格宽度w和高度h中所有可能坐标的列表。 widthheight必须是非负整数才能返回合理结果。

例如:allCoords 3 2应返回[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2)]

这是我目前编写的全部内容,但我不知道如何开始编写这个函数。

type GridCoord = (Int, Int)

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

如果你已经“拥有它”,那么问题是什么?请注意,编辑不应使现有答案无效。 - Will Ness
3个回答

9
你可以使用列表推导式来完成这个任务。
[ (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] ]

4

range函数实现了这个功能。

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

2
我们可以利用列表的 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)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接