【发布时间】:2011-03-01 09:16:19
【问题描述】:
我是 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找到了答案,但我认为这种情况略有不同。
【问题讨论】:
标签: haskell pattern-matching case