Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell模式匹配中的一个错误_Haskell - Fatal编程技术网

Haskell模式匹配中的一个错误

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函数,这是我的工作。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)
    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