我必须计算二维(2D)列表[[Int]]中的出现次数,但是我得到了错误。
我试过的是计算1D。它的工作原理如下:
instances::Int->[Int]->Int
instances x [] = 0
instances x (y:ys)
| x==y = 1+(instances x ys)
| otherwise = instances x ys
你可以帮我修改这个功能,以便计算一个2D列表:
instances::Int->[Int]->Int
提前致谢 问候
答案 0 :(得分:3)
instances2D x = length . filter (==x) . concat
或
instances2D y xss = sum [1 | xs <- xss, x <- xs, y == x]
答案 1 :(得分:0)
使用显式递归(v。隐藏递归的库函数),您只需要一个可以逐步浏览2D列表元素的函数。如果您可以编写一个遍历2D列表的每个元素并将每个子列表变为变量的函数,那么您可以在该变量上调用您的1D函数。使用模式匹配可以轻松浏览任何列表的元素:
matchesIn2DList:: Int -> [[Int]] -> Int
matchesIn2DList _ [] = 0 --> [] is an empty 2D list
matchesIn2DList x (l:ls) =
(matchesIn1DList x l) + (matchesIn2DList x ls)
请注意,在你的基本案例中:
instances x [] = 0
搜索的值无关紧要:无论您搜索的是什么值,空列表中匹配项的计数始终为0,因此您可以使用_而不是变量名。