如何使用元组的元素作为索引来到达列表的元素-haskell

Kar*_*ana 2 haskell list

我有一个元组列表,我试图使用它的元素来达到嵌套列表的元素.

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)

这显然不起作用,因为!! 运算符需要整数才能处理,但映射返回列表.任何建议都非常感谢.

Tik*_*vis 6

你真的有两个不同的问题:给定两个数字,你如何索引一个嵌套列表,你如何从一个元组中得到两个数字.

第一个问题很容易通过查看类型来解决.你知道如何索引到一个列表:(!!) :: [a] -> Int -> a.在这里,a可以是任何东西,包括嵌套列表.所以,鉴于[[[Char]]],我们可以!!用来获得一个[[Char]].而且,由于这是一个列表本身,我们可以!! 再次使用来获得一个[Char].([Char]只是String,如果你没有意识到.)

所以我们在这里需要做的就是使用!!然后再使用第一个结果.

现在,我们如何实际获得两个数字?这是我们使用模式匹配的地方.我们可以使用let语句匹配元组:

let (i, j) = tuple in ...
Run Code Online (Sandbox Code Playgroud)

现在只需将两者放在一起就可以了.