List 如何使用元组';s元素作为索引以到达列表';s元素哈斯克尔

List 如何使用元组';s元素作为索引以到达列表';s元素哈斯克尔,list,haskell,List,Haskell,我有一个元组列表,我试图使用它的元素来访问嵌套列表的元素 list = [["c","a","b"],["k","l","m"]] indexTuple = [(0,1),(1,1),(1,2)] 这样,我需要检查列表中与我的索引元素相对应的元素之一是否有“a”。我迄今为止的努力 seekinga :: [[[Char]]] -> Int -> Int -> Int -> [(Int,Int)] seekinga list x y width | li

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

list = [["c","a","b"],["k","l","m"]]
indexTuple = [(0,1),(1,1),(1,2)]
这样,我需要检查列表中与我的索引元素相对应的元素之一是否有“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]] 
seekinga::[[[Char]]->Int->Int->Int->Int->[(Int,Int)]
查看列表x y宽度
|名单!!(映射fst索引)!!(映射snd索引)=“a”=[(fst索引,snd索引)]
|否则=[()]

其中indexTuple=[(x,y)| x,因此您可以通过以下方式查看元素:

> list !! 1 !! 2
"m"
让我们把它变成一个函数:

:set -XNoMonomorphismRestriction
> let index lst  i j= lst !! i !! j
并让
过滤出那些不指向“a”的索引

如果相反 列表=[“c”、“a”、“b”]、[“k”、“l”、“a”]]

然后


使用
!!
可能不是您的最佳选择,但事实上可能不是。据我所知,我试图解决问题的两个部分,即访问元素和筛选索引。

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

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

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

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

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

现在只要把这两者放在一起,你就可以了。

我认为你在激励如何用正确的问题解决技巧解决问题方面做得更好,而不是像我那样直接跳进代码中。顺便问一下:set-XNoMonomorphismRestriction thing做了什么,你能解释一下吗?可以解释一些。试着定义
let a=(+)
在设置单态限制和不设置单态限制的ghci中,使用
:ta
查找a的类型以查看其效果的示例。
> filter (\(i, j) -> index list i j == "a") indexTuple
[(0,1),(1,2)]
let (i, j) = tuple in ...