Два идентичных кода, но очень разные сообщения об ошибках в терминале

Вот мой первый код

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 и пропавший охранник не избавляется от этого предупреждения. Может быть, кто-то еще может объяснить это.

Другие вопросы по тегам