Haskell模式匹配中的一个错误
这是我的一个实验问题,我必须写一个maybeDiv函数,这是我的工作。x y中有一个错误,请问是什么原因导致了这个错误?谢谢Haskell模式匹配中的一个错误,haskell,Haskell,这是我的一个实验问题,我必须写一个maybeDiv函数,这是我的工作。x y中有一个错误,请问是什么原因导致了这个错误?谢谢 maybeDiv :: Maybe Integer -> Maybe Integer -> Maybe Integer maybeDiv mx my = case mx my of Just x y | y == 0 -> Just Nothing | otherwise -> Just (x / y) No
maybeDiv :: Maybe Integer -> Maybe Integer -> Maybe Integer
maybeDiv mx my = case mx my of
Just x y
| y == 0 -> Just Nothing
| otherwise -> Just (x / y)
Nothing -> Nothing
您的程序应该更像:
maybeDiv :: Maybe Integer -> Maybe Integer -> Maybe Integer
maybeDiv mx my = case (mx, my) of
(Just x, Just y)
| y == 0 -> Nothing
| otherwise -> Just (x / y)
_ -> Nothing
我的电脑目前正忙于制作大型动画,因此我无法检查。我以后再查,除非有人以前纠正我
但这是行不通的,因为x/y不是整数。你应该想要双人间。因此:
编辑
如果您不允许使用2元组mx,my,正如您在评论中所说,您可以:
maybeDiv :: Maybe Integer -> Maybe Integer -> Maybe Double
maybeDiv mx my =
case my of
Nothing -> Nothing
Just 0 -> Nothing
Just y -> case mx of
Nothing -> Nothing
Just x -> Just (fromInteger x / fromInteger y)
如果要将欧氏除法的商作为输出,请执行以下操作:
maybeDiv :: Maybe Integer -> Maybe Integer -> Maybe Integer
maybeDiv mx my =
case my of
Nothing -> Nothing
Just 0 -> Nothing
Just y -> case mx of
Nothing -> Nothing
Just x -> Just (x `quot` y)
您还可以对函数进行泛化,使其接受整数和Int类型,如下所示:
maybeDiv :: Integral a => Maybe a -> Maybe a -> Maybe a
maybeDiv mx my =
case my of
Nothing -> Nothing
Just 0 -> Nothing
Just y -> case mx of
Nothing -> Nothing
Just x -> Just (x `quot` y)
由于这是用于实验室的,因此可能不允许您使用Applicative-但是,为了清楚起见,以下是您的功能可以/应该是什么:
maybeDiv :: Maybe Int -> Maybe Int -> Maybe Int
maybeDiv ma mb = quot <$> ma <*> mb
这将与其他答案相同,但阅读起来可能会更简洁。这完全是语法错误…mx,Just x不是函数。Just not has type Maybe Integer.x/y通常不是整数。或者你想要欧几里德除法的商吗?即使x和y都是整数,x/y甚至不进行类型检查。你想要的是div。对不起,x/y不是整数。。。那是行不通的。我将删除我的答案。也许提问者有意引用…?谢谢,类型声明是由实验室说明设置的,我们还没有学习x,y。@Tony,那么实验室想要的输出是什么?欧几里得除法的商?再次感谢,这会有帮助的。我只需要一般的函数,但我也可以从商函数学习格式。
maybeDiv :: Maybe Int -> Maybe Int -> Maybe Int
maybeDiv ma mb = quot <$> ma <*> mb