这是我的第一个代码
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>
答案 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
重现了警告,失踪的警卫没有摆脱这个警告。也许其他人可以解释那个。