我对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找到答案,但我认为这种情况略有不同。
答案 0 :(得分:7)
您可以使用防护模式。如果MyBool
与和 b == b2
匹配,则会执行第一个备选方案;否则第二种选择将被执行。
case result of
MyBool b2 | b == b2 -> do {print b; return $ MyBool b}
_ -> eval x2