1

我必须计算二维 (2D) 列表 [[Int]] 中的出现次数,但出现错误。

我这样做是为了计算一维。它像这样工作正常:

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

提前致谢

4

2 回答 2

3
instances2D x = length . filter (==x) . concat

或者

instances2D y xss = sum [1 | xs <- xss, x <- xs, y == x]
于 2013-05-06T21:22:24.620 回答
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,因此您可以使用 _ 而不是变量名。

于 2013-05-09T01:10:33.733 回答