[英]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.