我有一个元组列表,我试图使用它的元素来达到嵌套列表的元素.
list = [["c","a","b"],["k","l","m"]]
indexTuple = [(0,1),(1,1),(1,2)]
Run Code Online (Sandbox Code Playgroud)
这样我需要检查列表中与indexTuple元素对应的元素中是否有"a".我到目前为止的尝试;
seekinga :: [[[Char]]] -> Int -> Int -> Int -> [(Int,Int)]
seekinga list x y width
| list !!(map fst indexTuple) !!(map snd indexTuple) == "a" = [(fst indexTuple,snd indexTuple)]
| otherwise = [()]
where indexTuple = [(x,y) | x <- [x-width..x+width], y <- [y-width..y+width]]
Run Code Online (Sandbox Code Playgroud)
这显然不起作用,因为!! 运算符需要整数才能处理,但映射返回列表.任何建议都非常感谢.
你真的有两个不同的问题:给定两个数字,你如何索引一个嵌套列表,你如何从一个元组中得到两个数字.
第一个问题很容易通过查看类型来解决.你知道如何索引到一个列表:(!!) :: [a] -> Int -> a.在这里,a可以是任何东西,包括嵌套列表.所以,鉴于[[[Char]]],我们可以!!用来获得一个[[Char]].而且,由于这是一个列表本身,我们可以!! 再次使用来获得一个[Char].([Char]只是String,如果你没有意识到.)
所以我们在这里需要做的就是使用!!然后再使用第一个结果.
现在,我们如何实际获得两个数字?这是我们使用模式匹配的地方.我们可以使用let语句匹配元组:
let (i, j) = tuple in ...
Run Code Online (Sandbox Code Playgroud)
现在只需将两者放在一起就可以了.