[英]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)
;
我需要一个 boolean 指示它的给定实例是否属于add
类型:
isAdd(add(var("x"), const(3))); // true
isAdd(var("x")); // false
isAdd(const(3)); // false
isAdd(mult(var("x"), const(3))); //false
也许它存在一个内置的 function 或运算符,这将是一个比以下更通用的解决方案:
bool isAdd(add(Expr lhs, Expr rhs)) = true;
bool isAdd(Expr e) = false;
确实有一个内置运算符is
: isAdd(expr) = expr is add
。
在罗丹的回答旁边,存在is
运算符无法区分重载运算符的情况。 在这种情况下,手写谓词确实有帮助,但使用默认修饰符来捕捉错误情况:
假设我们还有一个三元加法,`data Expr = add(Expr, Expr, Expr) 那么这只会对二元替代方案成立;
bool isAdd(add(_, _)) = true;
default bool isAdd(Expr _) = false;
或者,如果您希望内联匹配谓词,则:=
运算符也是 Boolean 表达式:
if(add(_, _) := myExpr) ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.