簡體   English   中英

Haskell模式匹配中的錯誤

[英]An error in Haskell pattern matching

這是我的實驗問題之一,我必須編寫一個maybeDiv函數,這是我的工作。 Just xy存在錯誤,請問是什么原因導致此錯誤? 謝謝。

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

我的PC當前正在忙於制作大型動畫,因此無法檢查。 除非有人糾正我,否則我以后再檢查。

但這將不起作用,因為x/y不是整數。 您寧願要Double 所以:

maybeDiv :: Maybe Integer -> Maybe Integer -> Maybe Double
maybeDiv mx my = case (mx, my) of
    (Just x, Just y)
      | y == 0 -> Nothing
      | otherwise -> Just (fromInteger x / fromInteger y)
    _ -> Nothing

編輯

如果不允許您使用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)

您也可以泛化該函數以使其接受IntegerInt類型,如下所示:

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

這最終將等同於其他答案,但是可能更容易閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM