哪个替代方案是 ADT 的实例?
Which alternative is that instance of a ADT?
我定义了一个 AlgebraicDataType 及其实例:
data Expr = const(int n)
| var(str name)
| add(Expr lhs, Expr rhs)
| mult(Expr lhs, Expr rhs)
;
我需要一个布尔值来指示它的给定实例是否属于 type add
:
isAdd(add(var("x"), const(3))); // true
isAdd(var("x")); // false
isAdd(const(3)); // false
isAdd(mult(var("x"), const(3))); //false
也许它存在一个内置函数或运算符,这将是比 :
更通用的解决方案
bool isAdd(add(Expr lhs, Expr rhs)) = true;
bool isAdd(Expr e) = false;
确实有一个内置运算符is
:isAdd(expr) = expr is add
。
在 Rodin 的回答旁边,存在 is
运算符无法区分重载运算符的情况。在这种情况下,手写谓词确实有帮助,但使用默认修饰符来捕获错误情况:
假设我们还有一个三元加法,`data Expr = add(Expr, Expr, Expr) 那么这只会对二元替代给出真值;
bool isAdd(add(_, _)) = true;
default bool isAdd(Expr _) = false;
或者,如果您希望内联匹配谓词,那么 :=
运算符也是一个布尔表达式:
if(add(_, _) := myExpr) ...
我定义了一个 AlgebraicDataType 及其实例:
data Expr = const(int n)
| var(str name)
| add(Expr lhs, Expr rhs)
| mult(Expr lhs, Expr rhs)
;
我需要一个布尔值来指示它的给定实例是否属于 type add
:
isAdd(add(var("x"), const(3))); // true
isAdd(var("x")); // false
isAdd(const(3)); // false
isAdd(mult(var("x"), const(3))); //false
也许它存在一个内置函数或运算符,这将是比 :
更通用的解决方案bool isAdd(add(Expr lhs, Expr rhs)) = true;
bool isAdd(Expr e) = false;
确实有一个内置运算符is
:isAdd(expr) = expr is add
。
在 Rodin 的回答旁边,存在 is
运算符无法区分重载运算符的情况。在这种情况下,手写谓词确实有帮助,但使用默认修饰符来捕获错误情况:
假设我们还有一个三元加法,`data Expr = add(Expr, Expr, Expr) 那么这只会对二元替代给出真值;
bool isAdd(add(_, _)) = true;
default bool isAdd(Expr _) = false;
或者,如果您希望内联匹配谓词,那么 :=
运算符也是一个布尔表达式:
if(add(_, _) := myExpr) ...