summaryrefslogtreecommitdiff
path: root/libraries/doc/libraries.xml
blob: 03d3ecf242a3c8aee26d24ddeffd41185187e989 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
   "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
  <!ENTITY libtable SYSTEM "libtable.xml">
]>

<article id="libraries">
  <articleinfo>
    <title>Hierarchical Haskell Libraries</title>
    <orgname>The Haskell Libraries Mailing List</orgname>
    <address><email>libraries@haskell.org</email></address>
  </articleinfo>

  <sect1 id="introduction">
    <title>Introduction</title>

    <para>The <ulink
    url="http://www.haskell.org/hierarchical-modules/">Hierarchical
    Module Namespace Extension</ulink> is a modest extension to Haskell 98
    which replaces the existing flat module namespace with a
    hierarchy.</para>

    <para>This document constitutes a proposal for how the new
    hierarchical namespace should be used.  It is
    <emphasis>not</emphasis> an addendum to the Haskell 98 report: the
    contents of this document are still under discussion on the
    <ulink
    url="http://www.haskell.org/mailman/listinfo/libraries"><literal>libraries@haskell.org</literal></ulink>
    mailing list, and are subject to change.</para>

    <para>The most up to date version of this document can be found in
    the <ulink
    url="http://hackage.haskell.org/trac/ghc/wiki/Building/GettingTheSources">GHC
    darcs repository</ulink> in the directory
    <literal>libraries/doc</literal>.</para>

    <para>The proposal has several parts: </para>

    <itemizedlist>
      <listitem>
	<para>An allocation of the new module namespace to existing
	and non-existent libraries, people, organisations, and local
	use.</para>
      </listitem>
      <listitem>
	<para>A policy and procedure for allocating new parts of the
	namespace.</para>
      </listitem>
      <listitem>
	<para>A set of libraries which are under the control of the
	community and have reference implementations.  These libraries
	will vary from almost completely stable (eg. the
	<literal>Prelude</literal>) to experimental libraries with
	fast-changing APIs.  Throughout this document, these libraries
	shall be referred to as the <firstterm>Reference
	Libraries</firstterm>.  The reference libraries serve to both
	define the library APIs, and provide implementations; in most
	cases this will be the primary implementation of that
	library.</para>
      </listitem>
    </itemizedlist>

    <para>In addition, this document also describes:</para>

    <itemizedlist>
      <listitem>
	<para>Guidelines and conventions for organising the
	hierarchy.</para>
      </listitem>
      <listitem>
	<para>Our policy with respect to the design and evolution of
	library APIs, versioning of library APIs, and maintenance of
	the reference implementation.</para>
      </listitem>
      <listitem>
	<para>A set of conventions for coding style and portability
	within the libraries.</para>
      </listitem>
    </itemizedlist>
  </sect1>

  <sect1 id="contributing">
    <title>How to contribute</title>

    <para>This project is driven by the Haskell community, so
    contributions of all kinds are welcome.  The first step is to join
    the <ulink
    url="http://www.haskell.org/mailman/listinfo/libraries">Haskell
    libraries mailing list</ulink>, and maybe <ulink
    url="http://www.haskell.org/pipermail/libraries/">browse the list
    archives</ulink>.  Some of the ways you can contribute are:</para>

    <itemizedlist>
      <listitem>
	<para>By donating code: for libraries which don't yet have a
	reference implementation, code is always welcome.  Code that
	conforms to the design guidelines (which aren't very strict,
	see <xref linkend="library-design"/>) and comes with documentation
	(<xref linkend="documentation"/>) and a test suite (<xref
	linkend="testing"/>) is better, but these aren't essential.  As
	a library progresses through the stability scale (<xref
	linkend="stability"/>) these things become more important, but
	for an experimental library we're not going to worry too much
	about this stuff.</para>
	
	<para>See section <xref
	linkend="contributing-reference-libraries"/> for details on
	contributing new library code.</para>
      </listitem>
      <listitem>
	<para>By porting code for an existing library to a new
	compiler or architecture.  A library is classed as portable if
	it should be available regardless of which compiler/platform
	combination you're using; however, many libraries are
	non-portable for one reason or another (see <xref
	linkend="portability"/>), and broadening the scope of these
	libraries is always welcome.</para>
      </listitem>
      <listitem>
	<para>Become a library maintainer: if you have a particular
	interest in and/or knowledge about a certain library, and have
	the time to spare, and the library in question doesn't already
	have a maintainer, then you may be a suitable maintainer for
	the library.  The responsibilities of library maintainers are
	given in <xref linkend="maintainership"/>. </para>
      </listitem>
      <listitem>
	<para>Participating in the design process for new libraries,
	and suggesting improvements to existing libraries.  Everyone
	on the <ulink
	url="http://www.haskell.org/mailman/listinfo/libraries">Haskell
	libraries mailing list</ulink> is invited to
	participate in the design process, so get involved!</para>
      </listitem>
    </itemizedlist>

  </sect1>

<!--
    <sect2>
      <title>A possible extension</title>

      <para>The use of qualified imports has become more verbose: for
      instance</para>

<programlisting>
   import qualified XmlParse
                      ... XmlParse.element f ...  
</programlisting>

      <para>becomes</para>

<programlisting>
   import qualified Text.Xml.Parse
                      ... Text.Xml.Parse.element f ...  
</programlisting>

      <para>It is usually more convenient to make use of Haskell's
      <literal>as</literal> keyword to shorten qualified identifiers:</para>

<programlisting>
   import qualified Text.Xml.Parse as Parse
                      ... Parse.element f ...  
</programlisting>

      <para>A possible extension to the proposal is to make this use
      of <literal>as</literal> implicit, unless overridden by the
      programmer with her own <literal>as</literal> clause. The
      implicit <literal>as</literal> clause always uses the final
      subdivision of the module name. So for instance, either the
      fully-qualified or abbreviated-qualified names</para>

<programlisting>
   Text.Xml.Parse.element
            Parse.element 
</programlisting>

      <para>would be accepted and have the same referent, but a
      partial qualification like</para>

<programlisting>
   Xml.Parse.element 
