Haskell计数出现在二维列表中

时间:2013-05-06 21:13:31

标签: list haskell count 2d

我必须计算二维(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

提前致谢 问候

2 个答案:

答案 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,因此您可以使用_而不是变量名。