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 ...