Почему я получаю исключение в моей собственной реализации и функции? - PullRequest
3 голосов
/ 22 октября 2019

Я пытаюсь написать свою собственную функцию and в Haskell. Это выглядит так:

and' :: [Bool] -> Bool
and' (x:xs) = x && and' xs

Когда я использую and' [True, True, True], это дает мне исключение:

*** Exception: 6.hs:27:1-26: Non-exhaustive patterns in function and'

Я понял, что добавление: and' _ = True решает мою проблему, но на самом деле почемуЯ должен добавить эту строку? Если мой образ мышления верен, функция должна вернуть мне True && True && True, и когда я использую эту комбинацию в ghci, она возвращает True. Не могли бы вы объяснить мне это, пожалуйста? Есть ли способ увидеть реализацию функции and в ghci?

1 Ответ

13 голосов
/ 22 октября 2019

Если мой образ мышления верен, функция должна вернуть мне True && True && True, и когда я использую эту комбинацию в ghci, она возвращает True.

Ваша and' [True, True, True] волясварить до True && True && True && <b>and' []</b>. Так как вы не написали предложение для пустого списка, он потерпит неудачу. Если бы в вашем списке было False, то он никогда бы не сделал этот вызов на and' [], поскольку False && _ вернет False, но список, содержащий только True s, таким образом, в конечном итоге сделает вызовс пустым списком.

Таким образом, вы можете решить проблему, обработав также случай пустого списка:

and' :: [Bool] -> Bool
<b>and' [] = True</b>
and' (x:xs) = x && and' xs

Если вы включите -Wincomplete-patterns предупреждение [ghc-doc] , в нем будут перечислены шаблоны, которые вы не реализовали.

...