Navigation
Synopsis Type constraints restrict the acceptable type for parameters.
Syntax &Name <: Type
Description Constraints can be imposed on the actual types to which a type parameter may be bound. This is expressed by a subtype constraint which expresses that actual types bound to Name should be a subtype of Type.
Examples Here is the definition of the absolute value function abs from the Number library:
public &T <: num abs(&T <: num N)
{
	return N >= 0 ? N : -N;
}
The argument N is constrained to be at most of type num.
rascal>import util::Math;
ok
rascal>abs(-3);
int: 3
rascal>abs(-3.5);
real: 3.5
Here is an example from the Node library:
&T <: node setAnnotations(&T <: node x, map[str, value] annotations);
(we don't give the body of this function since it has been implemented in Java). setAnnotations takes a value of any type that is at most node and adds annotations to it. This makes it possible to set annotations on any AlgebraicDataType.
rascal>import Node;
ok
rascal>nd = "f"(10, "abc");
node: "f"(10,"abc")
First we apply setAnnotations to a node value:
rascal>setAnnotations(nd, ("color" : "red", "size" : "large"));
node: "f"(10,"abc")[
  @size="large",
  @color="red"
]
Next, we introduce a new data type Suite:
rascal>data Suite = hearts() | diamonds() | clubs() | spades();
ok
rascal>st = diamonds();
Suite: diamonds()
And apply setAnnotations to a value of type Suite:
rascal>setAnnotations(st, ("player" : "Hossein", "gain" : "120"));
Suite: diamonds()[
  @player="Hossein",
  @gain="120"
]
Is this page unclear, or have you spotted an error? Please add a comment below and help us to improve it. For all other questions and remarks, visit ask.rascal-mpl.org.