<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >Restricted type synonyms</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="The Hugs 98 User's Guide" HREF="index.html"><LINK REL="UP" TITLE="Hugs-specific language extensions" HREF="hugs-only.html"><LINK REL="PREVIOUS" TITLE="Hugs-specific language extensions" HREF="hugs-only.html"><LINK REL="NEXT" TITLE="Here documents" HREF="here-documents.html"><LINK REL="STYLESHEET" TYPE="text/css" HREF="hugs-ug.css"></HEAD ><BODY CLASS="SECT1" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >The Hugs 98 User's Guide</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="hugs-only.html" ACCESSKEY="P" >Prev</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" >Chapter 7. Hugs-specific language extensions</TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="here-documents.html" ACCESSKEY="N" >Next</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="SECT1" ><H1 CLASS="SECT1" ><A NAME="RESTRICTED-SYNONYMS" >7.2. Restricted type synonyms</A ></H1 ><P >Restricted type synonyms are a mechanism for defining abstract datatypes. You can achieve similar effects, and more portably, using the Haskell 98 module system.</P ><P >The idea is that you can say that a type synonym is transparent in the definitions of certain functions (the operations on the type), but opaque elsewhere, by writing <PRE CLASS="PROGRAMLISTING" >type Table a b = [(a,b)] in empty :: Table a b, isEmpty :: Table a b -> Bool, add :: a -> b -> Table a b -> Table a b, search :: a -> Table a b -> Maybe b empty = [] isEmpty = null add a b t = (a,b):t search = lookup</PRE > or equivalently <PRE CLASS="PROGRAMLISTING" >type Table a b = [(a,b)] in empty, isEmpty, add, search empty :: Table a b empty = [] ...</PRE > See <A HREF="http://cvs.haskell.org/Hugs/pages/hugsman/exts.html#sect7.3.5" TARGET="_top" >Section 7.3.5 of the <I CLASS="CITETITLE" >Hugs 98 User Manual</I ></A > for details.</P ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="hugs-only.html" ACCESSKEY="P" >Prev</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >Home</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="here-documents.html" ACCESSKEY="N" >Next</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >Hugs-specific language extensions</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="hugs-only.html" ACCESSKEY="U" >Up</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >Here documents</TD ></TR ></TABLE ></DIV ></BODY ></HTML >