# 13.1 Domains vs. PackagesΒΆ

Packages are special cases of domains. What is the difference between a package and a domain that is not a package? By definition, there is only one difference: a domain that is not a package has the symbol $ appearing somewhere among the types of its exported operations. The $ denotes this domain. If the $ appears before the -> in the type of a signature, it means the operation takes an element from the domain as an argument. If it appears after the ->, then the operation returns an element of the domain.

If no exported operations mention $, then evidently there is nothing of interest to do with the objects of the domain. You might then say that a package is a boring domain! But, as you saw in Chapter ugPackages, packages are a very useful notion indeed. The exported operations of a package depend solely on the parameters to the package constructor and other explicit domains.

To summarize, domain constructors are versatile structures that serve two distinct practical purposes: Those like Polynomial and List describe classes of computational objects; others, like SortPackage, describe packages of useful operations. As in the last chapter, we focus here on the first kind.