fromJust
ожидает, что ему будет передано значение Just
, и он получит значение Nothing
, поэтому возникает исключение:
http://hackage.haskell.org/package/base-4.11.1.0/docs/Data-Maybe.html#v:fromJust
Обратите внимание, что я бы посоветовал вам использовать функцию maybe
, которая может помочь прояснить ваш код, я думаю (и ... возможно, найти ошибку :))
Кроме того, maybe
предпочтительнее, чем fromJust
, потому что это не частичная функция (т. Е. Гарантируется, что функция не выдаст ошибку во время выполнения)
например, он позволяет переписать:
match :: Char -> Maybe String -> Maybe String
match x input
| (isNothing input == False) && (x == head (fromJust(input))) = Just (tail (fromJust(input)))
| otherwise = Nothing
1021 * а *
match :: Char -> Maybe String -> Maybe String
match x input =
maybe
Nothing
(\i ->
if x == head i
then Just $ tail i
else Nothing)
input
Еще одна вещь: head
и tail
тоже являются частичными функциями, вы бы предпочли использовать сопоставление с образцом, как это, чтобы избежать исключений времени выполнения, когда строка пуста, например:
match :: Char -> Maybe String -> Maybe String
match x input =
maybe
Nothing
(\i -> case i of
[] -> Nothing
first:rest ->
if x == first
then Just rest
else Nothing)
input
(Edit: также, смотрите ответ @chi, который дает хорошую идиоматическую реализацию match!)