Я пытаюсь создать функцию countElems
, которая принимает Int
и [Int]
и возвращает, сколько из этого конкретного Int
находится в списке. До сих пор у меня есть:В Haskell, как подсчитать количество конкретных Int в списке
countElems :: Int -> [Int] -> Int
countElems n (x:xs)
| xs == [] = 0
| n == x = 1 + countElems n xs
| n /= x = countElems n xs
При запуске, это похоже на работу, но при дальнейшем осмотре, если вы вводите countElems 9 [5, 3, 9, 3, 9]
выход 1
вместо 2
. Я вижу это потому, что он проверяет, что xs == []
, прежде чем увидеть, если n == x
приводит к некорректному выходу, но если я поменяю эти два случая вокруг, то говорит Non-exhaustive pattern
.
Редактировать после дальнейших размышлений:
Я мог бы устранить ошибку @ user2407038 отправил с этим кодом:
countElems :: Int -> [Int] -> Int
countElems _ [] = 0
countElems n (x:xs)
| n == x = 1 + countElems n xs
| n /= x = countElems n xs
Это выглядит менее элегантно, но работает точно так же?
Мне нравится этот ответ, поскольку он делает мой лектор ошибочным, он сказал, что нам нужны два рекурсивных случая, но это очень аккуратный способ решить эту проблему, спасибо! – benharris
@ benharris Лекторы очень часто «ошибаются» в том смысле, что то, чему они вас учат, не обязательно то, что написал бы опытный программист. В коде реального мира Haskell совсем нет рекурсии. Большинство из них могут быть реализованы с помощью библиотечных функций, что делает код более читаемым, более простым в обслуживании, менее подверженным ошибкам и так далее. – kqr