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?并且,如果没有,是否有另一种获得预期结果的好方法?
我几乎在这个问题上找到了答案,但我认为这种情况略有不同.
您可以使用防护模式.如果MyBool匹配, 将执行第一个替代方案b == b2; 否则将执行第二个替代方案.
case result of
MyBool b2 | b == b2 -> do {print b; return $ MyBool b}
_ -> eval x2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2440 次 |
| 最近记录: |