This paper gives a brief overview of Miranda followed by a more detailed discussion of algebraic and abstract data types. At the time this paper was written the language had not quite stabilised. These points should be noted:
1) Algebraic data types with laws were eventually dropped from the Miranda language. The argument against having constructors with laws is that they complicate reasoning about algebraic data types and that what they do can be accomplished more efficiently by data type abstraction.
2) The paper implies that Miranda has both list- and set comprehensions. The latter were dropped from the language in 1986. They were misleading as there was no set type - they generated (potentially infinite) lists from which duplicates had been removed. This proved very inefficient. The expression on page 3 of the paper which searches for counter examples to Fermat's Last Theorem would now be written
[ [a,b,c,n] // a,b,c,n <- [3..]; a^n + b^n = c^n ]The "//" indicates a diagonalising list comprehension, which interleaves its generators (but does not remove duplicates). See Miranda manual section 13. Iterative expressions.
3) In early versions of Miranda guarded equations were written without an if after the comma.