Существует несколько решения вашей проблемы в зависимости от вашего намерения: хотите ли вы сделать манифест в своем типе, что ваша функция может потерпеть неудачу (и в этом случае вы хотите вернуть причину сбоя, что может быть ненужным, если есть только один мод e неудачи, как здесь), или вы считаете, что получение пустого списка в этой функции не должно происходить вообще, и поэтому хотите немедленно сбой и выброс исключения?
Так что, если вы хотите, чтобы сделать явную возможность отказа в вашем типе, вы можете использовать Может быть, просто указать отказ без объяснения причин (в конце концов, в документации):
take :: (Eq a) => [a] -> [a] -> Maybe Bool
take [] _ = Nothing
take x y = x == y
или любой зарегистрировать причину провала (обратите внимание, что либо будет ответом на «возвращение двух типов из одной функции» в общем, если ваш код более специфичен):
take :: (Eq a) => [a] -> [a] -> Either String Bool
take [] _ = Left "Empty list"
take x y = Right $ x == y
Наконец, вы можете сигнализировать, что эта неудача абсолютно ненормально и может не обрабатываться локально:
take :: (Eq a) => [a] -> [a] -> Bool
take [] _ = error "Empty list"
take x y = x == y
Обратите внимание, что с этим последним способом, сайт вызова не нужно сразу обращаться провал, ведь она не может, так как исключения могут быть перехвачены только в монаде IO. С помощью первых двух способов сайт вызова должен быть изменен, чтобы обрабатывать случай сбоя (и может), если только сам вызов вызывает «ошибку».
Существует один окончательное решение, которое позволяет вызывающий код, чтобы выбрать, какой режим отказа вы хотите (с использованием пакета отказа http://hackage.haskell.org/package/failure):
take :: (Failure String m, Eq a) => [a] -> [a] -> m Bool
take [] _ = failure "Empty list"
take x y = return $ x == y
Это имитирует Может и решение Либо, или вы можете использовать в качестве IO Bool, который будет генерировать исключение, если он терпит неудачу. Он может работать даже в контексте [Bool] (возвращает пустой список в случае сбоя, что иногда полезно).
Это было бы неверно на типизированных императивных языках, таких как C и Java. –