2013-05-06 3 views
1

Мне нужно подсчитать вхождения в двумерный (2D) список [[Int]], но я получаю ошибки.Ошибки подсчета Haskell в двумерных списках

Что я пробовал, так это считать 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 

Заранее спасибо Приветствия

ответ

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

или

instances2D y xss = sum [1 | xs <- xss, x <- xs, y == x] 
+0

спасибо, я пытаюсь, и я сообщу об этом через мгновение. – John

+0

, но 'экземпляры2D x = длина. filter (== x). concat'. не будет работать, поскольку длина подсчитывает каждый символ, поэтому он будет работать в течение 0 до 9. Если вы поместите более одной цифры для числа, тогда он будет считать каждую цифру как одно из случаев – John

+0

, но я мог бы разделить ее на себя , так что я получаю для каждого элемента 1 и получаю его длину, правильно? – John

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 независимо от того, какое значение вы ищете, поэтому вы можете использовать _ вместо имени переменной.

Смежные вопросы