【问题标题】:Pattern-matching in case, Haskell情况下的模式匹配,Haskell
【发布时间】: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


    【解决方案1】:

    您可以使用受保护的模式。如果MyBool 匹配 b == b2,则将执行第一个替代方案;否则将执行第二种选择。

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

    【讨论】:

    • 谢谢你,它既有效又看起来不错!我实际上尝试过这个,因为在伪代码中的另一个问题中提出了类似的建议,但我想我一定是把警卫放在了错误的地方。
    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2021-05-22
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2019-03-01
    相关资源
    最近更新 更多