哪个替代方案是 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;

确实有一个内置运算符isisAdd(expr) = expr is add

在 Rodin 的回答旁边,存在 is 运算符无法区分重载运算符的情况。在这种情况下,手写谓词确实有帮助,但使用默认修饰符来捕获错误情况:

假设我们还有一个三元加法,`data Expr = add(Expr, Expr, Expr) 那么这只会对二元替代给出真值;

 bool isAdd(add(_, _)) = true;
 default bool isAdd(Expr _) = false;

或者,如果您希望内联匹配谓词,那么 := 运算符也是一个布尔表达式:

 if(add(_, _) := myExpr) ...