繁体   English   中英

模式匹配,Haskell

[英]Pattern-matching in case, 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与case部分中的b不同,因此,无论输入内容如何,​​此代码都将输出b。 我使用相同的名字只是为了表达我的意图。 所以我的问题是:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM