[英]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)
您也可以泛化該函數以使其接受Integer
和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
這最終將等同於其他答案,但是可能更容易閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.