Haskell从元组列表构建列表

时间:2016-03-18 00:15:28

标签: haskell

我有一个元组列表,其中每个元组代表一个像素的行和列。我如何有效地构建一个列表,对于第一个列表中的每个(i, j)元组,新列表中i*width + j位置的元素的值是1?

1 个答案:

答案 0 :(得分:1)

首先,对点列表进行排序

let sortedPoints = sort [(0, 1), (1, 0), (1, 1)]
-- == [(0, 0), (0, 1), (1, 0)]

然后,创建所有点的列表

let allPoints = [(x, y) | x <- [0, 3], y <- [0, 3]]
-- where I chose width = 3
-- = [(0,0),(0,1),(0,2),(0,3),(1,0),(1,1),(1,2),(1,3),(2,0),(2,1),(2,2),(2,3),(3,0),(3,1),(3,2),(3,3)]

请注意,这会自动排序。

最后,编写一个逐个遍历项目的函数,并检查列表sortedPoints中的哪些项目在allPoints中

isIn::[(Int, Int)]->[(Int, Int)]->[Int]
isIn [] [] = []
isIn (first:rest) (allFirst:allRest) | first == allFirst = 1:isIn rest allRest
isIn points (_:rest) = 0:isIn points rest

然后只计算

isIn sortedPoints allPoints