1

这是我讲义中的一个简单代码。我不太明白。谁能向我解释“case (eval e1, eval e2) of”的含义。据我了解,这个命令应该适用于 const Int。没有关于 eval e1->bool 的讨论。

-- Simple expressions
--
data Expr = Const Int
          | Add   Expr Expr       -- arguments must be Ints
          | Equal Expr Expr       -- arguments must be of same type
          | If    Expr Expr Expr  -- 1st argument must be a Bool

-- Evaluation results
--
data Value = IntV  Int
           | BoolV Bool
           deriving Show

-- Evaluate a simple expression.
--
eval :: Expr -> Value
eval (Const i)     = IntV i
eval (Add e1 e2)   = 
  case (eval e1, eval e2) of
    (IntV i1, IntV i2) -> IntV $ i1 + i2
    _                  -> error "Add: Int expected"
eval (Equal e1 e2) =
  case (eval e1, eval e2) of
    (IntV  i1, IntV  i2) -> BoolV $ i1 == i2
    (BoolV b1, BoolV b2) -> BoolV $ b1 == b2
    _                    -> error "Equal: same types expected"
eval (If ec et ee) =
  case eval ec of
    BoolV flag
      | flag      -> eval et
      | otherwise -> eval ee
    _             -> error "If: conditional must be Bool"
4

1 回答 1

1

case语句有点像其他语言的语句switchcasethe和 the之间的表达式of按顺序匹配每个模式,直到一个匹配。最后一个 case_匹配所有内容,有点像defaultJava switch 语句中的 case。

例如

-- simple data type which just wraps a value
data Foo a = Foo a

n = Foo 1

describe :: Foo Int -> String
describe n = case n of
               Foo 0 -> "Zero"
               Foo 1 -> "One"
               Foo 2 -> "Two"
               _     -> "Every other Foo Int!"

您的代码中的示例将两个表达式组合在一个元组中,以便它们可以同时进行模式匹配:

case (eval e1, eval e2) of
    (IntV i1, IntV i2) -> IntV $ i1 + i2
    _                  -> error "Add: Int expected"

它比单独匹配更方便且更短,这可能看起来像这样:

case eval e1 of
    IntV i1 -> case eval e2 of
                   IntV i2 -> IntV $ i1 + i2
                   _       -> error "Add: Int expected"
    _       -> error "Add: Int expected"
于 2013-06-29T08:41:47.533 回答