2011-03-01 81 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