Два идентичных кода, но очень разные сообщения об ошибках в терминале
Вот мой первый код
maybe_devide :: Maybe Integer -> Maybe Integer -> Maybe Integer
maybe_devide maybeX maybeY = case (maybeX, maybeY) of
(Just x, Just y)
|x/=0 && y/=0 -> Just (div x y)
|x==0 && y/=0 -> Just 0
|x/=0 && y==0 -> Nothing
(Nothing, Just y) -> Nothing
(Just x, Nothing) -> Nothing
И сообщение об ошибке для кода 1 показано ниже:
[1 of 1] Compiling Main ( test2.hs, interpreted )
test2.hs:1:246: parse error on input `->'
Failed, modules loaded: none.
Вот второй код, написанный моим другом Брайаном Оливье:
maybe_devide :: Maybe Integer -> Maybe Integer -> Maybe Integer
maybe_devide maybeX maybeY = case (maybeX, maybeY) of
(Just x, Just y)
|x/=0 && y/=0 -> Just (div x y)
|x==0 && y/=0 -> Just 0
|x/=0 && y==0 -> Nothing
(Nothing, Just y) -> Nothing
(Just x, Nothing) -> Nothing
Однако в этот раз сообщение об ошибке будет другим:
Warning: Pattern match(es) are non-exhaustive
In a case alternative:
Patterns not matched:
(Nothing, Nothing)
(Just _, Just _)
test.hs:7:18: Warning: Defined but not used: `y'
test.hs:8:9: Warning: Defined but not used: `x'
Ok, modules loaded: Main.
*Main>
3 ответа
На самом деле мне удалось скомпилировать оба этих фрагмента в ghci (версия 7.4.2). Что-то, на что нужно обратить внимание, это использование табуляции вместо пробелов (которые могли быть потеряны при вставке в SO и форматировании).
Сообщения, появляющиеся в вашем втором фрагменте, являются просто предупреждениями компилятора. Вы можете немного очистить свой код, используя встроенное сопоставление с образцом вместо case
, Вот эквивалентная функция:
divide :: Maybe Integer -> Maybe Integer -> Maybe Integer
divide (Just x) (Just y)
| y == 0 = Nothing
| otherwise = Just (div x y)
divide _ _ = Nothing
Ваша первая ошибка в строке 1, символ 246, предполагает, что вы потеряли все форматирование перед компиляцией.
Ваш компилятор более требователен, чем мой, но вы явно упускаете (Nothing,Nothing)
дело. (Just _, Just _)
Я могу объяснить только случай, так как вы тоже скучаете | x== 0 && y == 0
, но я не уверен в этом.
РЕДАКТИРОВАТЬ: я воспроизвел предупреждения, используя -Wall
на ghc
и пропавший охранник не избавляется от этого предупреждения. Может быть, кто-то еще может объяснить это.