</programlisting>

      <para>would not be accepted.</para>
    </sect2>

    <sect2>
      <title>Renaming subtrees</title>

      <para>Various proposals have been made to allow you to rename a
      whole subtree.  This may occasionally be convenient: for example
      suppose there are several libraries under
      <literal>Org.Com.Microsoft</literal> that I need to import, it
      would be easier to rename this subtree to just
      <literal>Microsoft</literal> for use in future import
      declarations.  For example:</para>

<programlisting>
   import Org.Com.Microsoft.* as Microsoft.*
   import Microsoft.Foo
   import Microsoft.Bar
   ...
</programlisting>

      <para>The exact syntax of the renaming declaration is up for
      debate (as is whether we need it at all), please send
      suggestions to <email>libraries@haskell.org</email>.</para>
    </sect2>
-->


  <sect1 id="layout">
    <title>The hierarchy</title>

    <para>We first classify each node in the hierarchy according to
    one of the following terms:</para>

    <variablelist>
      <varlistentry>
	<term>Allocated</term>
	<listitem>
	  <para>Nodes in the hierarchy can be allocated to a library.
	  The currently allocated nodes are specified in <xref
	  linkend="allocated-names"/>.</para>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>User</term>
	<listitem>
	  <para>The <literal>User</literal> hierarchy is reserved for
	  users: a user may always use the portion of the hierarchy
	  which is formed from his/her email address as follows:
	  replace any <quote><literal>.</literal></quote>s in the
	  username (before the <literal>@</literal>) with
	  <quote><literal>_</literal></quote>, replace the
	  <quote><literal>@</literal></quote> by a
	  <quote><literal>.</literal></quote>, reverse the order of
	  the components, capitalise the first letter of each
	  component, and prepend
	  <quote><literal>User.</literal></quote>.  For example,
	  <literal>simonmar@microsoft.com</literal> becomes
	  <literal>User.Com.Microsoft.Simonmar</literal>.</para>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>Organisation</term>
	<listitem>
	  <para>The <literal>Org</literal> hierarchy is reserved for
          organisations.  Any organisation with a DNS domain name owns
          a unique space in the hierarchy formed by reversing the
          components of the domain, capitalising the first character
          of each component, and prepending <literal>Org.</literal>.
          <emphasis>ToDo: the Org name isn't great, especially when
          the domain name also ends with Org (eg. Org.Org.Haskell?).
          Contrib has also been suggested.</emphasis></para>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>Local</term>
	<listitem>
	  <para>The <literal>Local</literal> hierarchy is reserved for
	  libraries which are local to the current site.  Libraries
	  which are to be distributed outside the current site should
	  not be placed in the <literal>Local</literal>
	  hierarchy.</para>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>Unallocated</term>
	<listitem>
	  <para>Any node which doesn't belong to any of the above
	  categories is currently unallocated, and is available for
	  use by Haskell programs.</para>
	</listitem>
      </varlistentry>
    </variablelist>

    <para>A node in the hierarchy may be both a specific library and a
    parent node for a number of child nodes.  For example,
    <literal>Foreign</literal> is a library, and so is
    <literal>Foreign.Ptr</literal>.</para>

    <sect2 id="hierarchy-design-guidelines">
      <title>Hierarchy design guidelines</title>

      <para>Apart from the <literal>User</literal>,
      <literal>Local</literal> and <literal>Org</literal> top-level
      categories, the rest of the hierarchy is organised with a single
      principle in mind:</para>

      <blockquote>
	<para>Modules are grouped by
        <emphasis>functionality</emphasis>, since this is the single
        property that is most helpful for a user of the library - we
        want users to be able to find out where to obtain
        functionality easily, and to easily find all the modules that
        provide relevant functionality.</para>

        <para>So, if two modules provide similar functionality, or
        alternative interfaces to the same functionality, then they
        should be children of the same node in the hierarchy.  Modules
        should not be grouped by standards compliance, portability,
        stability, or any other property.</para>
      </blockquote>

      <para>It should be noted that this is a guideline rather than a
      rule: sometimes it just isn't the right thing.  For example, the
      <literal>DotNet</literal> top-level name contains a mirror of
      the Microsoft .NET base class library; if we had gone purely by
      functionality then these libraries would have to be scattered
      around the hierarchy, resulting in a situation where it would
      probably be <emphasis>harder</emphasis> for a programmer to find
      the functionality he or she is interested in.</para>

      <para>There are some other considerations when choosing where to
      place libraries.  Where possible, choose a layout that finds a
      good compromise between depth of nesting and logical grouping of
      functionality; for example, although the <literal>Text</literal>
      hierarchy could logically be placed as a child of
      <literal>FileFormat</literal>, we choose not to because
      <literal>Text</literal> is ubiquitous and we don't want to have
      to type the extra component all the time.</para>

      <para>Also consider consistency: if a particular sub-hierarchy
      provides similar functionality to another sub-hierarchy in the
      tree, then preferably the structure of the two subtrees should
      also be similar.  For example: under
      <literal>Language.Haskell</literal> we have children
      <literal>Syntax</literal>, <literal>Lexer</literal>,
      <literal>Parser</literal> etc., so under
      <literal>Language.C</literal> we should have a similar
      structure.</para>
    </sect2>

    <sect2 id="module-naming-convention">
      <title>Module naming conventions</title>
      
      <itemizedlist>
	<listitem>
	  <para>A module defining a data type or type class
          <replaceable>X</replaceable> has itself the name
          <replaceable>X</replaceable>, e.g.
          <literal>StablePtr</literal>.</para>
	</listitem>
	
	<listitem>
	  <para>A module which re-exports the modules in a subtree of
	  the hierarchy has the same name as the root of that subtree,
	  eg. <literal>Foreign</literal> re-exports
	  <literal>Foreign.Ptr</literal>,
	  <literal>Foreign.Marshal.Utils</literal> etc.</para>
	</listitem>
	
	<listitem>
	  <para>If a subtree of the hierarchy contains several modules
	  which provide similar functionality (eg. there are several
	  pretty-printing libraries under
	  <literal>Text.PrettyPrinter</literal>), then the module at
	  the root of the subtree generally re-exports just
	  <emphasis>one</emphasis> of the modules in the subtree
	  (possibly the most popular or commonly-used
	  alternative).</para>
	</listitem>

	<listitem>
	  <para>In Haskell you sometimes publish
          <emphasis>two</emphasis> interfaces to your libraries; one
          for users, and one for library writers or advanced users who
          might want to extend things.  Typically the advanced users
          need to be able to see past certain abstractions.</para>

	  <para>The current proposal is for a module named
	  <literal>M</literal>, the <quote>advanced</quote> version
	  would be named <literal>M.Internals</literal>. eg.</para>

