  Functional logic languages can solve equations over user-defined data and
functions. Thus, the definition of an appropriate meaning of equality has a
long history in these languages, ranging from reflexive equality in early
equational logic languages to strict equality in contemporary functional logic
languages like Curry. With the introduction of type classes, where the equality
operation "==" is overloaded and user-defined, the meaning became more complex.
Moreover, logic variables appearing in equations require a different typing
than pattern variables, since the latter might be instantiated with functional
values or non-terminating operations. In this paper, we present a solution to
these problems by introducing a new type class "Data" which is associated with
specific algebraic data types, logic variables, and strict equality. We discuss
the ideas of this class and its implications on various concepts of Curry, like
unification, functional patterns, and program optimization.
