[英]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.