2

我有一个元组列表,我试图使用它的元素来访问嵌套列表的元素。

list = [["c","a","b"],["k","l","m"]]
indexTuple = [(0,1),(1,1),(1,2)]

这样,我需要检查与我的 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]] 

这显然是行不通的,因为 !! 运算符希望整数工作,但 map 返回列表。任何建议都非常感谢。

4

2 回答 2

6

您确实有两个不同的问题:给定两个数字,如何索引嵌套列表以及如何从元组中获取两个数字。

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

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

现在,我们如何真正得到这两个数字呢?这就是我们使用模式匹配的地方。我们可以用 let 语句匹配一个元组:

let (i, j) = tuple in ...

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

于 2013-03-19T22:29:08.033 回答
3

所以你可以查看一个元素:

> list !! 1 !! 2
"m"

所以让我们把它变成一个函数:

:set -XNoMonomorphismRestriction
> let index lst  i j= lst !! i !! j

filter放出那些不指向“a”的索引

> filter (\(i, j) -> index list i j == "a") indexTuple
[(0,1)]

如果改为 list = [["c","a","b"],["k","l","a"]]

然后

> filter (\(i, j) -> index list i j == "a") indexTuple
[(0,1),(1,2)]

使用!!可能不是您的最佳选择,但实际上可能不是。据我了解,我试图打破问题的两个部分,访问元素并过滤索引。

于 2013-03-19T22:28:13.820 回答