两个相同的代码但终端中的错误消息非常不同

时间:2013-03-31 01:31:07

标签: haskell case maybe

这是我的第一个代码

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.

这是我的朋友Bryan Olivier写的第二个代码:

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 个答案:

答案 0 :(得分:6)

我实际上能够在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 :(得分:2)

您的第一个错误位于第1行,即字符246,表示您在编译之前丢失了所有格式。

答案 2 :(得分:1)

你的编译器比我的编译器更挑剔,但你明显错过了(Nothing,Nothing)的情况。我只能解释(Just _, Just _)这个案例,因为你也错过了警卫| x== 0 && y == 0,但我不确定。

编辑:我在-Wall上使用ghc重现了警告,失踪的警卫没有摆脱这个警告。也许其他人可以解释那个。