<programlisting>
import Text.HTML           -- The library
import Text.HTML.Internals -- The non-abstract library
</programlisting>
	</listitem>

	<listitem>
	  <para>Acronyms are fully capitalised in a module name.
	  eg. <literal>HTML</literal>, <literal>URI</literal>,
	  <literal>CGI</literal>, etc.  Exceptions may be made for
	  acronyms which have an existing well-established alternative
	  capitalisation, or acronyms which are also valid words, and
	  are more often used as such.</para>
	</listitem>

	<listitem>
	  <para>A module name should be made plural only if the module
	  actually defines multiple entities of a particular kind:
	  eg. <literal>Foreign.C.Types</literal>.  Most module names
	  which define a type or class will follow the name of the
	  type or class, so whether to pluralize is not an
	  issue.</para>
	</listitem>
      </itemizedlist>
    </sect2>

    <sect2 id="top-level-names">
      <title>The top-level names</title>

      <para>The currently allocated nodes in the hierarchy are listed
      in the next section (<xref linkend="allocated-names"/>).  In
      addition, for each top-level name we describe its intended
      purpose below:</para>

      <variablelist>
	<varlistentry>
	  <term><literal>Control</literal></term>
	  <listitem>
	    <para>Libraries which provide functions, types or classes
            whose purpose is primarily to express control
            structure.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Data</literal></term>
	  <listitem>
	    <para>Libraries which provide data types, operations over
            data types, or type classes, except for libraries for
            which one of the other more specific categories is
            appropriate.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Database</literal></term>
	  <listitem>
	    <para>Libraries for providing access to or operations for
            building databases.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Debug</literal></term>
	  <listitem>
	    <para>Support for debugging Haskell programs.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>DotNet</literal></term>
	  <listitem>
	    <para>Mirrors the Microsoft .NET base class hierarchy, for
	    systems providing access to the .NET libraries.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Edison</literal></term>
	  <listitem>
	    <para>The Edison data structure library.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Codec</literal></term>
	  <listitem>
	    <para>Support for (en)coding and decoding data in various
	    formats.  <literal>Codec</literal> encompasses compression
	    (both lossy and non-lossy) codings, transport
	    codings, and encryption.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Foreign</literal></term>
	  <listitem>
	    <para>Interaction with code written in a foreign
	    programming language.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Graphics</literal></term>
	  <listitem>
	    <para>Libraries for producing graphics or providing
            graphical user interfaces.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Language</literal></term>
	  <listitem>
	    <para>Libraries for operating on or generating source code
            in various programming languages, including parsers,
            pretty printers, abstract syntax definitions etc.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Local</literal></term>
	  <listitem>
	    <para>Available for site-local use.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Numeric</literal></term>
	  <listitem>
	    <para>Functions and classes which provide operations over
	    numeric data.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Network</literal></term>
	  <listitem>
	    <para>Libraries for communicating over a network,
            including implementations of network protocols.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Org</literal></term>
	  <listitem>
	    <para>Allocated to organisations on a domain-name
	    basis (see <xref linkend="layout"/>).</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Prelude</literal></term>
	  <listitem>
	    <para>Haskell98 Prelude (mostly just re-exports other
	    parts of the tree).</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>System</literal></term>
	  <listitem>
	    <para>Libraries for communication with the system on which
            the Haskell program is running (including the runtime
            system).</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Text</literal></term>
	  <listitem>
	    <para>Libraries for parsing and generating data in a
            textual format (including structured textual formats such
            as XML, HTML, but not including programming language
            source, which lives in Language).</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>GHC</literal></term>
	  <listitem>
	    <para>Libraries specific to the GHC/GHCi system.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Nhc</literal></term>
	  <listitem>
	    <para>Libraries specific to the Nhc compiler.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>Hugs</literal></term>
	  <listitem>
	    <para>Libraries specific to the Hugs system.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><literal>User</literal></term>
	  <listitem>
	    <para>Allocated to individual users, using email
	    addresses (see <xref linkend="layout"/>).</para>
	  </listitem>
	</varlistentry>
      </variablelist>
    </sect2>

    <sect2 id="allocated-names">
      <title>Allocated libraries</title>
      
      <informaltable>
	<tgroup cols="3" align="left" colsep="1" rowsep="1">
	  <thead>
	    <row>
	      <entry>Library</entry>
	      <entry>Maintainer</entry>
	      <entry>URL</entry>
	    </row>
	  </thead>
	  <tbody>
	    &libtable;
	  </tbody>
	</tgroup>
      </informaltable>
    </sect2>
  </sect1>
  
  <sect1 id="reference-libraries">
    <title>Reference libraries</title>

    <para>There are reference implementations for many of the
    libraries allocated in the hierarchy (see <xref
    linkend="allocated-names"/>).  These reference libraries serve to define
    the API for each library, and also in most cases provide the
    primary implementation of that library.  We don't discount the
    possibility that multiple implementations of libraries may exist,
    but there is only ever one reference implementation.</para>

    <para>Many of the reference libraries live in the CVS repository
    on <literal>cvs.haskell.org</literal> under the directory <ulink
    url="http://cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/libraries"><literal>fptools/libraries</literal></ulink>,
    but others are maintained and distributed separately by members of
    the Haskell community.  <xref linkend="allocated-names"/> lists the
    maintainer for each reference library, and a location from which
    the code can be obtained.</para>
    
    <sect2 id="installing">
      <title>Installing libraries</title>
      
      <para>Compilers are normally distributed with a number of
      libraries, which may or may not be built from the reference
      implementations.</para>

      <para>Currently, the procedure for installing a library which is
      not distributed with your compiler is currently dependent on a
      number of things: platform, compiler, and how much support is
      provided by the library maintainer.  We aim to standardise this
      procedure to a certain extent by providing a library
      infrastructure which automates the building, installation and
      packaging of libraries for all architectures and compilers.  The
      means by which we might achieve this are being actively
      discussed: see the <ulink
      url="http://www.haskell.org/pipermail/libraries/">libraries
      mailing list archives</ulink>.</para>
    </sect2>

    <sect2 id="contributing-reference-libraries">
      <title>Contributing new reference libraries</title>

      <para>The process for contributing a new library is as
      follows:</para>

      <variablelist>
	<varlistentry>
	  <term>Allocate module names.</term>
	  <listitem>
	    <para>If you want a library in the <literal>User</literal>
	    or <literal>Org</literal> part of the hierarchy, then
	    nothing needs to be done: just go ahead and distribute
	    your library.</para>
	    
	    <para>If, however, you are providing a library for any
	    other part of the hierarchy, then the module names in the
	    should be allocated.  <xref linkend="allocated-names"/>
	    lists the parts of the hierarchy that are currently
	    allocated.</para>

	    <para>There are several reasons for allocating module
	    names centrally in this way:</para>

	    <itemizedlist>
	      <listitem>
		<para>Haskell users have the guarantee that libraries
	        never conflict with each other by using the same
	        module name.</para>
	      </listitem>
	      <listitem>
		<para>There is always one place to obtain a given
		library, each library has a single reference
		implementation, and there is a single point of contact
		for the implementor(s).</para>
	      </listitem>
	    </itemizedlist>

	    <para>Remember that this only applies to libraries: code
	    in a <emphasis>program</emphasis> can use whatever module
	    names it chooses (but it's probably a good idea to avoid
	    conflicting with any libraries that might be installed:
	    avoiding the allocated module names is a good way to
	    ensure that).</para>

	    <para>To allocate module names for a new library, send
	    mail to <email>libraries@haskell.org</email> describing
	    your library and which module names you are proposing to
	    allocate.  Provided there is no conflict, then the names
	    will normally be allocated and added to the list above.  A
	    conflict might arise if for example someone else wants to
	    provide a library with the same name; conflicts will be
	    resolved by consensus on a case-by-case basis.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term>Distribute the library.</term>
	  <listitem>
	    <para>The mechanism by which libraries should be
	    distributed is currently being discussed; we hope in the
	    future to make the process much easier for library
	    writers.  Currently you have to do all the work yourself:
	    write a build system (or steal one), installation scripts
	    and support for packaging on each platform that you wish
	    to support.</para>
	  </listitem>
	</varlistentry>
      </variablelist>
    </sect2>
    
    <sect2 id="licensing">
      <title>Licensing</title>

      <para>Following some discussion on the mailing list related to
      how we should license the libraries, the viewpoint that was
      least offensive to all involved seems to be the
      following:</para>

      <para>We wish to accommodate source code from different
      contributors, and with different licenses.  However, a library
      of modules where each module is released under a different
      license, and where the dependencies between modules aren't
      clear, isn't workable (it's too hard for a user of the library
      to tell whether they're violating the terms of the each license
      or not).</para>

      <para>So the solution is as follows: code under different
      licenses will be clearly separate in the repository (i.e. in
      separate subdirectories), and compilers are expected to present
      packages of modules where all modules in a package fall under
      the same license, and where the dependencies between packages
      are clear.</para>

      <para>It was decided that certain essential functionality should
      be available under a BSD style license.  Hence, the BSD part of
      the repository will contain implementations of at least the
      following modules: <literal>Prelude</literal>,
      <literal>Foreign</literal>, <emphasis>ToDo: what
      else?</emphasis>.</para>

      <para>There is one further requirement: reference libraries must
      be available under a license approved by the Open Source
      Initiative.  See <ulink url="http://www.opensource.org//">The
      Open Source Initiative</ulink> for a list of approved
      licensees.</para>
    </sect2>

    <sect2 id="versioning">
      <title>Versioning</title>
      <para><emphasis>ToDo</emphasis></para>
    </sect2>
    
    <sect2 id="stability">
      <title>Library stability</title>

      <para>The stability of a library relates primarily to its API.
      Stability provides an indication of how often the API is likely
      to change (or whether it may even go away entirely).</para>

      <para>The stability scale is also a measure of how strictly the
      conventions in this document are applied to the library: an
      experimental library isn't subject to any restrictions regarding
      coding style and documentation, but a stable library is expected
      to adhere to the guidelines, and come with full documentation
      and tests.</para>

      <para>To help with the stability issue, library maintainers are
      allowed to mark functions, types or classes as
      <firstterm>deprecated</firstterm><footnote><para>Compilers may
      have extra support for warning about the use of a deprecated
      feature, for example GHC's <literal>DEPRECATED</literal>
      pragma.</para> </footnote>, which means simply that the feature
      will be removed at a later date.  Just how long it will stick
      around for depends on the stability category of the library (see
      below).  A feature is marked as deprecated in the documentation
      for the library, and optionally in an implementation-dependent
      way which enables the system to warn about the use of deprecated
      features.</para>

      <para>The current stability categories are:</para>

      <variablelist>
	<varlistentry>
	  <term><firstterm>experimental</firstterm></term>
	  <listitem>
	    <para>An experimental library is unrestricted in terms of
	    API changes: the API may change between minor revisions
	    and there is no requirement to retain old interfaces for
	    compatibility.  Documentation and tests aren't required
	    for an experimental library.</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><firstterm>provisional</firstterm></term>
	  <listitem>
	    <para>A provisional library is moving towards stability,
	    and the rate of change of the API is slower.  API changes
	    between minor revisions must be accompanied by deprecated
	    versions of the old features where possible.  API changes
	    between major versions are unrestricted.  The library
	    should come with at least rudimentary
	    documentation.</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><firstterm>stable</firstterm></term>
	  <listitem>
	    <para>A stable library has an essentially fixed API.
	    Additions to the API may be made for a minor release,
	    deprecated features must be retained for at least one
	    major revision, and small changes only may be made to the
	    existing API semantics for a major revision.  A stable
	    library is expected to include full documentation and
	    tests.</para>
	  </listitem>
	</varlistentry>
      </variablelist>
      
    </sect2>
    
    <sect2 id="portability">
      <title>Portability considerations</title>
      
      <para>The portability status of a library affects which
      platforms and compilers the library will be available on. The
      precise meaning of the terms portable and non-portable for our
      purposes are given below:</para>
      
      <variablelist>
	<varlistentry>
	  <term><firstterm>Portable</firstterm></term>
	  <listitem>
	    <para>A library which is available on all platforms and
	    with all Haskell implementations is portable.</para>

	    <para>A portable library may make use of non-portable
	    features or import non-portable libraries in its
	    implementation, as long as it does so conditionally and
	    provides the same interface on all platforms and with all
	    Haskell implementations.</para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><firstterm>Non-portable</firstterm></term>
	  <listitem>
	    <para>A non-portable library may be non-portable for one
	    or more of the following reasons:</para>
	    <variablelist>
	      <varlistentry>
		<term><firstterm>Requires extensions</firstterm></term>
		<listitem>
		  <para>A library which uses non-approved language
		  extensions in its implementation, and has no
		  portable fallback implementation.</para>
		</listitem>
	      </varlistentry>
	      <varlistentry>
		<term><firstterm>Requires nonportable libraries</firstterm></term>
		<listitem>
		  <para>A library which depends (directly or indirectly)
		  on other non-portable libraries.</para>
		</listitem>
	      </varlistentry>
	      <varlistentry>
		<term><firstterm>OS-specific</firstterm></term>
		<term><firstterm>Platform-specific</firstterm></term>
		<listitem>
		  <para>A library which depends on features or APIs
		  particular to a certain OS or platform is
		  non-portable for that reason.</para>
		</listitem>
	      </varlistentry>
	    </variablelist>
	  </listitem>
	</varlistentry>
      </variablelist>
      
      <sect3 id="approved-extensions">
	<title>Approved extensions</title>
	
	<para>Very few of the reference libraries can be implemented
        using pure Haskell 98.  For this reason, we decided to raise
        the baseline for portable libraries to include a few common
        extensions; the following language extensions can be
        <emphasis>assumed</emphasis> to be present when writing
        libraries:</para>
	
	<itemizedlist>
	  <listitem>
	    <para>The <ulink
			     url="http://haskell.org/ghc/docs/latest/set/ffi.html">Foreign
			     Function Interface</ulink>.</para>
	  </listitem>
	  <listitem>
	    <para>Mutable variables
	    (<literal>Data.IORef</literal>).</para>
	  </listitem>
	  <listitem>
	    <para>Unsafe IO monad operations
	    (<literal>System.IO.Unsafe</literal>).</para>
	  </listitem>
	  <listitem>
	    <para>Packed strings
	    (<literal>Data.PackedString</literal>).</para>
	  </listitem>
	  <listitem>
	    <para>Bit operations (<literal>Data.Bits</literal>).</para>
	  </listitem>
	</itemizedlist>
	
	<para>Extensions which we'd like to be standard, but aren't
        currently implemented by one or more of the target
        compilers:</para>
	
	<itemizedlist>
	  <listitem>
	    <para>Exceptions (synchronous only), defined by the
	  <literal>Control.Exception</literal> interface.</para>
	  </listitem>
	  <listitem>
	    <para>The ST monad, defined by
	    <literal>Control.Monad.ST</literal>, and the associated
	    <literal>Data.Array.ST</literal> and
	    <literal>Data.STRef</literal> libraries.  ST requires a
	    small typechecker extension for the
	    <literal>runST</literal> function.</para>
	  </listitem>
	  <listitem>
	    <para>Concurrent Haskell (pre-emptive multitasking
	    optional).  GHC and Hugs implement this, but Nhc currently
	    does not.</para>
	  </listitem>
	</itemizedlist>

	<para>The following extensions are not likely to become part
        of the baseline, but are nevertheless used by one or more
        libraries in the reference set (which are thus designated
        non-portable):</para>
	
	<itemizedlist>
	  <listitem>
	    <para>Multi-parameter type classes.</para>
	  </listitem>
	  <listitem>
	    <para>Local universal and existential quantification.</para>
	  </listitem>
	  <listitem>
	    <para>Concurrent Haskell with pre-emptive multitasking.</para>
	  </listitem>
	  <listitem>
	    <para>Asynchronous exceptions.</para>
	  </listitem>
	  <listitem>
	    <para>Stable Names.</para>
	  </listitem>
	  <listitem>
	    <para>Weak Pointers.</para>
	  </listitem>
	</itemizedlist>

	<para>Other extensions are supported by a single compiler
        only, and can be accessed by libraries under the top level
        hierarchy for that compiler,
        eg. <literal>GHC.UnboxedTypes</literal>.</para>
      </sect3>
    </sect2>

    <sect2 id="maintainership">
      <title>Library maintainers</title>

      <para>This is a collaborative project, so we like to devolve
      control of the design and implementation of libraries to those
      with an interest or appropriate expertise (or maybe just the
      time!).  A maintainer isn't necessarily a single person - for
      example, the listed maintainer for most of the reference
      libraries is <email>libraries@haskell.org</email>, indicating
      that the library is under the control of the community as a
      whole.  The maintainer for the <literal>Foreign</literal>
      hierarchy is <email>ffi@haskell.org</email>, the mailing list
      for discussion of the Haskell FFI standard.</para>

      <para>The responsibilities of a library maintainer include:</para>
      
      <itemizedlist>
	<listitem>
	  <para>Most importantly: act as a single point of contact for
	  issues relating to the library API and its
	  implementation.</para>
	</listitem>
	<listitem>
	  <para>Manage any discussion related to the library (which
	  can take place on <email>libraries@haskell.org</email> if
	  necessary), and summarise the results.  Make final
	  decisions, and implement them.</para>
	</listitem>
	<listitem>
	  <para>Maintain the implementation, including: fixing bugs,
	  updating to keep up with changes in other libraries, porting
	  to new compilers/platforms, and integrating code from other
	  contributors.  The maintainer is expected to be the only
	  person/group to make functional changes to the source code
	  (non-functional or trivial changes don't count).</para>
	</listitem>
	<listitem>
	  <para>Maintain/write the documentation and tests.</para>
	</listitem>
	<listitem>
	  <para>If you can't maintain the library any more for
	  whatever reason, tell <email>libraries@haskell.org</email>
	  and we'll revert the maintainer status of the library to the
	  default.</para>
	</listitem>
      </itemizedlist>
    </sect2>
    
    <sect2 id="documentation">
      <title>Documentation</title> 

      <para>We are using <ulink
      url="http://www.haskell.org/haddock/">Haddock</ulink> to
      document the libraries.  Haddock generates nice hyperlinked HTML
      output directly from the Haskell source, and understands
      comments written in a particular style as documentation
      annotations, which are merged with the generated
      documentation.</para>

      <para>Before submitting code to the libraries project, please
      ensure that it passes through Haddock without complaint.  Even
      if it contains no actual documentation annotations, we'll get
      useful documentation out of the source alone (type signatures,
      data types, etc.).</para>
    </sect2>
    
    <sect2 id="coding-style">
      <title>Coding style</title>
      
      <sect3 id="module-header">
	<title>Standard module header</title> 

	<para>Using a standard module header makes it easy to
        automatically extract meta-information from library source
        code, such as the stability/portability of individual modules.
        We recommend using the following module header for reference
        libraries:</para>

<programlisting>
-----------------------------------------------------------------------------
-- |
-- Module      :  <replaceable>module</replaceable>
-- Copyright   :  (c) <replaceable>author</replaceable> <replaceable>year</replaceable>
-- License     :  <replaceable>license</replaceable>
-- 
-- Maintainer  :  libraries@haskell.org | <replaceable>email-address</replaceable>
-- Stability   :  experimental | provisional | stable
-- Portability :  portable | non-portable (<replaceable>reason(s)</replaceable>)
--
-- &dollar;Id&dollar;
--
-- <replaceable>Description</replaceable>
-----------------------------------------------------------------------------
</programlisting>

	<para>where:</para>
	
	<variablelist>
	  <varlistentry>
	    <term><literal>$Id: libraries.xml,v 1.2 2004/08/18 16:42:56 panne Exp $</literal></term>
	    <listitem>
	      <para>is optional, but may be included if the module is
	      under CVS or RCS control (however, current wisdom
	      suggests that using
	      <literal>&dollar;Id&dollar;</literal> tags are not such
	      a great idea).</para>
	    </listitem>
	  </varlistentry>
	  
	  <varlistentry>
	    <term><replaceable>module</replaceable></term>
	    <listitem>
	      <para>is the fully qualified module name of the
	      module</para>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term><replaceable>author</replaceable>/<replaceable>year</replaceable></term>
	    <listitem>
	      <para>Is the primary author and copyright holder of the
	      module, and the year in which copyright is
	      claimed.</para>
	    </listitem>
	  </varlistentry>
	  
	  <varlistentry>
	    <term><replaceable>license</replaceable></term>
	    <listitem>
	      <para>Specifies the license on the file (see <xref
	      linkend="licensing"/>).</para>
	    </listitem>
	  </varlistentry>
	  
	  <varlistentry>
	    <term><replaceable>email-address</replaceable></term>
	    <listitem>
	      <para>The email address of the maintainer, or
	      maintainers, of the library (see <xref
	      linkend="maintainership"/>).</para>
	    </listitem>
	  </varlistentry>
	  
	  <varlistentry>
	    <term><replaceable>reason(s)</replaceable></term>
	    <listitem>
	      <para>The reasons for non-portability must be listed
	      (see <xref linkend="portability"/>).</para>
	    </listitem>
	  </varlistentry>
	  
	  <varlistentry>
	    <term><replaceable>description</replaceable></term>
	    <listitem>
	      <para>A short description of the module.</para>
	    </listitem>
	  </varlistentry>
	</variablelist>
      </sect3>
    </sect2>
    
    <sect2 id="testing">
      <title>Testing</title>
      <para><emphasis>ToDo</emphasis></para>
    </sect2>
  </sect1>

  <sect1 id="Migration-path">
    <title>Migration path</title>

    <para>How compatible will a compiler using the new libraries be
    with code written for Haskell 98 or older library systems (such as
    the <literal>hslibs</literal> suite and GHC's package system), and
    for how long will compatibility be maintained?</para>

    <para>Our current plan for GHC is as follows: by default, with the
    <option>-fglasgow-exts</option> flag, you'll get access to the
    following libraries from the CVS repository: those under
    <literal>base</literal>, <literal>network</literal>,
    <literal>unix</literal>, <literal>readline</literal>,
	<literal>template-haskell</literal>, and
    <literal>haskell-src</literal>.  Compatibility with Haskell 98
    code will be maintained using a separate package of wrappers
    presenting interfaces for the Haskell 98 libraries
    (<literal>IO</literal>, <literal>Ratio</literal>,
    <literal>Directory</literal>, etc.).  The Haskell 98 compatibility
    package will be enabled by default, but we plan to add an option
    to disable it if necessary.  For code that uses <literal>-package
    lang</literal>, we could also provide a compatibility wrapper
    package (so <literal>-package lang</literal> will continue to work
    as before and present the same library interfaces), but this may
    prove too much work to maintain - we haven't decided whether to do
    this or not.  It is unlikely that compatibility wrappers for any
    of the other <literal>hslibs</literal> packages will be
    provided.</para>
  </sect1>

  <sect1 id="library-design">
    <title>Library design</title>

    <sect2 id="naming-conventions">
      <title>Naming conventions</title>

      <para>These naming conventions are pulled straight from the
      <literal>hslibs</literal> documentation.  They were formed after
      lengthy discussions and are heavily based on an initial
      suggestion from Marcin Kowalczyk
      <email>qrczak@knm.org.pl</email>.</para>

      <para>Note that the conventions are not mutually exclusive,
      e.g. should the function creating a set from a list of elements
      have the name <literal>set</literal> or
      <literal>listToSet</literal>?  (Alas, it currently has neither
      name.)</para>

      <para> The following nomenclature is used: Pure,
      i.e. non-monadic functions are simply called, well,
      <emphasis>functions</emphasis>.  Monadic functions,
      i.e. functions having a type <literal>... -&#62; m a</literal>
      for some Monad <literal>m</literal> are called
      <emphasis>actions</emphasis>.</para>

      <sect3 id="sec-library-constructor-names">
	<title>Constructor names</title>
	<indexterm><primary>Constructor names</primary></indexterm>

	<itemizedlist>
	  <listitem>
	    <para>Empty values of type <replaceable>X</replaceable>
            have the name <literal>empty<replaceable>X</replaceable></literal>,
            e.g. <literal>emptySet</literal>.</para>
	  </listitem>

	  <listitem>
	    <para>Actions creating a new empty value of type
            <replaceable>X</replaceable> have the name
            <literal>newEmpty<replaceable>X</replaceable></literal>,
            e.g. <literal>newEmptyMVar</literal>.</para>
	  </listitem>

	  <listitem>
	    <para>Functions creating an arbitrary value of type
            <replaceable>X</replaceable> have the name
            <replaceable>X</replaceable> itself (with the first letter
            downcased),
            e.g. <literal>array</literal>. (<emphasis>TODO</emphasis>:
            This often collides with <literal>xToY</literal>
            convention, how should this be resolved?)
            </para>
	  </listitem>

	  <listitem>
	    <para>Actions creating new values arbitrary values of type
            <replaceable>X</replaceable> have the name
            <literal>new<replaceable>X</replaceable></literal>,
            e.g. <literal>newIORef</literal>.
            </para>
	  </listitem>
	</itemizedlist>
      </sect3>

    <sect3 id="sec-library-accessor-names">
	<title>Accessor names</title>
	<indexterm><primary>Accessor names</primary></indexterm>

	<itemizedlist>
	  <listitem>
	    <para>Functions getting an attribute of a value or a part
            of it have the name of the attribute itself,
            e.g. <literal>length</literal>, <literal>bounds</literal>.
            </para>
	  </listitem>

	  <listitem>
	    <para> Actions accessing some kind of reference or state
            have the name
            <literal>get<replaceable>X</replaceable></literal>, where
            <replaceable>X</replaceable> is the type of the contents
            or the name of the part being accessed,
            e.g. <literal>getChar</literal>,
            <literal>getEnv</literal>. An alternative naming scheme is
            <literal>read<replaceable>Y</replaceable></literal>,
            where <replaceable>Y</replaceable> is the type of the
            reference or container, e.g. <literal>readIORef</literal>.
            </para>
	  </listitem>

	  <listitem>
	    <para>Functions or actions getting a value via a
            pointer-like type <replaceable>X</replaceable> should be
            named
            <literal>deRef<replaceable>X</replaceable></literal>,
            e.g. <literal>deRefStablePtr</literal>,
            <literal>deRefWeak</literal>.</para>
	  </listitem>
	</itemizedlist>
      </sect3>

      <sect3 id="sec-library-modifier-names">
	<title>Modifier names</title>
	<indexterm><primary>Modifier names</primary></indexterm>

	<itemizedlist>
	  <listitem>
	    <para>Functions returning a value with attribute
            <replaceable>X</replaceable> set to a new value should be
            named
            <literal>set<replaceable>X</replaceable></literal>. (<emphasis>TODO</emphasis>:
            Add Examples.)</para>
	  </listitem>

	  <listitem>
	    <para> Actions setting some kind of reference or state
            have the name
            <literal>put<replaceable>X</replaceable></literal>, where
            <replaceable>X</replaceable> is the type of the contents
            or the name of the part being accessed,
            e.g. <literal>putChar</literal>. An alternative naming
            scheme is
            <literal>write<replaceable>Y</replaceable></literal>,
            where <replaceable>X</replaceable> is the type of the
            reference or container,
            e.g. <literal>writeIORef</literal>.  </para></listitem>

	  <listitem>
	    <para> Actions in the <literal>IO</literal> monad setting
            some global state <replaceable>X</replaceable> are
            traditionally named <literal>setX</literal>, too, although
            <literal>put<replaceable>X</replaceable></literal> would
            be more appropriate,
            e.g. <literal>setReadlineName</literal>.</para>
	  </listitem>

	  <listitem>
	    <para> Actions modifying a container
            <replaceable>X</replaceable> by a function of type
            <literal>a -> a</literal> have the name
            <literal>modify<replaceable>X</replaceable></literal>,
            e.g. <literal>modifySTRef</literal>.</para>
	  </listitem>
	</itemizedlist>
      </sect3>

      <sect3 id="sec-library-predicate-names">
	<title>Predicate names</title>
	<indexterm><primary>Predicate names</primary></indexterm>

	<itemizedlist>
	  <listitem>
	    <para>Predicates, both non-monadic and monadic, testing a
            property <replaceable>X</replaceable> have the name
            <literal>is<replaceable>X</replaceable></literal>.
            </para>
	  </listitem>
	</itemizedlist>
      </sect3>

      <sect3 id="sec-library-naming-conversions">
	<title>Names for conversions</title>
	<indexterm><primary>Names for conversions</primary></indexterm>

	<itemizedlist>
	  <listitem>
	    <para>Functions converting a value of type
            <replaceable>X</replaceable> to a value of type
            <replaceable>Y</replaceable> have the name
            <literal><replaceable>X</replaceable>To<replaceable>Y</replaceable></literal>
            with all leading uppercase characters of
            <replaceable>X</replaceable> converted to lower case,
            e.g. <literal>stToIO</literal>.</para>
	  </listitem>

	  <listitem>
	    <para>Overloaded conversion functions of type 
            <literal>C a => a -> <replaceable>X</replaceable></literal>
            have the name
            <literal>to<replaceable>X</replaceable></literal>,
            e.g. <literal>toInteger</literal>.</para>
	  </listitem>

	  <listitem>
	    <para> Overloaded conversion functions of type 
<literal>C a => <replaceable>X</replaceable> -> a</literal> 
            have the name <literal>from<replaceable>X</replaceable></literal>,
e.g. <literal>fromInteger</literal>.</para>
	  </listitem>
	</itemizedlist>
      </sect3>

      <sect3 id="sec-library-misc-names">
	<title>Miscellaneous naming conventions</title>
	<indexterm><primary>Miscellaneous naming
	conventions</primary></indexterm>

	<itemizedlist>
	  <listitem>
	    <para> An action that is identical to another one called
            <replaceable>X</replaceable>, but discards the return
            value has the name
            <literal><replaceable>X</replaceable>_</literal>,
            e.g. <literal>mapM</literal> and <literal>mapM_</literal>.
            </para>
	  </listitem>

	  <listitem>
	    <para>Functions and actions which are potentially
            dangerous to use and leave some kind of proof obligation
            to the programmer have the name
            <literal>unsafe<replaceable>X</replaceable></literal>,
            e.g. <literal>unsafePerformIO</literal>.
            </para>
	  </listitem>

	  <listitem>
	    <para>There are two conventions for binary and N-ary
            variants of an associative operation: One convention uses
            an operator or a short name for the binary operation and a
            long name for the N-ary variant,
            e.g. <literal>(+)</literal> and <literal>sum</literal>,
            <literal>max</literal> and <literal>maximum</literal>. The
            other convention suffixes the N-ary variant with
            <literal>Many</literal>.  (<emphasis>TODO</emphasis>: Add
            Examples.)</para>
	  </listitem>

	  <listitem>
	    <para>If possible, names are chosen such that either plain
            application or <literal>arg1 `operation` arg2</literal> is
            correct English, e.g. <literal>isPrefixOf</literal> is
            good for use in backquotes.</para>
	  </listitem>
	</itemizedlist>
      </sect3>
    </sect2>

    <sect2 id="sec-library-misc-conventions">
      <title>Library design guidelines</title>

      <itemizedlist>
	<listitem>
	  <para>Actions setting and modifying a kind of reference or
          state return <literal>()</literal>, getting the value is
          separate, e.g. <literal>writeIORef</literal> and
          <literal>modifyIORef</literal> both return
          <literal>()</literal>, only <literal>readIORef</literal>
          returns the value in an <literal>IORef</literal>
          </para>
	</listitem>

	<listitem>
	  <para>A function or action taking a some kind of state and
          returning a pair consisting of a result and a new state, the
          result is the first element of the pair and the new state is
          the second, see e.g. <literal>Random</literal>.</para>
	</listitem>

	<listitem>
	  <para>When the type <literal>Either</literal> is used to
          encode an error condition and a normal result,
          <literal>Left</literal> is used for the former and
          <literal>Right</literal> for the latter, see
          e.g. <literal>Control.Monad.Error</literal>.</para>
	</listitem>

	<listitem>
	  <para>A module corresponding to a class
          (e.g. <literal>Bits</literal>) contains the class
          definition, perhaps some auxiliary functions, and all
          sensible instances for Prelude types, but nothing
          more. Other modules containing types for which an instance
          for the class in question makes sense contain the code for
          the instance itself.</para>
	</listitem>

	<listitem>
	  <para>Record-like C bit fields or structs have a
          record-like interface, i.e. pure getting and setting of
          fields. (<emphasis>TODO</emphasis>: Clarify a little
          bit. Add examples.)</para>
	</listitem>

	<listitem>
	  <para>Although the possibility of partial application
          suggests the type 

<literal><replaceable>attr</replaceable> -> <replaceable>object</replaceable> -> <replaceable>object</replaceable></literal> 

          for functions setting an attribute or value, infix notation
          with backquotes implies 

<literal><replaceable>object</replaceable> -> <replaceable>attr</replaceable> -> <replaceable>object</replaceable></literal>.

          (<emphasis>TODO</emphasis>: Add Examples.)</para>
	</listitem>

	<listitem>
	  <para>Conditional interfaces: a library interface should
	  vary between versions of the library only, not between
	  platforms or Haskell implementations.  Such differences may
	  be visible at the module level only, so for example module
	  <literal>System.Win32</literal> would be available on Win32
	  systems only, and <literal>GHC.Exts</literal> would only be
	  available when compiling with GHC.</para>
	</listitem>
      </itemizedlist>
    </sect2>
    
  </sect1>

  <sect1>
    <title>Changes to standard Haskell 98 libraries</title>

    <para>Some changes have been made to the standard Haskell 98
    libraries in the new library scheme, both in the names of the
    modules themselves and in their exported interfaces.  Below is a
    summary of those changes - at this time, the new libraries are
    marked as provisional and are maintained by
    <email>libraries@haskell.org</email>, so changes in the interfaces
    are all up for discussion.</para>

<screen>
modules with interface changes
------------------------------

Array -> Data.Array
   added instance Typeable (Array ix a)

Char  -> Data.Char
   no interface changes (should have instance Typeable?)

Complex -> Data.Complex
   added instance Typeable (Complex a)

IO -> System.IO
   added 
    hPutBuf  :: Handle -> Ptr a -> Int -> IO ()
    hGetBuf  :: Handle -> Ptr a -> Int -> IO Int
    fixIO    :: (a -> IO a) -> IO a
    hSetEcho :: Handle -> Bool -> IO ()
    hGetEcho :: Handle -> IO Bool
    hIsTerminalDevice :: Handle -> IO Bool

List -> Data.List
   exports [](..)

System    -> System.Exit, System.Environment, System.Cmd
   split into three modules

just renamed, no interface changes:
-----------------------------------

CPUTTime  -> System.CPUTime
Directory -> System.IO.Directory
Ix        -> Data.Ix
Locale    -> System.Locale
Maybe     -> Data.Maybe
Monad     -> Data.Monad
Numeric   -> Numeric
Random    -> System.Random
Ratio     -> Data.Ratio
Time      -> System.Time
</screen>
  </sect1>
  <index/>
</article>