我有一个元组列表,我试图使用它的元素来访问嵌套列表的元素。
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]]
这显然不起作用,因为!!运算符需要整数才能处理,但映射返回列表。任何建议都非常感谢。
答案 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)]
使用!!
可能不是您的最佳选择,但事实上它可能不是。我试图打破问题的两个部分,据我所知,访问元素并过滤索引。