问题描述
所以我正在写一个函数allCoords
,该函数返回宽度w
和高度h
width
和{{1} }必须为非负整数,以返回有意义的结果。
示例:height
应该返回allCoords 3 2
这是我到目前为止所拥有的,但是我什至不知道如何开始编写该函数
[(0,0),(0,1),2),(1,2)]
解决方法
您可以使用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
s时,此列表等效于{{1 }}。
然后[(0,),(1,…,(w-1,)]
函数将从该列表中获取一个函数,并针对每个此类函数在列表(<*>)
中的每个值上对其进行调用,从而构造2个元组。
例如:
[0 .. w-1]