2014-11-06 4 views
1

Проблема заключается в следующем:определить конкретный вид конструктора для ADT в мошенника

data Scalar=type1()|type2()|... 

data Expr=scalar(Scalar aType)| secondForm(..) | thirdForm(..) |.. 

case Expr ee:binaryOperation(Expr e1,Expr e2, Op opern): 
    //do something useful 

Как я могу указать условие для определения типа e1 и e2, и принимать меры в дальнейшем, например,

if(e1 != scalar(_)) //do something useful 
    if(e2 != scalar(_)) //do something useful 

ответ

1

У вас есть (как минимум) три варианта.

Во-первых, вы можете включить, что в случае:

case Expr ee:binaryOperation(Expr e1:scalar(_), Expr e2, Op opern) : 

В этом случае вам будет нужен второй, более общий случай для того, когда e1 не scalar:

case Expr ee:binaryOperation(Expr e1, Expr e2, Op opern) : 

Это должен быть ниже первого. Я не большой поклонник упорядочивания зависимостей, поэтому это не решение, которое я бы использовал.

Во-вторых, вы можете сопоставить это с вашим условным. Это соответствует, если это scalar:

if(scalar(_) := e1) 

и это соответствует, если это не так:

if(scalar(_) !:= e1) 

Если вам нужно содержание - значение внутри scalar - вы хотели бы поставить переменной, чтобы связать его в матче.

В-третьих, вы можете использовать is оператор:

if(e1 is scalar) 

или

if (!(e1 is scalar)) 

позволит вам проверить e1 есть, или нет, построена с использованием scalar. Оператор is действительно говорит, что «главный конструктор для e1 - это scalar», и если это все, что вам нужно знать, это проще, чем писать совпадение.

+0

спасибо! настолько очевидным и все же неуловимым. Я продолжал писать, если (e1: = scalar (_)), но я не думаю, что это сработало. Почему упорядочение e1 и скаляра важно во время сопоставления с образцом, или это так? –

+0

Один способ подумать о сопоставлении с образцом - более общая форма назначения. В выражении/выражении присваивания на большинстве языков вы также записываете получающее выражение слева и производящее выражение справа. То же самое с оператором сопоставления шаблонов: шаблон слева, значение справа. Сторона значения вычисляет/строит новые значения, а шаблон связывает/деконструирует их. Примеры: 'a: = 1',' : = <1,2> ',' (str name) (a, b): = f (1,2) ' – jurgenv

+0

спасибо, но расширяя обсуждение, то, что тогда принципиально отличается между присвоение и привязка шаблонов? –