簡體   English   中英

模式匹配,Haskell

[英]Pattern-matching in case, Haskell

我對Haskell並不陌生,並且對模式匹配有疑問。 這是代碼的簡化版本:

data Value = MyBool Bool | MyInt Integer

codeDuplicate1 :: Value -> Value -> IO Value
codeDuplicate1 = generalFunction True 

codeDuplicate2 :: Value -> Value -> IO Value
codeDuplicate2 = generalFunction False 

generalFunction :: Bool -> Value -> Value -> IO Value
generalFunction b x1 x2 = do result <- eval x1 
                             case result of
                               MyBool b -> do putStrLn $ show b
                                              return (MyBool b)   
                               _        -> eval x2

eval :: Value -> IO Value
eval (MyInt x) | x > 10    = return (MyInt 10)
               | x > 5 = return (MyBool True)
               | otherwise = return (MyBool False)

現在,我意識到generalFunction中的參數b與case部分中的b不同,因此,無論輸入內容如何,​​此代碼都將輸出b。 我使用相同的名字只是為了表達我的意圖。 所以我的問題是:

有沒有辦法將第一個b與第二個b匹配,以便如果b相同,它將打印,否則它將評估x2? 而且,如果沒有,還有另一種好的方法來獲得預期的結果嗎?

我幾乎找到了這個問題的答案,但我認為這種情況略有不同。

您可以使用保護模式。 如果MyBool被匹配並且 b == b2 ,則將執行第一個選擇; 否則將執行第二種選擇。

case result of
  MyBool b2 | b == b2 -> do {print b; return $ MyBool b}
  _ -> eval x2

暫無
暫無

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

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