2011-03-01 80 views
1

我對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是不一樣的情況下,部分B,因此,這段代碼將印片B不管輸入。我用相同的名字來表達我的意圖。所以我的問題是:

有沒有一種方法來匹配第一個B和第二個,所以如果BBS是相同的,它會打印,否則它會評估X2?而且,如果沒有,是否有另一種好方法來獲得預期結果?

我幾乎在this question找到答案,但我認爲這種情況稍有不同。

回答

5

您可以使用防護圖案。如果MyBoolb == b2匹配,則將執行第一個替代方案;否則第二個選擇將被執行。

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

謝謝,這兩個作品,看起來不錯!我實際上已經嘗試過了,因爲僞代碼中的另一個問題中提出了類似的問題,但我認爲我必須把警衛放在錯誤的地方。 – Hjalmar 2011-03-01 01:56:24