模式匹配,以防Haskell

Hja*_*mar 1 haskell case pattern-matching

我对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)
Run Code Online (Sandbox Code Playgroud)

现在,我意识到generalFunction中的参数b与case部分中的b不同,因此,无论输入如何,此代码都将打印b.我使用相同的名字只是为了显示我的意图.所以我的问题是:

有没有办法将第一个b与第二个匹配,所以如果bs是相同的,它将打印,否则它将评估x2?并且,如果没有,是否有另一种获得预期结果的好方法?

我几乎在这个问题上找到了答案,但我认为这种情况略有不同.

Hea*_*ink 8

您可以使用防护模式.如果MyBool匹配, 将执行第一个替代方案b == b2; 否则将执行第二个替代方案.

case result of
  MyBool b2 | b == b2 -> do {print b; return $ MyBool b}
  _ -> eval x2
Run Code Online (Sandbox Code Playgroud)