模式匹配,以防Haskell

时间:2011-03-01 00:44:27

标签: haskell pattern-matching case

我对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与第二个匹配,所以如果bs相同则会打印,否则会评估x2?并且,如果没有,是否有另一种获得预期结果的好方法?

我几乎在this question找到答案,但我认为这种情况略有不同。

1 个答案:

答案 0 :(得分:7)

您可以使用防护模式。如果MyBool b == b2匹配,则会执行第一个备选方案;否则第二种选择将被执行。

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