繁体   English   中英

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

我需要一个 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;

确实有一个内置运算符isisAdd(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM