Какой альтернативой является этот экземпляр ADT? - PullRequest
1 голос
/ 17 апреля 2020

Я определил AlgebraicDataType и его экземпляр:

data Expr = const(int n)
          | var(str name)
          | add(Expr lhs, Expr rhs)
          | mult(Expr lhs, Expr rhs)
          ;

Мне нужно логическое значение, указывающее, имеет ли данный экземпляр тип add:

isAdd(add(var("x"), const(3)));  // true
isAdd(var("x"));                 // false
isAdd(const(3));                 // false
isAdd(mult(var("x"), const(3))); //false

Возможно, существует встроенная функция или оператор, который был бы более общим c решением, чем:

bool isAdd(add(Expr lhs, Expr rhs)) = true;
bool isAdd(Expr e) = false;

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Есть встроенный оператор is, действительно: isAdd(expr) = expr is add.

0 голосов
/ 19 апреля 2020

Рядом с ответом Родена есть случаи, когда оператор is не может различить guish между перегруженными операторами. В этом случае рукописный предикат помогает, но с использованием модификатора по умолчанию для отлова ложных случаев:

Скажем, у нас также есть троичное добавление, `data Expr = add (Expr, Expr, Expr), тогда это будет только значение true для двоичной альтернативы;

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

Или, если вы хотите sh встроить предикат совпадения, тогда оператор := также является логическим выражением:

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