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

时间:2013-03-19 22:06:23

标签: list haskell

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

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]] 
这显然不起作用,因为!!运算符需要整数才能处理,但映射返回列表。任何建议都非常感谢。

2 个答案:

答案 0 :(得分:6)

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

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

所以我们需要做的就是使用!!然后再对第一个结果使用它。

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

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

现在把两者放在一起就可以了。

答案 1 :(得分:3)

所以你可以用:

查看一个元素
> list !! 1 !! 2
"m"

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

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

并允许filter指出那些未指向&#34; a&#34;

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

如果相反     list = [[&#34; c&#34;,&#34; a&#34;,&#34; b&#34;],[&#34; k&#34;,&#34; l&#34; &#34;&#34;]]

然后

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

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