这是我演讲笔记中的一个简单代码。我不太了解它。任何人都可以向我解释“案例(eval e1,eval e2)”的含义是什么。根据我的理解,这个命令应该适用于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"
答案 0 :(得分:1)
case
语句有点像来自其他语言的switch
语句。 case
和of
之间的表达式按顺序与每个模式匹配,直到匹配为止。最后一种情况_
匹配所有内容,有点像Java switch语句中的default
情况。
e.g。
-- 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"