Features of Curry

To get an idea of the multi-paradigm programming language Curry, here is an (incomplete) list of its features:

  • Program entities: Functions defined by equations (predicates are considered as Boolean functions or constraints)
  • Syntax: Almost similar to Haskell. In addition, declarations of free variables are allowed and program rules might overlap (leading to nondeterministic computations).
  • Type system: Parametric polymorphism (a la Hindley/Milner) and overloading via type classes
  • Operational semantics: Basically, lazy reduction of functional expressions. However, function calls may contain free (logic) variables. Such function calls may be evaluated by non-deterministic instantiation of a variable or suspended until a variable becomes instantiated (e.g., by solving some predicate), i.e., this operational semantics combines the ideas of “narrowing” and “residuation”. This operational semantics was firstly described in a POPL’97 paper and another detailed description can be found in the Curry report.
  • Higher-order functions: As usual where function application is delayed if functional values are unknown (i.e., free variables).
  • Declarative (monadic) I/O
  • (Equational) constraints where Curry system can support the concurrent evaluation of constraints
  • Encapsulated search to control the exploration of the search space (based on this feature, several predefined search strategies like depth-first search, breadth-first search, best solution search etc. are available)

These are the basic features of the kernel language. Look into the Curry report if you are interested in more details. Further features might be available in different extensions of this kernel language.