138

Functional programming using Caml Light Michel Mauny January 1995

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Functional programming using Caml Light Michel Mauny January 1995

����������� ����������� � ������������

����������������� ��"!#�

$&%('*)�+-,.$0/2143�5

6�/73�18/79:5<;-=>=@?

Page 2: Functional programming using Caml Light Michel Mauny January 1995

� �����������

� �� ������������������� �

� �! #"%$'&)(+*�"#,.-0/%12*�3�12,.454(6"#3 78 9��: ��������� .;�<=<�;. ?>@�?;A>CBED F

GAH�I JLKNMPORQ2SRTUQ�V�VXWAY�Z[OPK\Q2Y�]�^_^N]�YA`2W�]�`ba�Mdcec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cecgI�hGAHiG jlkAaemonpV6]�qrKs^\Ttcfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cecgI�hGAHiu jlkAaemvK\Sw]�Y�xA]yVz]�q{K|^\T cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cecgI2I

} ~f;�D����o���� ���BA����D �'}uAH�I j@Q2�'^\a��2a[^�^\Q'Q2��c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cecgI�uuAHiG ����]�^\W�]�OPK\Q2Y���VXSRQ2qda[�E�AS�a�MRM+K\Q2Y�M�ORQ���]�^�WAa�M�c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cecgI��uAHiu j%T'��a�M�c0c0cec0c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cecgI��uAH�� ��WAY�Z[OPK\Q2Y�Mgcec0c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cecgI��uAHi� ��a[��Y'K\OPK\Q2Y�M�cec0c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cecgI��uAHi� �!]�S�OPKN]�^:]��A�'^sK�Z�])OPK\Q2Y�Mrc0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cecgI��

� ~f;�D����p�w�_�_BED 8.���H�I ��WAqr��a�SwM�c0cec0c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec�GAI��HiG  %Q'Q�^\a�]�Y¡��]�^\WAa�Mtcfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec�G����Hiu ¢2ORS£K�YA`'M=]�Y�x¡Z�k�]�Sw]bZ[ORa�SwM¤c0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec�G2���H�� j@WA�'^\a�M5c0c0cec0c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec�G'���Hi� �!]�O�ORa�SRY�Ml]�Y�xU��]�ORO�a�SRYA¥Xq¦]�OwZ�k'K\YA`�cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec�G2§��Hi� ��WAY�Z[OPK\Q2Y�Mgcec0c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec�u2h

� ¨%�ND©��D }C}�AH�I  %W'Ks^NxbK�YA`U^sKNMPOwM�c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec�u2u�AHiG �ª�EORS[]2Z[OPK\YA`ra[^�a�q«a�Y¬OwMLVXSRQ2qd^sKNMPOwM�����]�ORORa�SRYA¥XqU]�OwZ�k'K�YA`gc0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec�u���AHiu ��WAY�Z[OPK\Q2Y�M=Q��2a�S%^sKNMPOwMpc0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec�u2�

­ ®¯D©BE��°R��Bb±l ?BA�²�[�:�_BAD }�³�AH�I ��SRQEx'W�Z[O�O´T'��a�Mrc0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec�u'��AHiG ¢2WAq�OPT'��a�MUcec0c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec�u2��AHiu ¢2WAq�qU]�SRT cec0c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cecd�¬�

I

Page 3: Functional programming using Caml Light Michel Mauny January 1995

G �������������

�2� �¦,?4-� �(63��@&���/���$A(�� $�� �_7³ � �.��;��:<�B �@;A��; D����b����������BAD �.F

�¬H�I ��MPa�SR¥6x'a[��YAa�xvqyWAO[]��'^\ayxA]�Ow]«MPORSRW�Z[ORWAS�a�M¦c0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cecd�¬��¬HiG jlkAa����! ¦OPT'��a c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��2h�¬Hiu "�SRSw]�TAM c0c0cec0c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��AI�¬H�� n.Q'Q2��M��$#&%�')(*�y]�Y�x+ -,.� c0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��2G�¬Hi� �_Q�^\T'q�Q2SR�Ak'KNMPq ]�Y�x¯qrWAOw]��'^\aexA]�O[]�MPORSRW�Z[O�WASRa�Mdc0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec����

/ 0�D���;��_�z ?>21P���43 ���43 ���.��;A���\�@ �D.5eB76:��BA�������� �D �C�§AH�I �ª��Z[a��AOPK\Q2Y�M c0c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��2�§AHiG 8=]�K�M´K�YA`¯]�Y¯a[��Z[a��AOPK\Q2Ygcec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��2�§AHiu j@Sw]��A�'K\YA`Ua[��Z[a��AOPK\Q2Y�M cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��'�§AH�� �_Q�^\T'q�Q2SR�Ak'KNMPq ]�Y�x¯a[��Z[a��AOPK\Q2Y�Mpc0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��2§

F ~f;�D����o�X ����?�!9'���.���!�.� �AF�AH�I ��SPK\Y¬Ow])�'^�afOPT¬�Ca�M cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��2��AHiG :=WAOR�AWAO c0cec0c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��AI�AHiu ;+YA�AWAO=cec0c0cec0c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��2G�AH�� <#k�])YAYAa[^�M�Q2YU�A^\a�M c0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��2G

�>=@?.����B¬;A3 Dr;. �� �@;���D�BA��D ­��I�h�H\I²¢2ORS�a�]�q¦Mdc0cec0c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��2�I�h�H G�¢2ORS�a�]�qdq¦]�OwZ�k'K\YA` ]�Y�xU��])SwMPa�SwM c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��'�I�h�H u �!]�S[]�q�a�ORa�SPKCB�a�xU��]�S[MPa�SwMgc0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��2�I�h�H � ��WASRORkAa�S=SRa�]bxbK�YA`5cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec ���

���D?.��;. ��@;�<��� .B �_����>?��;A3 Df;. ���D�BA�@;���;A��B ���43 �_��<\;A������ ³C³I2IbH\I²¢2Ow])Y�xA]�^\Q2YAae�ASRQb`2Sw]�q¦M«cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec �2�I2IbH G ��SRQ2`2Sw])q¦M_K\Y M£a��2a�Sw]�^��A^\a�M�c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec ��§I2IbH u2"���MPORSw]bZ[OPK\Q2Y c0c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec�§2h

�2�2� E�$A*�4/#-F��&&�G�*H#,.45/#-I� J�K

�A8�LD?�¨�5�LM?�3o;�<�<=¨!;. .>��.;A>�B /��I�G�H\IN"f¢¬n ])��MPORSw]2Z[O=MPT'Y'Ow]��¦ORS�a�a�M cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec�§2�I�G�H G �!]�S[M+K\YA`O"e¢¬n �ASRQ2`bSw]�q¦Moc0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec�§2�

�¬}o®p ��[�:�_BA� D©B�3o;. ������2D���1�LD?�¨ �_����>?��;A3 D F@�I�u�H\I²¢2a�q¦])Y¬OPKNZ���]�^\WAa�M¦cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��AII�u�H G�¢2a�q¦])Y¬OPKNZ�VXWAY�Z[OPK\Q2Y�M c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��2GI�u�H u �ª��]�q«�'^�a�M cec0c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��2u

�2�N0 ��)���_�z ?>���BA�'����D����� F��I��CH\I �@Ks�A��Q�K\Y'O Z[Q2qr�'K\Y�]�ORQbSwMlcec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��2�I��CH GP8la�Z[WAS[M+K\Q2Y ]2M�]r�ASPK\qrK\OPK\�2a�Z[Q2Y�MPORS�W�Z[Otcec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��2�

Page 4: Functional programming using Caml Light Michel Mauny January 1995

������������� u

�A� ?.��;A���N�p�[�:�_�X .> � �_�.<\�$3 �.�������ND 3t;. �� �[�:�_BoD��! ����.BAD���D F�³I���H\I jlkAa0OPT'��aeMPTAMPORa�q c0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0cec��'�I���H G jlkAae]�^�`bQ2SPK\ORkAq c0cfc0c0cec0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0ceclI�hAII���H u jlkAa�"f¢¬n O´T'��a�¥6M£T¬Y'ORkAa�M+KCB�a�S cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0ceclI�h2u

�¬­��e�43 �_��<N�z ?>PLD?�¨���� ;. ²;��:D©����;��)� 3 ;������X .B ������B ���'}I���H\I jlkAa�"���MPORS[]2Z[O mo]2Z�k'K�YAa¤c0c0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0ceclI2I�uI���H G <#Qbq��'Ks^|K\YA` "e¢¬n �ASRQ2`bSw]�q¦M�K\Y¬O�Q�<"0m Z[QAx'a�c0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0ceclI2I��I���H u �ª�Ea�Z[WAOPK\Q2YpQ�V�<" m Z[QEx'agc0cfc0c0cec0cec0c0cfc0c0cec0c0cfc0c0cec0c0cec0cfc0c0cec0c0cfc0c0ceclI2I�§

�A³�Lp �D�rBA��D ��� B76�BA���2�ND©BED �A8.��>/��e�@ ��b<X��D����� �D�;. �� 1R�������?BA�¦��B';��:�z .> �¬}C}

Page 5: Functional programming using Caml Light Michel Mauny January 1995

� �������������

Page 6: Functional programming using Caml Light Michel Mauny January 1995

� ��������� �

�����5� � � � ���%���

jlk'KNMrx'QEZ[WAq«a�Y¬O K�Mf]¯ORWAO�Q2SPKN]�^!K\Y¬O�SRQEx'W�Z[O£K�QbY ORQUVXWAY�Z[OPK\Q2Y�]�^=�ASRQb`2Sw]�q�q{K�YA`���]�Y�x��_q�Q2SRar�ASRa�Z�KNMPa[^\T��%ORQ¯ORkAaW�MR]�`ba=Q�V�<l]�qr^?nCK\`2k'O�H ;6O%k�]2M!�Ca�a�Y¦W�MPa�x{ORQ0ORa�]2Z�k < ]�q{^?nCK\`2k¬O��%K\Y¦xbK���a�S�a�Y¬OlWAY'K\�2a�SwM+K\OPK\a�Ml]�Y�xfKNM�K\Y¬O�a�Y�x'a�xVXQ2Sl��a�`�K\YAYAa�SwM�H ;6O�Z[Q2Y¬O[]�K\Y�MlY¬WAq«a�SRQ2W�Mla[��]�q��'^\a�M=]�Y�xUa[�Aa�SwZ�KNMPa�M��.]�Y�x¯]���M£Q�^\WAORa0��a�`�K\YAYAa�SwM�MPkAQ2W'^NxvSRa�]2x«K\O� k'Ks^\aeM+K\OROPK\YA`rK\YUVXSRQ2Y'O#Q�V:]�< ]�qr^�nCK\`2k'O O�Q2�'^\a��2a[^.^�Q'Q2���AO�a�MPOPK\YA`ra[��]�q«�'^�a�Ml]�Y�x«��])SPKN]�OPK\Q2Y�Ml�'T�ORkAa�q¦M£a[^��ba�M�H

"�VXORa�S¯`2a�YAa�Sw]�^sK\OPK\a�Mo]���QbWAO¯VXWAY�Z[OPK\Q2Y�]�^y�AS�Q2`2Sw]�q«qrK\YA`��0MPQ2q�apVXa�]�ORWASRa�M¯MP�Ca�Z�Ks�?Z ORQ < ]�qr^yn?K�`bk¬Oo]�SRax'a�MRZ[SPK\�Ca�x.Hemon O´T'��arMPT'Y¬ORkAa�M´K�M0])Y�x ]UM+K\q��'^\a�a[�Aa�Z[WAOPK\Q2Yoq�QAx'a[^ ]�SRae�AS�a�MPa�Y¬O�a�x¯K\Y ]UZ[Q2q��'^\a�ORara[��])q��'^\aQ�V!�ASRQ2ORQbO´T'�'K\YA`�]�MPWA��MPa�O�Q�Vªmon!H

�!])SRO ;! PZRk�]��AO�a�SwM¦G#"E�%$0q¦]�T �Ca M'&2K\�A�Ca�x �'T²W�MPa�SwM{V6]�qrKs^sK�])S � K\ORk mon!H��MPa�SwM � K\ORk a[�E�Ca�SPK\a�Y�Z[aoK\YVXWAY�Z[OPK\Q2Y�]�^:�ASRQb`2Sw]�q�q{K�YA`��2�AWAO=WAY'V6]�qrKs^sKN]�S � K�O�k¯ORkAa mon xbKN]�^\a�Z[OwM�q¦]�T�M'&bK��pORkAa��2a�SRTr��SwM£O ZRk�])�AORa�SwMl]�Y�xMPOw])SROy]�OrZRk�])�AORa�S��(�@^�a�])SRY'K\YA` ORkAaD< ]�qr^=nCK\`2k¬OUMPT¬Y'Ow]��oVXSRQ2q ORkAa¦a[��]�q��'^\a�M�H �!])SRO ;eMPO[]�SROwM � K\ORk M£Q2q�aK\Y¬O�W'K�O£K�QbY ]��CQ2WAO�VXWAY�Z[OPK\Q2Y�Me]�Y�x O´T'��a�M0])Y�xo`�K\�2a�M0]�YoQ��2a�SR�bK\a � Q�VLmon ])Y�x¡QbORkAa�S�V WAY�Z[O£K�QbY�]�^#^N]�YA`2W�])`2a�M ´Z�k�]��AORa�SrG%$wH <#k�])�AORa�S�u¡QbWAOP^sK�YAa�M{ORkAa�K\Y'ORa�Sw]2Z[O£K�QbY � K\ORk ORkAaD< ]�qr^=nCK\`2k'OyO�Q2�'^\a��2a[^l^�Q'Q2�²]�Y�x K�O[Me��]bM+KNZQ2�()Pa�Z[OwM�H� l]2M+KNZ¯OPT'��a�MU]�Y�x²MPQ2q«a¡Q�V0ORkAa[K\S ]bMRMPQAZ�K�])ORa�x²�ASPK\qrK\OPK\�2a�M¯])SRa¯�ASRa�MPa�Y'ORa�x K\Y Z�k�]��AORa�S���H�nCKNMPOwM ´Z�k�]��AORa�S �*$L]�Y�xvW�MPa�SR¥6x'a[��YAa�xpOPT¬�Ca�M+ PZRk�]��AO�a�S �%$=]�SRaeMPORS�W�Z[ORWASRa�x¡xA])Ow]�]�^s^\Q � K\YA`UV Q2S�ORkAaeSRa��AS�a�MPa�Y¬O[]�OPK\Q2YQ�V#Z[Q2q��'^\a[�¡Q2�()Pa�Z[OwMl]�Y�xvORkAa[K\S=a�]2MPT¯Z[SRa�]�OPK\Q2Yo]�Y�x¯x'a�MPORS�W�Z[ORWASw]�OPK\Q2Y�H

, k'Ks^\a Z[QbY�Z[a��AOwM!�ASRa�M£a�Y¬ORa�xyK�Y«��]�SRO;!]�SRa=Z[Q2q«q�Q2Y 6WAY�x'a�S#QbYAalV QbSRq¤Q2S#]�YAQ2O�kAa�S�$�ORQeqU]�Y¬T V WAY�Z[O£K�QbY�]�^^N]�YA`2W�]�`ba�M��_��]�SROy - PZRk�]��AO�a�SwMr��".I2I.$lKNMrx'a�xbK�Z�])ORa�x O�Q¯VXa�]�ORWASRa�MfMP��a�Z�Ks�?ZUORQ@< ]�qr^ nCK\`2k'O��rqrWAOw]��'^\a¯xA]�Ow]MPORS�W�Z[ORWASRa�M/ ´Z�k�]��AORa�Sf��$0�'a[��Z[a��AOPK\Q2Yok�]�Y�xb^sK\YA`1 ´Z�k�]��AORa�S §*$0�'K\YA�AWAO�2�Q2WAO��AWAO3 ´Z�k�]��AORa�S��%$ ]�Y�xpMPORSRa�]�qUM=]�Y�x��]�SwM£a�SwM4 ´Z�k�]��AORa�S I�h%$¦M£kAQ � ] q«Q2SRapK\q���a�Sw])OPK\�2a M+KNx'a Q�VyORkAap^N]�YA`2W�])`2a2H ¢2Ow]�Y�xA]�^\Q2YAa �ASRQ2`2Sw])q¦M¯]�Y�xMPa���]�S[]�ORayZ[Qbq��'Ks^�])OPK\Q2Y5 ´ZRk�])�AORa�SeI2I.$=]�^s^\Q � VXQ2S=q�QAx'W'^N]�S0�ASRQ2`bSw]�q�qrK\YA`¦])Y�x¡O�kAayZ[SRa�]�O£K�QbY¡Q�V MPO[]�Y�xA]�^\Q2YAa]��A�'^sKNZ�]�OPK\Q2Y�M�H <#Q2Y�Z�KNMPafa[��])q��'^\a�M=Q�V�< ]�q{^@n?K�`bk¬O�V a�])ORWASRa�M=]�S�a0ORQr��a0VXQ2WAY�x K�YpORk'KNMl��]�SRO�H

�!])SRO�<� ´Z�k�]��AORa�SwM%I�G6".I��%$AKNM_q�a�]�Y'O@V Q2S!]�^\SRa�]2x'Tfa[�E�Ca�SPK\a�Y�Z[a�x <l]�qr^�nCK\`2k¬O!W�M£a�SwM � K|^s^sK\YA`rORQ7&'YAQ � q«Q2SRa]��CQ2WAO kAQ � ORkAaO<l]�qr^ªnCK\`2k'OeZ[Q2q��'Ks^\a�SyM£T¬Y'ORkAa�M+KCB�a�M�ORkAafO´T'��a�M�Q�V#a[�A�ASRa�MRM+K\Q2Y ]�Y�xpkAQ � Z[Q2q«�'K|^N]�O£K�QbY ]�Y�xa���]�^�W�])OPK\Q2Y �AS�QEZ[a�a�xAM�Hv¢2Q2q�a8&'YAQ � ^\a�x'`2a¯]���Q2WAO���S[MPOR¥XQ2Swx'a�SfWAY'Ks�?Z�]�OPK\Q2Y K�Mf]2MRMPWAq«a�x.H¦jlkAa��AS�a�MPa�Y¬O[]�OPK\Q2YKNM�S[]�ORkAa�S«K�Y'VXQ2SRqU]�^9�=]�Y�x KNMUMPQ2q�a�OPK\q�a�M«ORa�SwM£a1 ´MP�Ca�Z�KN]�^s^�T K\Y O�kAa Z�k�]��AORa�S¯]���Q2WAO«O´T'��aoMPT'Y¬ORkAa�M´K�M:$wH , a�ASRQ2O�Q2OPT¬�Ca¦]oMPq¦]�^s^L])Y�x²M+K\q��'^\aUV WAY�Z[OPK\Q2Y�]�^ ^N]�YA`bW�]�`2a4 ´Z�]�^s^\a�x "e¢¬n;$[� � aU`�K\�2aUORkAa Z[Qbq��'^\a�ORa¯�ASRQ2ORQbO´T'��aK\q��'^\a�q�a�Y'Ow]�OPK\Q2Y��)V SRQbq ORkAa�"f¢¬n¯��]�S[MPa�S:O�Q ORkAa=MPT'qr��Q�^sKNZla[�Aa�Z[WAOPK\Q2Y�Q�V�Z[QEx'a2H!n.a[�'K\YA`y]�Y�xf��]�S[M+K\YA`0Q�V�"e¢¬n�ASRQ2`bSw]�q¦M�]�SRaf�ASRa�MPa�Y'ORa�xpK\Y ZRk�]��AO�a�S�I�G(�C�ASRQ��2KNxbK\YA`¡SRa�]�^|KNMPO£K�Z«W�MR]�`ba�M=Q�V=MPORSRa�])q¦M ])Y�x¡��])SwMPa�SwM�H <#k�])�AORa�SI�uf�ASRa�MPa�Y'OwM=])Y¯WAY¬OPT'��a�x¯Z�]�^s^\¥X�¬T'¥X��]�^�WAa�MPa�qU]�Y¬O£K�Z�MLQ�V�"f¢¬n �ASRQb`2Sw]�q¦M�ORkASRQ2WA`bk¯ORkAaex'a[��Y'K\OPK\Q2Y¡Q�V#]�Y "e¢¬nK\Y¬O�a�SR�ASRa�ORa�S�H jlkAaUa�Y�Z[QExbK\YA` Q�V SRa�Z[WASwM´K�QbY K�Y²WAY'OPT¬�Ca�x "e¢¬n K�M{�ASRa�MPa�Y'ORa�x K\Y ZRk�]��AO�a�S I©���!MPkAQ � K\YA` ORkAa<>=�?A@7B>C�DFEHG�I�JLKLM�NAO�PRQ�@'KLSUTVM0N+MFW�JL?A@'SL@XNAM�JL@'S�TVS;D'Q0DYTZG[D]\^GV@7D]S;D]N+_L`bac_ed4JL@gf>?AN^TVfYDYG�KL@'h.M0KLJji k�l'mUn

Page 7: Functional programming using Caml Light Michel Mauny January 1995

� ��������� ����� � ����������� � ��� ���

a[�A�ASRa�MRM+K\�2aU��Q � a�S0Q�V=ORkAar^N]�YA`2W�])`2a2H¯jlkAa�OPT¬�Ca M£T¬Y'ORkAa�M+KNM0Q)V VXWAY�Z[OPK\Q2Y�]�^l�ASRQ2`2S[]�q¦M�KNMrx'a�q�Q2Y�MPORS[]�ORa�xvK\YZ�k�]��AORa�S0I��(�'W�M+K\YA`¦x'a�MPO�SRW�Z[OPK\�2a0WAY'Ks�?Z�]�OPK\Q2Y 6QbY���SwM£OR¥XQ2Swx'a�SlORa�SRqUM#S�a��ASRa�MPa�Y'OPK\YA`�OPT¬�Ca�M�$#]2Ml]yZ[a�Y'ORSw]�^?ORQ'Q�^6H<#k�]��AO�a�S I��¯K\Y'ORSRQAx'W�Z[a�MrORkAaD< ]�ORa�`bQ2SPKNZ�]�^ "���MPORS[]2Z[Oymo]2Z�k'K\YAa2� ]oM+K\q��'^\apa[�Ea�Z[WAOPK\Q2Y²q«QEx'a[^lVXQ2S�Z�]�^s^�¥X�'T'¥��]�^�WAavV WAY�Z[O£K�QbY�]�^=�ASRQ2`2Sw])q¦M�H "�^�O�kAQ2WA`2k²ORkAaD< ]�qr^=nCK\`2k'O�a[�Ea�Z[WAO£K�QbY q�QAx'a[^lK�M«xbK[��a�SRa�Y'OrVXSRQ2q ORkAa¯Q2YAa�ASRa�MPa�Y'ORa�xvkAa�SRa��?])YUK�Y'ORW'K\OPK\Q2Y ]��CQ2WAO O�kAayM+K\q��'^\a�Z[Q2q��'Ks^N]�OPK\Q2YpQ�V!V WAY�Z[O£K�QbY�]�^�^N]�YA`2W�]�`ba�M Z�]�Yp��a V Q2WAY�x K\YORk'KNM�ZRk�]��AO�a�S�H

� ;��b ��X .>�5 jLkAa��ASRQ2`2S[]�q¦M�]�Y�xoSRa�q¦])S]&EM +a�MP��a�Z�KN]�^s^\T Z[QbY¬Ow]�K�YAa�x K�Y ��]�SRO[M0  ]�Y�x <R$=qrK\`2k'OeYAQ2O0�Ca��]�^|KNxvK\YN< ])qr^:nCK\`2k¬O��2a�SwM´K�QbY�M=xbK���a�S�a�Y¬OlVXSRQ2q hAHs�¬H

Page 8: Functional programming using Caml Light Michel Mauny January 1995

� �� � �

� � � � ���%� � ��� � ���� ��� �l� �

Page 9: Functional programming using Caml Light Michel Mauny January 1995
Page 10: Functional programming using Caml Light Michel Mauny January 1995

� ��������� �

� � � � ���%��� ��� � � � � � � � ��

�!S�Q2`2Sw]�q«qrK\YA`U^�])YA`2W�]�`2a�Mf]�SRa�MR]�KNxoORQp��a����������� ������ � kAa�Y ORkAar��]2M´K�Z � ]�T¡Q�V=MPORSRW�Z[ORWAS£K�YA`p�ASRQ2`2S[]�q¦MLK�MORkAa�YAQbOPK\Q2Y Q)V����������� ��¡])Y�x ORkAa[K\Sra�MRMPa�Y'OPKN]�^=Z[Q2Y¬O�SRQ�^ MPORS�W�Z[ORWASRarKNM����������� �������������������� ���H¯�AQbS0a[��]�q«�'^�a��ORkAa¯nCKNMP� ^N]�YA`2W�]�`ba�� GbG�>�ª])Y�x q�Q2SRa��AS�a�Z�K�M£a[^�T K\OwMfq�QAx'a�SRY²MPW�Z�Z[a�MRMPQbS¦¢¬Z�kAa�q�a�� u�I#�lI��9�_k�]2Mf��a�a�Y Z�]�^|^\a�xVXWAY�Z[OPK\Q2Y�]�^:�Ca�Z�]�W�MPafK\O=��Q¬M�MPa�MRMPa�MlO�kAa�MPaeO � Qr�ASRQ2��a�S�OPK\a�M�HJ�Q � a��2a�SA� � a � ]�Y¬O�ORkAar�ASRQ2`bSw]�q�qrK\YA`¯YAQ2O£K�QbY Q)V!V WAY�Z[OPK\Q2Y ORQ¯��a�]2M0Z�^\Q¬MPa�]2M��CQ¬MRM+K\�'^\aUORQ¦O�kAayW�M£W�]�^q¦]�O�kAa�q¦]�OPKNZ�]�^:YAQbOPK\Q2YoQ�V!V WAY�Z[O£K�QbY�H�;6Yoq¦])ORkAa�q¦]�OPKNZ�M���VXWAY�Z[OPK\Q2Y�M0]�SRa! ���SwMPOR¥6Z�^N]2M�M#"rQ2�()Pa�Z[OwM��lO�kAa�T¡Z�]�Y¡�Ca]�SR�'K\ORS[]�SPKs^\TyqU]�Y'K\�AW'^�])ORa�x.H ��Q2S!a[��]�q��'^\a��'ORkAa�TyZ�]�Y«��a0Z[Q2q���Q'MPa�x��¬]�Y�x{ORkAa Z[Q2q��CQ¬M+K\OPK\Q2YrVXWAY�Z[OPK\Q2Y«KNM_K\OwMPa[^sV]fVXWAY�Z[OPK\Q2Y�H

;+Y¯q¦]�ORkAa�qU]�OPKNZ�M��AQ2YAa � Q2W'^Nxv�ASRa�MPa�Y'O=ORkAa%$��&���(')$($� �*_VXWAY�Z[OPK\Q2YvK�YpORkAa�VXQ�^s^�Q � K\YA` � ]�T.�$��&���(')$($� �*%�,+ -�. +

/10-2. /43 IjlkAa�VXWAY�Z[OPK\Q2Y�]�^#Z[Q2q��CQ¬M+K\OPK\Q2Y Z[QbW'^�xv��af�ASRa�MPa�Y'ORa�x¡]2M©�

5 � 7698;: $�< 7=>8?6 $@-2. 7=>8?: $ 7A�BDC�$ 0 -2. 7E 0 -�. A �CFE�$F$

� kAa�SRa D6G8;: $=x'a�YAQ2ORa�MlORkAaeM£��]2Z[aeQ�V@V WAY�Z[OPK\Q2Y�MLVXSRQ2qH6ORQI:«H, a0SRa�q¦]�S]&«kAa�SRaeORkAa�K\q��CQ2SROw])Y�Z[aeQ�VR�IbHlORkAa=YAQ2OPK\Q2Y«Q�V��JK�L'NMA]�q¦]�ORkAa�q¦])OPKNZ�]�^AV WAY�Z[O£K�QbY ]�^ � ]�TEM_�CQ¬MRMPa�M�MPa�M#]PO� �Q%�����y]�Y�x«]4�� O� �Q%������H!jlkAa�T

� Ks^|^!Z[Q2SRSRa�MP�CQ2Y�x¯O�Q�ORkAa0�ASRQ2`bSw]�q�qrK\YA`rYAQ2OPK\Q2YpQ�V!O´T'��a2HG�H%^�a[�'KNZ�]�^=�'K\Y�xbK�YA`C� � kAa�Y � a � SRQbORa�ORkAa�qU]�ORkAa�q¦]�O£K�Z�]�^ x'a[��Y'K�O£K�QbY²Q�VR$��&����'�$�$S �*�� � a�k�]��2a¦]2M�MPWAq�a�xORk�]�O!ORkAa ]bxAxbK�O£K�QbYUV WAY�Z[OPK\Q2Y 3 k�]2x{��a�a�Y¯�ASRa��bK\Q2W�M+^\T¦x'a[��YAa�x��Aq¦])�A�'K�YA`r]0��]�K\SlQ�V�Y�]�ORWAS[]�^�Y¬WAqr�Ca�SwMORQ ]«Y�]�ORWAS[]�^ªY'WAqr��a�SM@ORkAarq�a�]�Y'K\YA`¯Q�VlORkAaT$S���(��'�$�$� �*!VXWAY�Z[OPK\Q2YoKNM0x'a[��YAa�xoW�M´K�YA`pORkAa!Q%'(��������U0Q�VORkAa ]bxAxbK�O£K�QbY�� � k�]�ORa��ba�S 3 x'a�YAQ2ORa�M%K\YUORkAa=VXWAORWASRa��'ORk'KNMV$��&���(')$($� �*@VXWAY�Z[OPK\Q2Y � Ks^s^�S�a�q¦]�K\Y¯ORkAa0MR]�q�a2H

u�HlORkAa�YAQ2OPK\Q2Y Q�VW���������� ������X��Y�$��*7������ ���� ]�^s^�Q � K\YA`�ORQ a[�E�ASRa�M�M O�kAa �Ca�k�]��bK\Q2SdQ�VZA 5 Ct]2M 7E 0 -2. A �C[E�$F$0�bKzH�a2H!ORkAa�VXWAY�Z[OPK\Q2Y � k'KNZ�k�� � kAa�Y¡`�K\�2a�Y¡MPQbq�a\E��AS�a�ORWASRY�M]A �CFEc$wH

mon xbKN]�^\a�Z[OwM PZ�V£HU��a[^\Q � $0SRa�MP�Ca�Z[OrORkAa�MPaUYAQ2OPK\Q2Y�M�H¯ %WAOrORkAa�T ]�^NMPQo]�^s^�Q � YAQ2YA¥�VXWAY�Z[OPK\Q2Y�]�^=�ASRQ2`bSw]�q�qrK\YA`MPOPTb^�a�M^��]�Y�x��'K\Y¡O�k'K�M�MPa�Y�MPa���ORkAa�T ])SRa�V WAY�Z[O£K�QbY�]�^:�AWAO�YAQ2O�����*D'��J����&������ ������sH

Page 11: Functional programming using Caml Light Michel Mauny January 1995

I�h ������� ������� �� ��� � � � ��������� ����� � �� ��

� � ��� �������������������! "�#� �$�!%�&'& %��!($�!%)(�*+�

¢2Q2q�a0k'KNMPO�Q2SPKNZ�]�^!��Q�K\Y'OwM��, I��2u2hA�4"=^\Q2Y�B�Q+<#k¬WAS[ZRk¯x'a��2a[^\Q2��a�xvORkAa.-E¥6Z�]�^�Z[W'^\W�M � �N��]2Ml]�Y ])ORORa�q��AOlORQf�ASRQ��2KNx'ae]f��]2M+KNM%VXQ2S#qU]�ORkA¥a�q¦]�OPKNZ�M�H¯jlkAa/-A¥6Z�]�^NZ[W'^\W�MfKNMe] V QbSRq¦]�^#ORkAa�QbSRTpV Q2S�VXWAY�Z[OPK\Q2Y�]�^sK\OPT2H¡jlkAaUORkASRa�a���]bM+KNZ¦Z[Q2Y�M£ORSRW�Z[OwM�Q�VORkAa�-A¥6Z�]�^NZ[W'^�W�M0])SRa2�0 ��]�SPKN]��'^\afY�]�q�a�M/ 6a2H�`�H E��21��\c�c�c'$(M0 ]��A�'^sK�Z�])OPK\Q2Y1 4365 KsV73 ]�Y�x/3 ]�SRa0O�a�SRq¦M�$(M0 V WAY�Z[OPK\Q2Y�]�^ª]���MPORS[]2Z[OPK\Q2Y 8-�E�c93 $wH

j�a�SRqUM�Q�V#ORkAa/-A¥6Z�]�^NZ[W'^\W�M0SRa��AS�a�MPa�Y¬O V WAY�Z[O£K�QbY�M�HyjLkAa��AWASRa:-A¥6Z�]�^NZ[W'^�W�Mfk�]2M��Ca�a�Y �ASRQ��2a�xvK\Y�Z[Q2Y�M+KNMP¥ORa�Y¬Oe]bMe]U^\Q2`)K�Z�]�^LO�kAa�Q2SRT2Hp¢2Q2q�a[�JK� 'T$SJN$��'Q $0k�]��bay�Ca�a�Y ]2xAx'a�x ORQ¯K\O0K\Y Q2Swx'a�SfORQ¡SRa�q«a�x'T ORk'KNMK�Y�Z[QbY�M+KNMPORa�Y�Z[T2H

, I��2�2§A�0mo]2Z <l]�SRORk'T¯K\Y'�2a�Y¬O�a�x nCKNMP�9� G2GN� � kAQ¬MPa��AS�Q2`2Sw]�qUM�k�]��ba¦MPQ2q�aUM+K\qrKs^�])SPK\OPK\a�M � K\ORk ORa�SRq¦M�Q�VORkAa'-A¥6Z�]�^NZ[W'^�W�M©H nCKNMP��xbKN]�^\a�Z[OwMUk�]��2a¦�Ca�a�Y�SRa�Z[a�Y¬O£^�T a��2Q�^\�bK\YA` K\Y QbSwx'a�S�ORQ �Ca Z�^\Q¬MPa�S«ORQ q�QAx'a�SRYV WAY�Z[OPK\Q2Y�]�^�^N]�YA`2W�]�`2a�M R¢¬ZRkAa�q«a.$0�A�AWAO�ORkAa�T M£OPKs^|^!x'Q¦YAQ2Ol�CQ¬MRMPa�MRM�]rOPT'��aeMPTAMPORa�q¡H

, I��2�2�A�%�:H.n�]�Y�xbK\Yo�ASRQ2�CQ¬MPa�xvORkAa ;�¢ , ;Pm ��I�§N��^N]�YA`2W�])`2a8 XVXQ2S ;XV<;!Q2W ¢2a�a , k�]�O ;Lmpa�]�Y�"*$0� � k'KNZ�kK�MLORkAae�ASRa�Z[WAS[MPQ2S=Q�V_^N]�YA`2W�]�`ba�MlQ�V!ORkAaemonpVz])qrKs^�T2H, I��'��§A�#=AHA l]2Z]&'W�M�K\Y¬ORS�QEx'W�Z[a�x¯�!���¬] ^N]�YA`2W�]�`2a�Q�VªZ[Qbqy�'K\Y�]�O�Q2SwM]�iu��]�Y�xU] V S[]�q�a � Q2S]& K�Y � k'K�Z�kUK\O%K�M��Q¬MRM´K��'^\afORQeSRa�]bMPQ2Y¯]���Q2WAOl�ASRQb`2Sw]�q¦M©H:jlkAa0q¦]�K�YU��]�SRO£K�Z[W'^N]�S£K�OPTUQ�Vª�!� �ASRQb`2Sw]�q¦MªKNMlORk�]�O%ORkAa�T�k�]��2aYAQ���]�S£K�])�'^�afY�]�q�a�M�H

, I��'��§A��80HCm¯Ks^\YAa�S��ASRQ2��Q'MPa�M ]y^�])YA`2W�]�`2aeZ�]�^s^\a�xomon��\I2I��9�'K\Y'ORa�Y�x'a�xpORQr��afORkAaIQ%'���� ���&U����U�'=Q�V!ORkAan < � �ASRQ'Q�V#]2MRM+KNMPOw])Y¬O/ XK6H a2H!O�kAa0^N]�YA`2W�]�`ba0W�MPa�x¯ORQ«�ASRQ2`2Sw])q O�kAaeMPa�]�SwZ�k¡Q�V_�ASRQ¬Q)VzM�$[H#jlk'KNMl^N]�YA`bW�]�`2aK�M K�Y�M£�'K�S�a�x¡�'T ;R¢ , ;Pm PZ�^�Q'MPaeORQ:-A¥6Z�]�^NZ[W'^\W�M�$ ]�Y�xU�CQ¬MRMPa�MRM£a�M=]�Y¡QbSPK\`�K\Y�]�^:OPT¬�CaeMPTAMPORa�q¡H

, I��2§2�A�_�rH¬j@WASRYAa�Sl�ASRQ2�CQ¬MPa�xUORkAa0mvK�S[]�Y�xA]T� u2�N�.�ASRQ2`2Sw])q�qrK\YA`0^N]�YA`2W�])`2a�� � k'KNZRk¯W�MPa�MlmvKs^\YAa�S?> MlOPT'��aMPTEM£ORa�qd�AWAO � kAa�S�a0�ASRQ2`2Sw])q¦Ml]�SRaeMPWA�AqrK\ORO�a�x¯ORQ[���A@�J%'?BN�����&����� ��CH<#WASRS�a�Y¬OP^\T��AO�kAa0O � Qrq¦]�K\YvVz]�q{K|^sK\a�M�Q�V�VXWAY�Z[OPK\Q2Y�]�^_^N]�YA`2W�]�`ba�M=]�SRa0ORkAaemon ])Y�x¯ORkAaemvK\Sw]�Y�xA]fV6]�qrKs^sK\a�M�H

�C D6E!*GF H �?%�IJ�K&8�

mon ^N]�YA`2W�])`2a�Mr]�SRa���]2M£a�x Q2Y ] M£WA`¬]�SRa�x � �ba�SwM+K\Q2Y Q�VL-A¥6Z�]�^NZ[W'^\W�M�HojlkAa[K\S�a���]�^\W�]�O£K�QbY SRa�`)K�q«a�KNMT�(�����9M Y)JNMB��� ��' XK6H a2H!ORkAa ])SR`2WAq�a�Y'O_KNM#a���]�^\W�]�ORa�x«��a[VXQ2SRa���a[K\YA`r��]2MRMPa�x«ORQe] V WAY�Z[OPK\Q2Y�$��E])Y�xrORkAa�TrW�MPa0m¯Ks^\YAa�S?> M%OPT'��aMPTAMPORa�q¡H

jLkAa n < � �ASRQ¬Q)V{MPTAMPORa�q�]��A�Ca�]�SRa�x K\Y I��'��G ]�Oo¢2Ow]�Y'VXQ2Swx R¢2Ow]�Y'VXQ2Swx�n < �j$[H;+O¡k�]2MU�Ca�a�Y�V WAS�ORkAa�Sx'a��2a[^\Q2�Ca�x ])O�<l]�qr�ASPKNx'`2a8 <l]�qr�ASPKNx'`2a n < �j$ � kAa�SRafORkAaemonp^N]�YA`2W�]�`ba � ]2Ml]2xAx'a�x¯O�QeK\O�H��SRQ2q I��2§AI�ORQ¯I��2§b�(�¬]f�2a�SwM´K�QbY¯Q�Vªmon ]�Y�x«K\OwM=Z[Qbq��'Ks^�a�S � ]bM x'a��ba[^�Qb��a�xUK\Yo]yZ[Q)^|^N]��CQ2Sw]�O£K�QbY¡��a�O � a�a�Y;´� 8�;I" ]�Y�xD< ])qy�AS£K�x'`ba0�¬TPOyHA<%Q2W�M+K\YAa�]�W���OrH�J=WAa�O�]�Y�x¡n!HC�!]�W'^NMPQ2Y�H< T n @�n2Q�TVJL?3DjE M0KL@"R6SL@'KTS W KUTV@gNNU�GWV+SXV�N�J9DZY.n

Page 12: Functional programming using Caml Light Michel Mauny January 1995

� �� � ����� � � � ����� � ��� �4��� I2I

;+Y I��2§AI��!n!H < ]�S[x'a[^|^sK=K\q��'^\a�q�a�Y'ORa�x ]¡�ba�SwM+K\Q2Y Q�V mon � kAQ¬MPa¯Z[Q2q��'Ks^\a�S¦`ba�YAa�Sw]�ORa�x Y�]�OPK\�2aUq¦]2Z�k'K\YAaZ[QAx'a2H;+Y I��2§����_] Z[Qbq�qrK\ORORa�aUQ�V SRa�M£a�]�SwZ�kAa�SwM�VXSRQ2q ORkAa¦WAY'K\�2a�S[M+K\OPK\a�M�Q�V0�#xbK\Y¬�AWAS�`2k ]�Y�x < ]�qr�ASPKNx'`2a��! %a[^|^

n�]��CQ2Sw]�O�Q2SPK\a�M#]�Y�x ;´� 8�;F" �'kAa�]2x'a�xr�'T 8 H¬mvKs^�YAa�S � Q2S]&ba�xeQbY¦]0YAa � a[�EORa�Y�x'a�x{^N]�YA`2W�]�`ba Z�]�^s^\a�x¯¢2Ow])Y�xA]�Swxmon�� G2§N�6H%jlk'KNM Z[Q2S�a�^�])YA`2W�]�`2a � ]2MlZ[Q2q��'^\a�ORa�xp�'T ]{q�QEx'W'^\a Vz]2Z�Ks^sK\OPT¡x'a�M+K\`2YAa�xp�¬T¯�rHAm ]bZ��=WAa�a�YX� G2u �6H¢�K\Y�Z[aoI��2§�����ORkAa+< ]�qr^_^N]�YA`2W�]�`2a«k�]2M0�Ca�a�Y WAY�x'a�Syx'a�M+K\`2Y K\Y ]¡Z[Q)^|^N]��CQ2Sw]�O£K�QbY ��a�O � a�a�YN;´� 8�;I" ]�Y�xnA;P�#� ¢.$wH ;6OwM@��S[MPO!SRa[^\a�]2MPa ])�A��a�]�SRa�xyK�YpI��2§'�¬H_jlkAalq¦]�K\YrK\q��'^\a�q�a�Y'ORQ2SwM�Q�V�< ]�q{^ � a�SRa�"0MRZ��]�Y�x'a�S=¢2W �])SRa B���_K\a�SRS�a , a[KNM�]�Y�x¯mvK�Z�kAa[^ªmo]�WAY'T2H

;+Y I��2§2�e])�A��a�]�SRa�xv¢2Ow]�Y�xA])Swx¦monpQ�Vª��a � ¥ =�a�S[MPa�T���x'a��2a[^\Q2�Ca�xU�¬TO"�Y�x'SRa � "��A��a[^H ´��SPK\Y�Z[a�ORQ2Y �=Y'K\�2a�S�¥M+K\OPT�$l]�Y�x¯�0]��2KNx¯mo]2Z��=WAa�a�Y1 P #a[^s^#n�]��CQ2Sw]�ORQbSPK\a�M�$wH

<l]�qr^ªnCK\`2k'O�KNMe]UMPq¦]�^s^\a�SA�.q�QbSRar��Q2SRO[]��'^\aeK\q��'^\a�q�a�Y'Ow]�O£K�QbY Q�V#ORkAa�Z[Q2SRa < ])qr^�^N]�YA`2W�]�`ba���x'a��2a[^\Q2��a�x�'T��0]��2K\a�S n.a�S�Q�T¯M+K\Y�Z[a¯I��2�2h�H

��� D6E!*GF � ��%���� % �N%�I �K&8�

"�^|^@^�])YA`2W�]�`2a�M%K\Y¯ORk'KNM%V6]�qrKs^\T¯W�MPa4���A@�J%'?B��� ������� �� XK6H a2H!O�kAae]�SR`2WAq�a�Y'OlQ�Vª] VXWAY�Z[OPK\Q2Y¯KNMla���]�^\W�]�ORa�xUKsV#]�Y�x� kAa�Y¯ORkAa�VXWAY�Z[OPK\Q2Y¦YAa�a�xAM K�O[Ml��]�^\WAa�� ]�S�`2WAq�a�Y'OwMl]�SRa���]2MRMPa�x«WAYAa���]�^\W�]�O�a�x¯ORQ V WAY�Z[OPK\Q2Y�M:$wH#jlkAa�T¯]�^NMPQrW�MPamvKs^�YAa�SN> M=OPT'��aeMPTAMPORa�qpH

n@]�YA`2W�]�`2a�ML��a[^\Q2YA`�K\YA`¯ORQ�O�kAaymvK\Sw]�Y�xA]fV6]�qrKs^\T¯��Y�xvORkAa[K\S Q2S£K�`)K�YvK\Y O�kAar¢&"e¢¬n ^N]�YA`2W�])`2aI� u)� � wI��'���*$x'a��2a[^\Q2�Ca�x¡�'T¡�rH�j@WASRYAa�S�H�¢&"e¢¬n²])Y�xUK\OwM�MPW�Z�Z[a�MRMPQ2S[M/ ���8 <Z�iu2�N�#I��2§AI ��mvK�S[]�Y�xA]!� u2�N�lI��2§2�r]�Y�xpJ ]bM'&2a[^s^�\I��N�lI��2�2h*$#W�MPaT$S'N�$ D�%Q%�&�������� J *D'(�N�&*K$S�TB'P'��N�&����� �� $ ]2M=�AS�Q2`2Sw]�qUM�H=jlkAa�MPara��bW�]�OPK\Q2Y�M0]�SRa � SPK\ORORa�YpK\Y ]$��*�� ��c ´Z[Q�^s^\a�Z[OPK\Q2Y¦Q)V@x'a�Z�^N]�S[]�OPK\Q2Y�M�$!]�Y�xrORkAa=W�M£a�S#q¦]�Tea���]�^\W�]�ORa�a[�E�AS�a�MRM+K\Q2Y�M%W�M+K\YA`e��]�^\WAa�M x'a[��YAa�x«K\YUORk'KNMMRZ[SPK\�AO�Hpn�mon� Pn�]!B�T mon;$0k�]2M0�Ca�a�Y x'a��2a[^\Q2�Ca�x K\Y O��Q2ORa��CQ2SR` R¢ � a�a�x'a�Y�$(MªK�O[MyM£T¬Y'Ow]��oKNMeZ�^\Q¬MPa¯O�Q¡m n > MMPT'Y¬O[]�� ]�Y�x K�O�W�MPa�M ]yVz]2M£O a[�Aa�Z[WAOPK\Q2Ypq�QEx'a[^6�%ORkAa�O ¥XqU]2ZRk'K\YAaT�\I��N�6H

��� DF\.M0K9DFJLM]TVKL@+U! _UN�W M0KLERDFJUT#"KRA@ UA@;G$ % f'M]GV@R` M0KLERDYGV@HIKRAh�&@'KUTV@4R6KL@�'(*) a RA@<U! +cGVE�'-,�)�.�.�) /(D]KUTVS

Page 13: Functional programming using Caml Light Michel Mauny January 1995

I�G ������� ������� �� ��� � � � ��������� ����� � �� ��

Page 14: Functional programming using Caml Light Michel Mauny January 1995

� ��������� �

� �t � � �d� � �d� � �5

, ala[��]�qrK\YAa%K�Y«ORk'KNM!ZRk�]��AO�a�S#MPQ2q�a�V WAY�xA]�q«a�Y¬Ow]�^�Z[Q2Y�Z[a��AO[M � k'KNZ�k � a � Ks^s^�W�MPa=]�Y�xrMPORW�x'T K�YrORkAa%VXQ�^s^\Q � K�YA`Z�k�]��AORa�SwM�H ¢2Q2q�apQ�VeORkAa�q�]�SRa M£��a�Z�Ks�?Z O�Q ORkAapK\Y¬ORa�S£Vz]2Z[a � K\ORk�ORkAaN<l]�qr^�^�])YA`2W�]�`2a 6ORQ2�'^\a��2a[^9�=`)^�Qb��]�^x'a[��Y'K\OPK\Q2Y�M�$ � k'Ks^\aeQbORkAa�SwM=]�S�ae]��A�'^sK�Z�])�'^�a«ORQ�]�Y¬T«VXWAY�Z[OPK\Q2Y�]�^�^N]�YA`2W�])`2a2H

�� � D'���:& *��L* & & ����jlkAal��S[MPO Z[Q2Y'Ow]2Z[O � K\ORk < ])qr^AKNM#O�kASRQ2WA`2krK\OwMªK\Y¬ORa�S[]2Z[OPK\�2a0]2MP��a�Z[O � H , kAa�YUSRWAYAY'K\YA` < ]�qr^�Q2YU]eZ[Q2q��AWAO�a�SA�� a�a�Y'ORa�Sy] � ��2� 'NB'N� �� �� � kAa�SRa <l]�qr^ � ]�K\OwM�VXQ2S0K\YA�AWAOfV S�Q2qgORkAa�W�MPa�S6�ª])Y�xoORkAa�Y `�K\�2a�Mf]¯SRa�M£��Q2Y�MPaUORQ� k�]�O�k�]2Ml��a�a�Ypa�Y¬O�a�SRa�x.HjLkAay�Ca�`�K\YAY'K\YA` Q�VL]D<l]�qr^#nCK\`2k¬OrMPa�MRM+K\Q2Y ^�Q'Q�&AM�^sK &2a�ORk'KNM ´]2MRMPWAq{K�YA`���KNM0O�kAa{M£kAa[^|^=�ASRQbq��AO QbY ORkAakAQ¬MPO�q¦]2Z�k'K�YAa.$[����� (7(�'��.%��� � �� (��A'��.%������)����'),���� �"!#:=Y¡O�kAae��< �2a�S[M+K\Q2Y��AORkAaeZ[Q2q«q¦]�Y�x«KNM Z�]�^|^\a�x��$ A(�H

jLkAa # "eZ�k�]�Sw]bZ[ORa�S%K�M < ])qr^ > M%�ASRQ2q��AO�H , kAa�YUORk'KNM=ZRk�])Sw]2Z[ORa�Sl]��A��a�]�S[M ])O O�kAa �Ca�`�K\YAY'K�YA`UQ�Vª] ^sK�YAa K\Y]�Y¡]2Z[O�W�]�^�< ]�qr^ªn?K�`bk¬O M£a�MRM+K\Q2Y��CORkAa0ORQ2�'^\a��2a[^�^\Q'Q2�¯KNM � ]�K\OPK\YA`rV QbS ]fYAa � ORQb�'^�a��ba[^:�AkASw]2MPa0O�Q���afa�Y¬ORa�S�a�x.H

jLkASRQ2WA`2kAQ2WAOrORk'KNM�x'QAZ[WAq�a�Y'OA�lORkAa¯�AkASw]bMPa�M�MPOw])SROPK\YA`o�¬T ORkAa # ZRk�]�S[]2Z[ORa�SrSRa��ASRa�MPa�Y'Or^\a�`¬]�^�K�YA�AWAOUORQ< ]�q{^zH ¢�K\Y�Z[a O�k'K�Mpx'QEZ[WAq«a�Y¬O¯k�]2MU�Ca�a�Y �AS�a�¥X�ASRQEZ[a�M�MPa�x��'T < ]�q{^ynCK\`2k¬O¡])Y�x�ORkAa�MPap^sK\YAa�M¡k�]��2ao�Ca�a�Ya���a�Z[OPK\�2a[^\T `�K\�2a�Y ]bM�K\YA�AWAOrORQ¡]D< ]�qr^ n?K�`bk¬Or�ASRQAZ[a�MRM��@ORkAa�SRa�]2x'a�Sfq¦]�T¡SRa��AS�QEx'W�Z[aU�¬Tok'K\q 2�kAa�S[MPa[^sV ORkAaMPa�MRM´K�QbY{Z[QbY¬Ow]�K�YAa�xyK�Yra�]2Z�k�ZRk�])�AORa�S 6a�]2Z�kyZ�k�]��AORa�S!Q�V�O�kAa#��S[MPO:O � Q���]�SROwM_Z[Q2Y'Ow]�K\Y�M!] xbK���a�SRa�Y'O#MPa�MRM+K\Q2Y��bORkAaORk'K\Swx«��]�SRO_KNMl]eM+K\YA`�^\a0MPa�MRM+K\Q2Y�$[H#nCK\YAa�MlMPOw]�SRO£K�YA` � K\ORkUORkAa � "0ZRk�])Sw]2Z[ORa�Sl]�SRa�< ])qr^?nCK\`2k'O#a�SRSRQbS#q�a�MRM�]�`2a�M�HnCK\YAa�MlMPOw]�S�OPK\YA`e�'Ty]�YAQ2O�kAa�S Z�k�]�Sw]2Z[ORa�S#])SRa=a[K\ORkAa�S�<l]�qr^�SRa�MP�CQ2Y�MPa�M�Q2SR 6�CQ¬MRM+K\�'^\T�$:Ks^s^\a�`¬]�^.K\YA�AWAO�H#jlkAaLK�YA�AWAOKNMl�ASPK\Y'ORa�xrK\Y¯OPT'��a � SPK\ORa�S%VXQ2Y'OR (�'�%��&�&%�''� $0�']�Y�x«Q2WAOR�AWAO%KNM � SPK\ORORa�YUW�M+K\YA`¦M+^N]�Y'ORa�x«OPT¬�Ca � SPK\ORa�S%V QbY¬O )(+*-,�./)0�1�/ $wH

� 3 �_�?����;. ��&5 :lV:Z[Q2WASwMPa�� � kAa�Y¯x'a��2a[^\Q2�'K\YA`rYAQ2YA¥XORSPK\�bKN]�^��ASRQ2`2Sw])q¦M���K\O%K�M%�ASRa[VXa�Sw]��'^\a�ORQea�xbK\Ol�ASRQ2`bSw]�q¦MK\Y �A^�a�M¯])Y�x O�kAa�Y ORQ K\Y�Z�^�W�x'a ORkAap�A^�a�M«K\Y�ORkAapORQ2�'^\a��2a[^9�lK\Y�MPORa�]bx Q)Vea�Y¬ORa�S£K�YA`²O�kAa¡�ASRQ2`bSw]�q¦M�xbK\SRa�Z[O£^�T2H<'C�D]EjG � TVO�?�J�TVE h�GV@'E @gN�J9DFJUTVM�NASHDYGVSLMRh.M�SLSL@gSLSXDX\.D]JLf>?7f'M�E h�TZGV@'K"RAS9DF\�GV@jJLMHf'M0E h^TZGV@ 26GV@'SbD]NNU7h6KLMKU?R6fg@jSLJ9D]NNU#DYGVM0N6@RD]h6h�GZT Sf]D]JUTVM�NAS"3�JL?^TVS QcTZGZG*\.@<U^TVSLfCRASLSL@CU+TVN+f>?#DFhAJL@'K54640n

I�u

Page 15: Functional programming using Caml Light Michel Mauny January 1995

I�� ��������� ��� � �� � �� � ����� ����� ��

�AWAS�ORkAa�SRq�Q2S�a�� � kAa�Y¦x'a��AWA`2`�K\YA`��bK\O!KNM��2a�SRTrW�MPa[VXW'^�ORQ4�*D���('lMPQ2q«a#VXWAY�Z[OPK\Q2Y�M��'ORQeM£a�a � K\ORk � k�])O#]�SR`2WAq�a�Y'OwMORkAa�T ])SRa Z�]�^|^\a�x��l]�Y�x � k�]�OrSRa�MPW'^\OrORkAa�T SRa�O�WASRY�H ¢2a�a¯O�kAa¦SRa[VXa�SRa�Y�Z[a¯q¦])Y¬W�]�^�� GAI��%V QbSy]ox'a�MRZ[SPK\�AOPK\Q2Y²Q�VORkAa�MPa�V6]2Z�Ks^sK\OPK\a�M�H

��C � �)%�&K�!%+�#� �$�����N���$I *�� ��� *7��� � �$�!�6��� �)%�&K��*7�n.a�O=W�M�a�Y'ORa�S ]�Y¡]�S£K�O�kAq�a�OPKNZ0a[�A�ASRa�MRM+K\Q2Yo]�Y�x¯MPa�a � k�]�O%KNM�< ])qr^ > MlSRa�MP�CQ2Y�MPa2�#����� � �������������jlkAafa[�E�ASRa�M�M+K\Q2Y@ ���� "rk�]2M���a�a�Yoa�Y'ORa�SRa�x��CVXQ�^s^\Q � a�xv�¬TX � " � k'KNZ�koSRa��ASRa�MPa�Y'OwM�ORkAaea�Y�xpQ�V#ORkAarZ[WASRSRa�Y'OORQ2�'^\a��2a[^0�AkASw]2M£a2H , kAa�Y�a�Y�Z[Q2WAY'ORa�SPK\YA` � " � < ]�qr^ a�Y'ORa�SwM«ORkAaoOPT¬�Ca�¥6ZRkAa�ZF&bK�YA` +q�Q2SRap�ASRa�Z�KNMPa[^\TZ�JK� '$�J ����&'�$�� $0$l�Ak�]2MPa��!]�Y�xo�AS£K�Y'OwMfORkAarK\Y'VXa�SRSRa�x OPT¬�CarV QbS0ORkAa¦a[�A�ASRa�MRM´K�QbY�H jLkAa�Y���K\OrZ[Q2q��'Ks^\a�M�Z[QEx'a{V Q2SfORkAaa[�A�ASRa�MRM+K\Q2Y��Ca[�Ea�Z[WAO�a�MlK\O ]�Y�x��E��Y�]�^s^�T��C�ASPK\Y'OwM=O�kAa0SRa�MPW'^\O�H

;+YoORkAar�ASRa��2K\Q2W�M�a[��]�q��'^\a��.ORkAarSRa�M£W'^�O0Q)V#a���]�^\W�]�OPK\Q2Y K�M��AS£K�Y'ORa�x ]bM ! �"U]�Y�xpORkAaeOPT'��afKNM4 !'�� � "A�lORkAaOPT¬�Ca0Q�V_K�Y'ORa�`2a�S[M�H

jLkAa¯�ASRQEZ[a�M�MrQ�V a���]�^\W�]�OPK\Q2Y Q)V ]@< ]�q{^La[�A�ASRa�MRM´K�QbY Z�]�Y²�Ca MPa�a�Y ]2M{ORSw]�Y�M+VXQ2SRq{K�YA`oORk'KNMra[�A�ASRa�MRM´K�QbYWAY'OPKs^LYAQvV WAS�ORkAa�SrORSw]�Y�M+VXQ2SRqU]�OPK\Q2YpKNMy]�^|^\Q � a�x.H jLkAa�MPa¦O�Sw]�Y�M+VXQ2SRq¦])OPK\Q2Y�M�qrW�MPOe�ASRa�M£a�SR�2a¯MPa�q¦]�Y'OPKNZ�M�Ho�AQ2Sa[��]�q��'^\a��CKsV ORkAafa[�E�ASRa�M�M+K\Q2YW ��� "rk�]2M�ORkAaeq¦])ORkAa�q¦]�OPKNZ�]�^!Q2�()Pa�Z[O uU]2M�MPa�q¦]�Y'OPKNZ�M��CORkAa�YoORkAaeSRa�M£W'^�OI � &"qrW�MPO=k�]��2a�ORkAayM�]�q�aeMPa�q¦])Y¬OPKNZ�M�H%jlkAaexbK���a�S�a�Y¬O=�Ak�]bMPa�M=Q)VªORkAa <l]�qr^�a���]�^\W�]�O£K�QbY �AS�QEZ[a�MRM�]�SRa2�

, ��]�SwM+K\YA` ´Z�kAa�ZF&2K\YA`UORkAaeMPT'Y¬Ow]bZ[OPKNZ�^�a�`']�^sK�OPT¯Q�V_K\YA�AWAO�$(M, O´T'��aeM£T¬Y'ORkAa�M+KNM�M, Z[Q2q��'Ks^sK�YA`�M, ^�Q']2xbK\YA`�M, a[�Ea�Z[WAOPK\YA`�M, �ASPK\Y¬OPK\YA`UORkAa0SRa�MPW'^\O�Q�V:a[�Aa�Z[WAOPK\Q2Y�H

n.a�O=W�M�Z[Q2Y�M+KNx'a�S ])YAQ2ORkAa�S=a[��]�q��'^\a2�!ORkAae])�A�'^|KNZ�]�O£K�QbY Q)V:ORkAaeMPW�Z�Z[a�MRM£Q2SlVXWAY�Z[OPK\Q2Y¡ORQ �� �H!jlkAa0a[�A�ASRa�MRM´K�QbY" $#� �A'),���%'& � % (�*) MPkAQ2W'^Nxp��arSRa�]2xp]2M ORkAa�V WAY�Z[O£K�QbY O�k�]�OA�A`�K\�2a�Y+%��ASRa�ORWAS�Y�M,% (� "AH=jlkAa )´W'�AOw]��CQ2¥M+K\OPK\Q2YpQ�VªO�k'K�MLa[�E�ASRa�M�M+K\Q2Y¡ORQ " �� ) KNM �S�����N��� �� ����������������� ���H# " *#�� � '!, �-%.& � % ��*) " �� )/ � �����������10jlkAa�SRaU]�SRa�MPa��2a�Sw]�^ � ]�TAM=O�Q¯SRa�x'W�Z[a¦O�k�]�O0��]�^\WAaU��a[VXQ2SRarQ2�AOw]�K�Y'K\YA`oORkAa�S�a�MPW'^\O !CHyJ�a�SRa¦]�S�a�O � QUQ�VlORkAa�q 6ORkAa0a[�A�ASRa�MRM´K�QbY¡��a[K\YA`¯SRa�x'W�Z[a�xp]�Ola�]2Z�k MPORa��UKNM�WAY�x'a�SP^sK\YAa�x�$w�

" *#� � '!,���%2& � % (�*) " �� ) " *#�� �A'!, ��%3& � % ��$) " �� )4 4

" *#�� �A'!, �-%.& � % ��$)65 " �� ) 7�4 45�(� 5���4 4! !

Page 16: Functional programming using Caml Light Michel Mauny January 1995

� �� � � � �� I��

jLkAa ORS[]�Y�M+VXQ2SRq¦]�O£K�QbY�M_W�MPa�x��'T < ])qr^�x'WASPK\YA`�a���]�^\W�]�OPK\Q2Y¡Z�]�YAYAQbO#��aex'a�M�Z[SPK\��a�x«K\Y¯ORk'KNMlZRk�]��AO�a�SA�AM+K\Y�Z[aORkAa�TpK\q��'^\T1&'YAQ � ^�a�x'`ba¦]���QbWAOeZ[Q2q��'Ks^N]�OPK\Q2Y Q�V�< ])qr^#�ASRQ2`2S[]�q¦M�]�Y�xoq¦]2Z�k'K\YAa�SRa��ASRa�M£a�Y¬Ow])OPK\Q2Y Q�V < ]�qr^��]�^�WAa�M©H J�Q � a��2a�SA�AM+K\Y�Z[a�ORkAaf��]2M+KNZeZ[Q2Y'ORSRQ)^ªMPORSRW�Z[O�WASRaeQ�V�<l]�qr^�KNMLV WAY�Z[OPK\Q2Y ]��A�'^sKNZ�]�OPK\Q2Y���K\O=KNM��2W'K\ORara�]2MPTORQf`�K\�2a ])Y�KNx'a�]rQ�V�ORkAa�ORSw])Y�M+V QbSRq¦]�OPK\Q2Y�MªK\Y¬�2Q)^��ba�xrK\Y¯ORkAa < ]�qr^.a���]�^\W�]�O£K�QbY¯�ASRQEZ[a�M�M#�'T�W�M+K\YA`rORkAa/&2K\Y�xUQ�VSRa � S£K�O£K�YA` � a=W�MPa�x{K\Y¯ORkAa�^�]bMPO#a[��]�q��'^\a2H#jlkAa�a���]�^�W�])OPK\Q2Y¯Q�V�ORkAa � a[^|^\¥XOPT'��a�x�$#]��A�'^sKNZ�]�OPK\Q2Y�� � �� $0� � kAa�SRa� � ])Y�x�� x'a�YAQ2ORar]�SR�'K\ORSw])SRT�a[�A�ASRa�MRM+K\Q2Y�M��.Z[Q2Y�M+KNMPO[MlK\Y¡O�kAa�V Q�^s^\Q � K\YA` M£ORa���M��

, �!��]�^�W�])ORa�� �AQb�AOw]�K\Y'K\YA`�K\OwMl��]�^\WAa���H, �!��]�^�W�])ORa�� � WAY'OPKs^lK\Oy�Ca�Z[Q2q�a�M�] V WAY�Z[O£K�QbY�]�^=��]�^\WAa2H  %a�Z�]�W�M£a¦Q�V�ORkAa � a[^s^\¥XOPT¬�'K\YA` k'T¬�CQ2ORkAa�M+KNM���� �qyW�M£O!SRa��ASRa�MPa�Y'O=]�VXWAY�Z[OPK\Q2Y�VXSRQ2q M£Q2q�a=OPT'��a � ORQrMPQ2q�a� �¬])Y�x�ORkAa�O´T'��a�Q�V��0KNM� � H , a � Ks^s^ � SPK\ORa F $#� �A'),�� %2& � � $_V Q2SlORkAa0S�a�MPW'^\O=Q�V:ORkAa0a���]�^\W�]�OPK\Q2Y¯Q�V � � H�;+OLx'a�YAQbORa�MlORkAa0q¦])ORkAa�q¦]�OPKNZ�]�^�Q2� )´a�Z[OW�MPW�]�^s^\T � SPK\ORORa�Y¡]2M©�

Ao�� � .� E 0.�� � kAa�SRa��AQ�VªZ[QbWASwMPa����fq¦]�T¦x'a��Ca�Y�x¡QbY[E�$�eH  �H\� , aex'Q«YAQ2O=a���]�^�W�])ORa��f��a[VXQ2SRa � a+&'YAQ � ORkAa0��]�^�WAafQ�V E�H

, �!��]�^�W�])ORa�� � kAa�S�a��«k�]2M%��a�a�YoMPWA��MPOPK\ORWAORa�x«VXQ2S=]�^s^:QAZ�Z[WASRSRa�Y�Z[a�MlQ)V %?H , a0ORkAa�YU`2a�O=ORkAa���Y�]�^:��]�^\WAaQ�V:ORkAafQ2SPK\`�K\Y�]�^:a[�A�ASRa�MRM+K\Q2Y�HljlkAa0SRa�M£W'^�O�KNMlQ�V!OPT¬�Ca� H;6YpORkAa0�ASRa��bK\Q2W�M=a[��]�q��'^\a�� � a0a���]�^\W�]�ORa2�

, �� rORQ 5 M, " *#�� � '!, �-%.& � % ��*) ORQrK\OwMPa[^sVR XK\OlKNM�]�^\SRa�]2x'T¯]fVXWAY�Z[OPK\Q2Y¡�CQEx'T�$(M, % �� � kAa�SRa 5 KNM�MPWA��MPOPK\ORWAO�a�x«V Q2S % �'K6H a2H�a���]�^\W�]�ORa 5��� �¬`ba�OROPK\YA` !U]2MlSRa�MPW'^\O�H

;6O�MPkAQ2W'^NxU��afYAQ2OPKNZ[a�xUORk�]�O < ]�q{^�W�M£a�M=Z�]�^s^\¥X�¬T'¥X��]�^\WAa2��]�SR`2WAq�a�Y'OwM%]�SRa0a���]�^�W�])ORa�x¯�Ca[V Q2S�a0��a[K\YA`¦��]bMRMPa�xUORQVXWAY�Z[OPK\Q2Y�M�H!jlkAalSRa[^N]�OPK\�2ala���]�^�W�])OPK\Q2Y�Q2Swx'a�S!Q)V�ORkAa!VXWAY�Z[OPK\Q2Y�]�^�a[�A�ASRa�MRM+K\Q2YU]�Y�x0Q�V.ORkAa ])SR`2WAq�a�Y'O:a[�A�ASRa�MRM´K�QbYKNMrK\q��'^\a�q�a�Y'Ow]�O£K�QbYA¥6x'a���a�Y�x'a�YAOA�0]�Y�x²MPkAQbW'^�x YAQ2O«��a¡S�a[^|K\a�x�WA�CQ2Y�H�jlkAaN< ])qr^ nCK\`2k'O�K\q��'^\a�q�a�Y'Ow]�O£K�QbYa���]�^�W�])ORa�M ])SR`2WAq�a�Y'OwMl�Ca[V Q2S�a0VXWAY�Z[OPK\Q2Y�M+ +SPK\`2k¬O�¥XORQ2¥�^\a[V O�a���]�^�W�])OPK\Q2Y�$0�.]2M=MPkAQ � Y¡]��CQ��2a�M�O�kAa0Q2SPK\`�K\Y�]�^�< ]�qr^K\q��'^\a�q�a�Y'Ow]�OPK\Q2Ypa���]�^\W�]�ORa�MLVXWAY�Z[OPK\Q2Y�M=�Ca[V QbSRay]�S�`2WAq�a�Y'OwM X^\a[V OR¥XO�Q2¥XSPK\`2k'O=a���]�^\W�]�O£K�QbY�$wH

���� D � �/*7�j%T¬�Ca�Ml]�Y�x�O�kAa[K�S=Z�kAa�Z]&bK\YA`(2�MPT'Y'ORkAa�M+KNM=]�SRa0Z[SRW�Z�KN]�^�ORQ V WAY�Z[OPK\Q2Y�]�^��AS�Q2`2Sw]�q«qrK\YA`���ORkAa�T«�ASRQ��2KNx'a0]�Y�K\Y�xbKNZ�]�¥OPK\Q2Y¡]��CQ2WAO=ORkAarZ[Q2SRSRa�Z[O�YAa�MRMlQ�V!�ASRQ2`2S[]�q¦M�H

jLkAa0WAY'K��ba�SwMParQ�V�< ]�qr^:��]�^\WAa�M�KNM=��]�S�OPK\OPK\Q2YAa�xUK\Y'ORQ��JK� '�$�H�"¤OPT¬�CaeSRa��ASRa�M£a�Y¬OwM�]¦Z[Q�^s^\a�Z[OPK\Q2YoQ�V!��]�^\WAa�M�H�AQbS=a[��])q��'^\a���'�� �«K�M�ORkAafO´T'��a0Q)V:K\Y'ORa�`2a�S=Y'WAqr��a�SwM��.]�Y�x �(>, � ��KNMlORkAafOPT¬�Ca0Q�V���Q']�OPK\YA`2¥X��Q)K�Y'O�Y¬WAqr��a�S[M�Hj@SRWAORk ��]�^\WAa�Mr��a[^\Q2YA` O�Q¯ORkAa���,7,>(pOPT¬�Ca2HD<#k�]�Sw]2Z[O�a�SyMPORS£K�YA`'M0��a[^\Q2YA` ORQ¡ORkAa � �7� ' � � OPT'��a2H¡j%T'��a�Mf]�SRaxbK\�2KNx'a�xvK\Y¬O�Q¦O � QyZ�^N]2MRM£a�M��

,   ]bM+KNZ�O´T'��a�M ' �������*,7,7(���� �>�A'�� ���?c�c�cF$wH

Page 17: Functional programming using Caml Light Michel Mauny January 1995

I�� ��������� ��� � �� � �� � ����� ����� ��

, <#Q2q��CQ2WAY�x¯OPT'��a�M�MPW�ZRko]2MLV WAY�Z[OPK\Q2Y�]�^ªOPT'��a�M�H=��Q2S a[��]�q��'^\a��CORkAaeOPT'��afQ�V!V WAY�Z[O£K�QbY�M�V SRQbqdK\Y¬ORa�`ba�SwMORQ�K\Y¬ORa�`ba�SwM@KNM x'a�YAQbORa�xr�'T ' ���.& � '�� �.HªjLkAa=OPT¬�Ca=Q�V�VXWAY�Z[OPK\Q2Y�MªV SRQbq¤��Q'Q�^\a�]�Y¦��]�^\WAa�M%ORQeZRk�])Sw]2Z[ORa�SMPORSPK\YA`¬M K�M � SPK\ORORa�Y ��,7,>(3& � � �7�A'�� �?HpjlkAa¦OPT'��aUQ�V ��]�K\SwM � kAQ'MPar��SwMPO�Z[Q2q«��Q2YAa�Y'OfK�Mr]�Y K\Y¬O�a�`2a�S]�Y�x � kAQ¬MPaeM£a�Z[Q2Y�x¡Z[Q2q«��Q2YAa�Y'OlKNM ]{��Q'Q�^\a�]�Y¡��]�^\WAa0KNM � SPK\ORORa�YN' ��� � ��,>,7(CH

;6Y«V6]2Z[OA�¬])Y¬T�Z[Q2qr�'K\Y�]�OPK\Q2Y¯Q�V�ORkAa�O´T'��a�Ml]��CQ��2a+ ´]�Y�x«a��2a�Y�q«Q2SRa���$�KNM%��Q¬MRM´K��'^\a2Hljlk'KNMlZ[Q2W'^NxU��a � SPK\ORORa�Y¯]2M��  ]bM+KNZ�j#T'��a ����� '�� �

� �*,7,7(� � �7�A'�� �

j#T'��a �����  l]2M+KNZ�j%T¬�Ca� j%T¬�Ca & � j%T¬�Ca� j%T¬�Ca � j%T'��a

:=Y�Z[ay]�< ])qr^�ORQ2�'^\a��2a[^:�AkASw]bMPa0k�]2M%��a�a�Ypa�Y¬ORa�S�a�x«K�YpORkAa0Z[Q2q��AWAORa�SA��ORkAa < ]�qr^.�ASRQAZ[a�MRM=MPOw])SROwMl]�Y�]�^\T7B[K�YA`K\O�H=�@K\SwMPO=Q)V�]�^s^9��K�O���a�S£V Q2S�q¦M�$�J ������4��������JN$S� $:� � k'KNZ�k Z[Q2Y�M+KNMPOwMLK\Y Z�kAa�Z]&bK\YA` � kAa�ORkAa�S=ORkAaf�AkASw]2MPaf��a[^\Q2YA`¬MORQ�O�kAa�^�])YA`2W�]�`2a0Q2S�YAQ2O�H!�AQ2S�a[��]�q«�'^�a��CkAa�SRa�KNM�]�MPT'Y¬Ow]��¦a�SRSRQ2S�+ ´]{��]�SRa�Y'ORkAa�M+KNMlKNMlq{K�M�M+K\YA`($w�# " *#�� � '!, �-%.& � % �� " �� ) � � ����������� ��� ��� �������� � ���*��� ��� � � ���� ��! �*�#"%$&$� '&'(�) �/�&*�� �,+-+./+10jlkAaeZ�]�S�a�OwM\ �2-2&2 "fWAY�x'a�SP^sK\YAa�ORkAa�^\QEZ�])OPK\Q2Y � kAa�S�aeORkAa0a�SRS�Q2S � ]bM=x'a�ORa�Z[ORa�x.HjLkAa{M£a�Z[Q2Y�xo]�Y�]�^\TEM´K�M ��a�SPVXQ2SRq«a�x¯KNM%�JK�L'T��������J$�� $ �lORkAa�MPTAMPORa�qg]�ORO�a�q��AOwM�ORQ ]bMRM+K\`2Y ]UOPT¬�CayO�Q¦a�]2Z�kMPWA�Ca[�E�ASRa�M�M+K\Q2Y Q�V!ORkAae�AkAS[]2MPa��.]�Y�xpORQ¦MPT'Y¬O�kAa�M+KCB�ayO�kAaeOPT¬�CaeQ�V#O�kAa � kAQ�^\af�AkASw]2MPa2H ;XV#OPT¬�Cay]�Y�]�^�TAM+KNM�V6]�Ks^�M XK6H a2H%KsV O�kAayMPTAMPORa�qdKNM�WAY�]��'^\arORQ¦]bMRM+K\`2Y ]UMPa�Y�M+K\�'^\a�OPT'��aeO�Q�ORkAae�AkAS[]2MPa.$0�CORkAa�Y ]«OPT¬�Caea�SRS�Q2SlKNM�SRa���QbSRORa�x]�Y�x@< ]�q{^ � ]�K\OwMlVXQ2S0]�YAQ2ORkAa�S�K\YA�AWAOA��S�a')´a�Z[OPK\YA`¯ORkAarZ[WASRSRa�Y'O0�AkASw]2MPa2H�J=a�S�aeKNM0]«OPT¬�Caya�S�SRQ2S ´Z�]�YAYAQ2O0]2xAx]rY'WAqr��a�S=ORQU]r��Q'Q�^\a�]�Y�$w�# " *#�� � '!, �-%.& � % ��*) " �� �7�$#A� )/ � � ����������� ��� ��� �������� � ���*��� ��� � � ���� �" �3! ��� +���� "4$-$� '-'&'-'65 ��7 � � �4+%� 7&7 � � 5 *�7�� )��8�:9&-��<;9�� �-��7 � 7 ��=?> ��� 5 � )��@� ����� 0jlkAa�SRa')Pa�Z[OPK\Q2Y¦Q)V?Ks^s^\¥XOPT¬�Ca�x¯�AkASw]2M£a�M!KNMlZ�]�^s^\a�x $S�*D ���U%�JK������U2H <#Q2q«�'K|^\a�SwM V Q2S � a�].&2^\TrOPT¬�Ca�xr^N]�YA`bW�]�`2a�M <7�VXQ2Sla[��]�q«�'^�a.$ � Q2W'^NxUK\Y�MPORa�]bx«K�M�MPWAay] � ]�S�Y'K�YA`«q�a�MRMR]�`bae]�Y�x¯Z[Q2Y'OPK\Y¬WAafORkAa[K\S � Q2S]&¦]�O�ORkAa0SPKNM'&UQ�Vª`ba�OROPK\YA`][ BA*# � �!�7�-,.�L"fQ2S% DC (7(*� ��� ( ' � � �7�$# �A'!, ��"0q�a�M�MR]�`2ae]�OlSRWAYA¥XO£K�q«a2H

:=Y�Z[ar]�MPa�Y�M+K\�'^\arOPT¬�Ca0k�]2Ml��a�a�Y x'a�x'W�Z[a�xvVXQ2SlORkAaea[�A�ASRa�MRM+K\Q2Y���ORkAa�Y¡ORkAa0a���]�^\W�]�OPK\Q2Yo�ASRQAZ[a�MRM/ ´Z[Qbq��'K\¥^N]�OPK\Q2Y��'^\Q¬]bxbK�YA`¡])Y�xUa[�Ea�Z[WAOPK\Q2Y�$lq¦]�T��Ca�`�K\Y�H

¢2O�SRQ2YA`�OPT'�'K�YA`¯a�Y'VXQ2SwZ[a�M � SPK\OPK\YA`¡Z�^\a�]�Se]�Y�x � a[^s^\¥6MPORSRW�Z[ORWAS�a�x¡�AS�Q2`2Sw]�qUM�H mpQ2SRa�Q��2a�S6�2K\Oe]2xAxAM0M£a�Z[WASPK\O´T]�Y�x{K\Y�Z[SRa�]2MPa�MlO�kAa MP�Ca�a�xUQ�V��ASRQ2`2S[]�q x'a��2a[^\Q2�Aq«a�Y¬OA�CM+K\Y�Z[a0q�Q¬MPO%O´T'��Q'M#]�Y�xUq¦])Y¬T�Z[Q2Y�Z[a��AORW�]�^�a�S�SRQ2SwM%]�SRa�'dbf'JXR#DYGZGWV�'�GV@CY�TVf]D'GbDFN#DYGWV�SUTVSHJ9DFE0@'S;h�G[DFf'@ \.@>W M0KL@ SXV�N�J9DZY DFN#DYGWV�SUTVSRD]NNUHGJILKNM�OLPBG-IRQLQTSNQVU�ERDCV7M�f'fCRAK�' U6@'JL@gf'JUTVN6O/W M�K�TVN6SLJ9D]N6fg@\#DZU�GWV/W M�KLE @4U/f9?.D]K9DFf'JL@'K�f'M0N6SLJ9D]N�JLS'n

Page 18: Functional programming using Caml Light Michel Mauny January 1995

� �� � � � � � � ��� I��

ORSw])�A��a�xU]�Y�x¦M´K�`bY�]�^\a�xU�¬T�O�kAa OPT'��a ]�Y�]�^�TAM+KNM�Hl�@K\Y�]�^s^�T�� � a[^s^\¥XOPT¬�Ca�xU�ASRQ2`2S[]�q¦M#x'QfYAQ2OlYAa�a�x¦x'T'Y�]�qrKNZ�OPT'��aORa�MPO[Mj 6ORkAa=]2xAxbK\OPK\Q2Y«V WAY�Z[OPK\Q2Y¯x'Q'a�M!YAQ2O!YAa�a�x«ORQ0ORa�MPO � kAa�ORkAa�S#Q2S!YAQbO_K�O[M#]�SR`bWAq�a�Y¬O[M!]�SRalY¬WAqr�Ca�SwM�$0�bkAa�Y�Z[aMPOw])OPKNZ�O´T'��ae])Y�]�^\TEM+KNM�]�^s^\Q � MlVXQ2Slq�Q2SRa0a��¯Z�K�a�Y'O�q¦]2Z�k'K�YAarZ[QEx'a2H

���� �����! "�#� �$�!�

jlkAarq�Q¬M£OlK\q���Q2S�Ow]�Y'O7&bK\Y�xoQ�V#��]�^�WAa�M K\Y¡VXWAY�Z[OPK\Q2Y�]�^#�AS�Q2`2Sw]�q«qrK\YA` ]�S�a0VXWAY�Z[OPK\Q2Y�]�^!��]�^\WAa�M�Hemo]�O�kAa�q¦]�OPK\¥Z�]�^s^\T��:]{V WAY�Z[O£K�QbY A Q�V#OPT¬�Ca 6 . : KNM0]«SRW'^\ayQ)V Z[Q2SRSRa�MP�CQ2Y�x'a�Y�Z[a � k'KNZ�k ]2MRMPQAZ�KN]�ORa�M � K\ORkoa�]2ZRkpa[^\a�q�a�Y¬OQ�V!OPT¬�Ca\6 ]rWAY'K �bWAarq�a�qr��a�S=Q�V!OPT¬�Ca\:�H

;zV�E¯x'a�YAQ2ORa�M�]�Y¦a[^\a�q�a�Y'O=Q�V 63�'ORkAa�Y � a � Ks^s^ � S£K�O�a\A� DE�$�VXQ2SlORkAa0]��A�'^sKNZ�]�OPK\Q2Y¡Q)V�A¯ORQ4E@Hª�!])SRa�Y¬O�kAa�MPa�M]�SRa�Q�VXORa�YUW�MPa[^\a�MRM/ 6ORkAa�TU]�SRa�W�MPa�xUQ2Y'^\T�VXQ2Sl`2SRQbWA�'K�YA`�MPWA�Ca[�E�AS�a�MRM+K\Q2Y�M�$0�CMPQ � a0Z[Q2W'^Nx¡]�^�M£Q � SPK\ORa3 DA� DE�$]$!]2M� a[^s^�]2M 7A ] 7Ec$]$]$#QbS M+K\q��'^\T AXE@H jlkAar��]�^�WAarQ�V A EvKNM�ORkAaeWAY'K �bWAa�a[^\a�q�a�Y¬O0Q)V :�]2MRMPQAZ�KN]�ORa�x � K\ORk�Ep�¬TORkAa0SRW'^\afQ�V�Z[QbSRSRa�MP�CQ2Y�x'a�Y�Z[afV Q2S]A_H

jLkAa¦YAQ2O[]�OPK\Q2Y�A� DE�$=KNMrO�kAa¦Q2YAa¯YAQbSRq¦]�^s^\T a�q��'^\Q�T2a�x K\Y²q¦]�ORkAa�qU]�OPKNZ�MfORQ x'a�YAQ2ORa«V WAY�Z[OPK\Q2Y�]�^�])�A�'^|K\¥Z�]�OPK\Q2Y�HrJ�Q � a��2a�S6� � a�MPk�]�^|^#�Ca¦Z�]�SRa[VXW'^#YAQ2O0ORQ¡Z[QbY'V W�MPa�]«VXWAY�Z[OPK\Q2Y � K\ORk K�O[M0]��A�'^sK�Z�])OPK\Q2Y�H , aUMR]�TX [ORkAaVXWAY�Z[OPK\Q2Y�A � K\ORkvV Q2S�q¦]�^���]�Sw]�q«a�ORa�S]E�"(�Aq«a�]�Y'K\YA`�ORk�]�ORApk�]2ML��a�a�Y x'a[��YAa�x¯�'T?�

A¡��E 0. �

Q2SA�ªK�Y <l]�qr^9�#O�k�]�OeORkAa¯�CQEx'T Q�V A KNM�MPQbq�a�ORk'K\YA`o^sK &2a " $#� �A'),�� %2& � ��� ) H �AWAY�Z[OPK\Q2Y�MU]�SRaU��]�^�WAa�M]2M Q2ORkAa�S0��]�^�WAa�M©H ;6Y ��])SROPKNZ[W'^N]�SA�@V WAY�Z[O£K�QbY�MeqU]�Tp��aU��]2MRMPa�x ]2M0]�SR`2WAq«a�Y¬OwM ORQ¯Q2ORkAa�S�VXWAY�Z[OPK\Q2Y�M��%]�Y�x�2�Q2SSRa�ORWAS�YAa�x¡]2M%SRa�MPW'^\O�Hl�AQbS a[��]�q��'^\a�� � aeZ[Q2W'^Nx � SPK\ORa2�# $#� �A'),�� '& � " $#� �A'),���%3& � " " % (�*) & �*)�) � ��� � �!�/�'� � ���/�&"'� � �!�/�'� � �!�/����� � � � �jlk�]�OLV WAY�Z[OPK\Q2YoOw] &2a�M=]2Ml��])Sw]�q�a�ORa�S�]fV WAY�Z[O£K�QbY z^�a�O�W�M Z�]�^s^_K\O� �$ ]�Y�xvSRa�ORWASRY�M�]�YAQ2ORkAa�SLV WAY�Z[OPK\Q2Y � k'KNZRk��� kAa�YU`�K\�2a�Y¦]�Y¯]�SR`bWAq�a�Y¬O z^�a�O%W�MlZ�]�^s^�K\O %�$0� � K|^s^�SRa�ORWAS�Y¦ORkAa��ASRa�x'a�Z[a�MRMPQ2SlQ�V.ORkAa���]�^\WAa�Q�V�ORkAa ]��A�'^sKNZ�]�OPK\Q2Y " % (�*) H

jLkAa0O´T'��a0Q)VªORk�])OlV WAY�Z[O£K�QbY MPkAQ2W'^Nxv��aeS�a�]2x¯]2M�� " '�� �.& � ' � � ) & � " ' � �'& � ' ��� ) H

�� � * �/���8�#� �$�!�

;6OLK�M K�q«��Q2SRO[]�Y¬OlORQr`�K\�2a0Y�])q�a�MlORQr��]�^�WAa�M©H , a0k�]��2a0]�^\SRa�]2x'T¯MPa�a�Y¡MPQ2q�a0Y�])q�a�xU��]�^\WAa�M�� � aeZ�]�^|^\a�xvORkAa�q�� �*(Q%��� �L��*D��Q%'N�'*K$ H ;6Y ORkAa�a[�A�ASRa�MRM´K�QbY " $#� �A'),�� %2& � % ��$) ��ORkAa«Y�]�q�a %pKNMr]«V Q2S�q¦]�^#��]�Sw])q�a�ORa�S�H;6O[M#Y�])q�alKNM%K\SRSRa[^\a���])Y¬O��%ZRk�]�YA`)K�YA`fK\O%K\Y¬ORQ�]�YAQbORkAa�S#Q2YAa0x'Q'a�M#YAQbO Z�k�]�YA`2a�ORkAa q«a�]�Y'K\YA`yQ)V:ORkAa=a[�A�ASRa�MRM+K\Q2Y�H, aeZ[Q2W'^Nxvk�]��ba � SPK\ORORa�YpORk�]�O%V WAY�Z[O£K�QbY " $#� �A'),����'& � � (�*) H

;zV YAQ � � a�]��A�'^\TpORk'KNM�VXWAY�Z[OPK\Q2YoORQ���MR]�T�� ��� � � a � Ks^|^la���]�^\W�]�O�a�ORkAaea[�A�ASRa�MRM´K�QbY�� �� � kAa�SRa��UK�M ORkAa��]�^�WAafQ�V ��� H%� ]�q{K�YA`��¦ORkAa0��]�^\WAarQ�V ���� K\Y�� (� KNM � S£K�O�ORa�Y¡]2M��# (�� ����� ��� '���� ��� � �������������

jlk'KNM¯a[�A�ASRa�MRM´K�QbY KNMp] ^�a�`']�^O< ]�qr^0�AkASw]2M£a�� ]�Y�x ORkAaN(*� ��Z[Q2Y�MPORSRW�Z[OUKNM«K\Y�x'a�a�x � KNx'a[^�T�W�MPa�x K�Y < ]�qr^�ASRQ2`bSw]�q¦M�H

jLkAa (�� � Z[QbY�MPORSRW�Z[O%K\Y¬O�SRQEx'W�Z[a�M �� ����� Y�����O����&U $ �!B��� ��'�$�� !��O�'���� ��'*K$ H!jlkAa�T¯]�SRa4�� �����b��a�Z�]�W�MPafORkAaMRZ[Q2�CaeQ�V��«K�M�SRa�MPO�SPKNZ[ORa�xUORQ�ORkAafa[�E�AS�a�MRM+K\Q2Y " � (�*) H!jlkAa KNx'a�Y¬OPKs��a�S��&2a��AOlK\OwM��ASRa��bK�QbW�M=�'K\Y�xbK\YA` XKsV ]�Y'T�$

Page 19: Functional programming using Caml Light Michel Mauny January 1995

I�§ ��������� ��� � �� � �� � ����� ����� ��

]�VXORa�S�ORkAaea���]�^\W�]�OPK\Q2YoQ�V#ORkAa[ (*� �oc�c�c ' � c�c�c "UZ[Q2Y�MPORSRW�Z[O�H , a�Z�]�YoZRkAa�ZF&¡ORk�])O �¯k�]2M�YAQ2O �Ca�a�Y `�^\Q2��]�^s^\Tx'a[��YAa�xp�¬TUORSRTbK\YA`�ORQra���]�^�W�])ORafK�O��# � � � ����������� ��� ��� ���� ) $-$��'65�� � * �-��� � =�� �/��� � � �D+ ) ��7 � � 9-�� � =@0

n.QAZ�]�^#�'K\Y�xbK\YA`¬MfW�M+K\YA`G(*� �¡]�^NMPQUK\Y'ORSRQAx'W�Z[a!$ �&��*�����UrQ�V7 +��Q¬MRM´K��'^\ToOPK\q�a�¥6Z[Q2Y�M£WAqrK\YA`($ a���]�^\W�]�OPK\Q2Y�M�H , kAa�Ya���]�^�W�])OPK\YA`@ (*� �-% � � � ' � � "(� � � `2a�OwMfa���]�^\W�]�O�a�x Q2Y'^\T Q2Y�Z[a2HD"=^s^=QEZ�Z[WAS�SRa�Y�Z[a�MrQ�V,%oK\Y � ]2Z�Z[a�MRMfORkAaB��� ��'=Q)V � � � k'KNZRkpk�]2Ml��a�a�YoZ[Q2q��AWAORa�xvQ2Y�Z[a2H#��Q2S=a[��]�q��'^\a��AORkAarZ[Q2q��AWAOw]�O£K�QbY¯Q�V£�(*� � ��'�� � �#

�,.

� ��A'6 ��

� �� ��,&��� 5�� ! �����

' � � ' � " �� ��'�� ) & " � � " ��' � ��$)�)� � � Ks^s^ª�Ca0^\a�MRM�a[�E�Ca�Y�M+K\�2aeO�k�]�Y��" �#

�,.

� �� '6 ��

� � ��,.� � 5�� ! ���� )

" �- " ��# �,&

� ��A' 4�

� ��� ��,&��� 5�� ! ����� )�)

& " � � " ��# �,&

� ��A' 4�

� ��� ��,&��� 5�� ! ����� �*)�) �

jlkAa (*� �¯Z[Q2Y�MPO�SRW�Z[O ]�^NMPQ�k�]bM=]r`�^\Q2��]�^@V Q2S�q VXQ2S=O�Q2�'^\a��2a[^ªx'a�Z�^N]�Sw]�O£K�QbY�M��?]bM%K\Y��# (�� � �# �7����&,&��� *#� � '!,�� %.& � % (�� � 7 � �-� � 7-7 �+ � ���/�'� � �����1� � � � � �# (�� � ��� # �!��� � $#� �A'),���%.& � % � % � 7� � * +%� �+������� � �!�/�-� � � � � �

, kAa�Y ]f��]�^�WAark�]2ML��a�a�Y x'a�Z�^N]�S�a�x ])O O�Q2�'^\a��2a[^9�AK\OlKNM�Q�V�Z[QbWASwMPae]���]�Ks^N]��'^\a�x'WASPK\YA`¦O�kAa0SRa�MPO=Q�V!ORkAaeMPa�M�M+K\Q2Y�H# ��� # �!��� " �# >����&,.� )/ � ����������� $0# ��� # �!��� � ���������'� � �!�/��� � � � � �

, kAa�Y¡x'a�Z�^N]�SPK\YA`¡]{V WAY�Z[O£K�QbY�]�^:��]�^�WAa��.O�kAa�SRae]�SRarMPQ2q�ae]�^\ORa�S�Y�]�OPK\�2ayM£T¬Y'Ow]��Aa�M=]���]�Ks^N]��'^\a2H=�AQbS=a[��])q��'^\a� aeZ[Q2W'^Nx¯k�]��2aex'a�Z�^N]�SRa�xvORkAa ��� # �!��� V WAY�Z[OPK\Q2Yp�¬T.�# (�� � ��� # �!��� %��-% � % � 7� � * +%� �+������� � �!�/�-� � � � � �

Q2S+ PZ�^�Q'MPa�S=ORQ�O�kAa0q¦]�ORkAa�q¦])OPKNZ�]�^�YAQ2Ow]�OPK\Q2Y�$%�¬T.�# (�� � ��� # �!��� " % ) �-% � % � 7� � * +%� �+������� � �!�/�-� � � � � �

"�^|^_ORkAa�MPayx'a[��Y'K\OPK\Q2Y�M0])SRa0a��2W'K\��]�^\a�Y¬O�H

Page 20: Functional programming using Caml Light Michel Mauny January 1995

� �� � ������� ��� ��� �<� � ��� � � ��� I������ ��%)���#� %�& % � � &K� <%+�#� �$�!�" �L��*������������������������� ��0KNM�ORkAa ]��A�'^sKNZ�]�OPK\Q2Y¯Q�V�]�VXWAY�Z[OPK\Q2YUORQeMPQ2q�a��AWAO#YAQ2O#]�^s^.Q�V�K\OwMl]�SR`bWAq�a�Y¬O[M�H�<#QbY�M+KNx'a�SA�VXQ2S=a[��]�q��'^\a��AORkAa V WAY�Z[OPK\Q2YD x'a[��YAa�xv�¬T.�# (�� � �% � $#� �A'),����.& � � � % � � � �������'� � �!�/�'� � �����-� � � � � ���Q � �¬O�kAa0a[�E�ASRa�M�M+K\Q2Y " ) x'a�YAQ2O�a�MlORkAa�VXWAY�Z[OPK\Q2Y � k'KNZRk � kAa�Y¯`�K\�2a�Yo]�Y ])SR`2WAq�a�Y'O �¦SRa�O�WASRY�MlORkAa0��]�^\WAaQ�V � � �.H jlkAao]��A�'^sK�Z�])OPK\Q2Y " % ) K�MUZ�]�^s^\a�x�] � ��*(������]�S��������������� ����lM+K\Y�Z[a � ]�K\OwMyV Q2S«O � Q MPW�Z�Z[a�MRM´K��ba]�SR`bWAq�a�Y¬O[M��A]�Y�x«KNM ]��A�'^sK\a�xpORQ�Q2Y'^\TUQ2YAa2H#jlkAaf��]�^\WAafQ�V " % ) KNM=MPOPKs^s^�]yV WAY�Z[OPK\Q2Y�H

, a0q¦]�T�ORk'W�M=x'a[��YAa�]�Y¡]2xAxbK\OPK\Q2Y¯VXWAY�Z[OPK\Q2Yp�¬T.�# (�� � ������' �A'),���% � *#�� �A'!, ���.& � % � � * =&= ����� � ���!�/�'� � ������� � �!�/�-� � � � � �jlk'KNM�Z�]�Y¡]�^NMPQ��Ca � SPK\ORO�a�Y��# (�� � ������' �A'),���%�� ��% � � * =&= ����� � ���!�/�'� � ������� � �!�/�-� � � � � �, aeZ�]�YpORkAa�Y¡x'a[��YAaeO�kAayMPW�Z�Z[a�MRM£Q2SlVXWAY�Z[OPK\Q2Y¡�'T?�# (�� � �# �7����&,&��� ������' � '!,�� �� � 7 � �-� � 7-7 �+ � ���/�'� � �����1� � � � � ���Q � � � a0q¦]�TUW�MPa0Q2WAS ��# �7����&,&�rVXWAY�Z[OPK\Q2Y��# �# �7����&,&� " ��# �7����&,&� �*)/ � �������������

� �!*+�� � ��*7�

0 6�BE���2��D�Bo}X��� � BN'%'N� ��Q]�2� ')$\ D� ���&������ �� $� ����[��&' �S ����� � ���&UT�JK�L')$����� " ' ���3& � ' ��� ) & � ' ������ '�� �3& � " ' ���3& � '�� � )��� " ' ���3& � ' ��� ) & � " '�� �.& � ' � � )

0 6�BE���2��D�Bo}�8�� ' ��� B' $S'�'�9��&��4��&' ����Q%'�$ D�%�S �*(Q%��� � ��*D��Q%'�'*K$���*D'XQ%'��������&U���'�$�$����(%� $���&'N��L $($�� Y)��' � *D'����Q ' % Y�J�� ��� " *#�� � '!, �-%.& � % % ) � � �&��V$ �& ���� O� 'TO� ���� �*7O�'*\� *D'����Q ' % ��������" $#� �A'),���%'& � " $#� �A'),����3& � % � )�)� ������]*D'����Q%' �XY�J���� *K$S�� �]�&')$S��� ��!�" �&J$#

0 6�BE���2��D�Bo}\}�% BN�����&���'%��&' �S ����� � ���&UT'N�K��*D'�$�$S�� �� $'& *D'( *����' ���'Q �&������ �� I�� ���U�'N* � $($���Y���'�)��

Page 21: Functional programming using Caml Light Michel Mauny January 1995

G2h ��������� ��� � �� � �� � ����� ����� ��

(*� �-% � ���� '�� "�" *#�� � '!, ���3& � � % ) % ) � (*� �-% � ���� '�� "�" *#�� � '!, ��%3& � % % ) % ) � (*� � � � *#�� �A'!, � � & � " $#� �A'),�� %2& � � % )' � (�� ��� � $#� �A'),���%.& � % ��

'�� � � �� �

Page 22: Functional programming using Caml Light Michel Mauny January 1995

� ��������� �

� �t � � ��� � ��

, a0a[��]�qrK\YAa0K\YpORk'KNM Z�k�]��AORa�S=O�kAa < ]�qr^���]2M+KNZ O´T'��a�M©H

��� � ��� I��/*+���

< ]�q{^ nCK\`2k'O¯�ASRQ��2KNx'a�MUO � Q Y¬WAq«a�SPKNZ¡OPT'��a�M��pK\Y'ORa�`2a�SwM4 +O´T'��a '�� ��$y]�Y�x ��Q¬]�OPK\YA`2¥X�CQ�K\Y¬O¯Y'WAqr��a�SwM 6OPT'��a �(>, � ��$wH�;+Y¬O�a�`2a�SwM=]�S�a0^sK\qrK\ORa�xpORQ�ORkAafSw]�YA`2a4-=G���ªc�c�c6G���]- I2H$;6Y'ORa�`2a�S0]�SPK\ORkAq�a�OPKNZ K�M�Ow].&ba�Y¯q�QEx'W'^\Q¯G�� � MORk�]�O KNM��!]�Y K\Y'ORa�`2a�SrQ2�Ca�Sw]�OPK\Q2Y O�k�]�OeQ��2a�S���Q � Mfx'Q¬a�M YAQ2OrSw]�KNMPa¦])Y a�SRS�Q2SA���AWAOrORkAaUSRa�MPW'^\O�M+K\q��'^\T � S[]���M]�SRQbWAY�x.H#�!SRa�x'a[��YAa�xvQ2��a�S[]�OPK\Q2Y�M XV WAY�Z[O£K�QbY�M�$#Q2YUK\Y'ORa�`2a�SwM%K\Y�Z�^\W�x'a2�

]2xAxbK\OPK\Q2Y& MPWA�AORSw]bZ[OPK\Q2Y ]�Y�xUWAY�])SRT¦q{K�Y'W�M� qrW'^�O£K��'^sKNZ�]�OPK\Q2Y� xbK\�2KNM+K\Q2Y

A,�� q�QAx'W'^�Q¢2Qbq�a0a[��])q��'^\a�M=Q�V!a[�A�ASRa�MRM+K\Q2Y�M��

# � �'�� � ����������� �# � " �'1� ) � ����������� � # 3&��3& � � �����������3�$0

jlkAa�SRa¡])SRa¯�ASRa�Z[a�x'a�Y�Z[aoSRW'^\a�M�O�k�]�Orq¦].&2a � �'K\Y�x OPK\`2k'ORa�SrORk�]�Y � ])Y�x²MPQ Q2Y�H ;6Y�x'Q2WA�AOA� � SPK\ORa¡a[�AORSw]��]�SRa�Y'ORkAa�MPa�M©H¢2Q«V6]�SA� � aek�]��2arYAQ2O0MPa�a�YoORkAarOPT¬�CayQ)V ORkAa�MPa�]�S£K�O�kAq�a�OPKNZfQ2��a�Sw])OPK\Q2Y�M�HejlkAa�To]�^s^#a[�E�Ca�Z[O0O � Q«K\Y¬O�a�`2a�S]�SR`bWAq�a�Y¬O[M�M=MPQ��%ORkAa�T ]�SRaUVXWAY�Z[OPK\Q2Y�M«Ow].&bK\YA` Q2YAavK\Y¬ORa�`ba�S¦]�Y�x²S�a�ORWASRY'K\YA` ] VXWAY�Z[OPK\Q2Y²VXSRQ2q�K\Y'ORa�`2a�SwM«ORQ

K\Y¬O�a�`2a�SwM�H²jlkAa4 XVXWAY�Z[OPK\Q2Y�]�^L$y��]�^\WAa¡Q�V0MPW�ZRk K\Y'�A�²KNx'a�Y'OPKs��a�SwM�qU]�T ��a¯Q2�AOw]�K�YAa�x �¬T Ow].&bK�YA` ORkAa[K\S%��*D' � ��2a�SwM´K�QbY�H# � ���) A'�% � ���������'� � �!�/�'� � �����-� � � � � �

GAI

Page 23: Functional programming using Caml Light Michel Mauny January 1995

G2G ������� ����� � ������ � � � � ��

# � ���) A'�% � � ���������'� � �!�/�'� � �����-� � � � � �# � ���) A'�% A,�� � ���������'� � �!�/�'� � �����-� � � � � �

"0M=MPkAQ � Y¯�'T¯ORkAa[K\S�O´T'��a�M^�AORkAa0K\Y'�A�oQ2��a�Sw])ORQ2SwM � � ��c�c�c]�.x'Q�YAQ2O � Q2S]&UQ2Y ��Q¬])OPK\YA`2¥X��Q�K\Y'O0��]�^\WAa�M�H�"MPa���]�S[]�ORaeMPa�O=Q)V���Q¬]�OPK\YA`2¥X�CQ�K\Y¬O0]�SPK\ORkAq«a�OPKNZ0Q2�Ca�Sw]�OPK\Q2Y�M%KNM��ASRQ��2KNx'a�x.� � ]2xAxbK\OPK\Q2Y&5� MPWA�AO�Sw]2Z[OPK\Q2Y¡]�Y�xvWAY�]�SRTUqrK\Y¬W�M� � qrW'^\OPK\�'^sK�Z�])OPK\Q2Y� � xbK\�bK�M´K�QbY

���&�� M��bW�]�SRa0S�Q¬Q2O� % � �-(7,'� a[�A��Q2YAa�Y'OPKN]�OPK\Q2Yo]�Y�xU^\Q2`']�SPK\ORkAq

�-' �c��&, �(�\c�c�c W�MPW�]�^:ORSPK\`2Q2YAQbq�a�ORSPKNZ�Q2�Ca�Sw]�OPK\Q2Y�M, a¯k�]��ba¯O � Q Z[QbY¬�2a�S[M+K\Q2Y V WAY�Z[O£K�QbY�MUORQ `2Q ��]bZ]&²]�Y�x VXQ2SRO�k²��a�O � a�a�Y²K\Y¬O�a�`2a�SwMU]�Y�x ��Q¬]�OPK\YA`2¥X�CQ�K\Y¬OY'WAqy�Ca�SwM���' � �

�,&

� -(7, � �¦]�Y�x �(7, � �

�,.

�'�� �.H

#��6-� � � � ����������� ��� ��� ���� :� ! 0 �<$-$� '&'-'65 ��7 � � �4+%� 7&7 � � 5 *�7�� )��8� � �� *�� ;9�� �-��7 � 7 ��=?> ��� 5 � )��@� ����� 0# -(7, � �

�,.

�' ��� �6 � � � �

��� � �# *��1� � 0 �

n�a�O=W�M=YAQ � `)K��bayMPQ2q«a0a[��]�q«�'^�a�M�Q�V!Y¬WAq«a�SPKNZ�]�^:VXWAY�Z[OPK\Q2Y�M�H , aeMPOw]�SRO��¬T¯x'a[��Y'K\YA`¡MPQ2q�a0�2a�S�T M+K\q��'^\aVXWAY�Z[OPK\Q2Y�M=QbY¯Y¬WAqr��a�S[M��# (�� � ��� # �!��� %��-% � � % � 7� � * +%� � � �# *���� � � �# *��-��� � � � �# ��� # �!��� � �"� � ��� � �# *��1� � 0��# ��� # �!��� " � � � � � �"� )/ � ��� � �# *��1� �80 � � � � � � � � � � � �# (�� � �#

�,.

���� # �)����� " %��� ) � ��� # �!��� " % )6 � ��� # �!��� " � ) �

7 �����# � � 7� � * +4� 7 � � �� *��� � �� *���� � � �� *������ � � � �# (�� � % �&(&

� �' �� �� � �/�5� � � � � �

# '�� ��#� �,.

���� # �!���� " &, � " % �&(&

� �' ) � �-' � " % � (.

� �' )�) �

��� � �# *��1� 0��

Page 24: Functional programming using Caml Light Michel Mauny January 1995

� � � � � ��� � G2u, a�YAQ � x'a��2a[^\Q2�²]¡Z�^N]2MRM´K�Z�]�^La[��]�q��'^\a2�fORkAa¯Z[Q2q��AWAOw]�O£K�QbY Q�V=ORkAa�SRQ'Q2OfQ�VL] V WAY�Z[OPK\Q2Y �'T �=a � ORQ2Y�> Mq�a�ORkAQAx.H!�=a � ORQ2Y�> M�q�a�ORkAQAx�Z�]�Y��Ca MPO[]�ORa�xr]2M@VXQ�^s^�Q � M©��KsV 1 KNM#])Y¦]��A�ASRQ��'K�qU]�OPK\Q2Y�ORQe] SRQ'Q2O!Q�V�] V WAY�Z[O£K�QbY

A;�AORkAa�Y��1 - A 41($

A�� 41($KNMr]¡�Ca�ORORa�S�]��A�ASRQ��'K\q¦]�OPK\Q2Y�� � kAa�SRa!A � 41($�KNMrORkAa¯x'a�SPK\��]�OPK\�2a¯Q)VVA a���]�^\W�]�O�a�x²]�O!1CH ��Q2Sea[��]�q��'^\a�� � K\ORkA 7E�$8�9E -���� � a0k�]��ba\A � 7Ec$8� G�E �E])Y�xUORkAa�SRa[VXQ2SRa2�

1 - A 41 $A�� 41 $ � 1 - 1 -��

G 1 �1 3��

�G, a Z�]�Y¡x'a[��YAar]fVXWAY�Z[OPK\Q2Y ���!�A'��rVXQ2S ])�A�ASRQ��¬K\q¦]�O£K�YA`rORkAaex'a�S£K���]�OPK\�2afQ�V�] VXWAY�Z[OPK\Q2Y ])OL]f`�K\�2a�Y¯�CQ�K\Y¬O

�'T?�# (�� � ���!� ' � �% �*% � " " % � �*% ) &5� " % )�) � ���$% � =��,+ � � � �3� �# *���� � � �# *��-"�� � � �# *���� � � �# *���� � � �# *�� ��� � � � ��!S�Q��bKNx'a�x �*%�KNM=M£W � Z�K\a�Y¬OP^\ToMPq¦]�^s^9�AORk'KNM�`�K\�2a�M=]rSRa�]bMPQ2Y�]��'^\aea�M£OPK\q¦]�ORa0Q�V!ORkAaex'a�SPK\��]�OPK\�2aeQ)V Ao]�ORE@H

jLkAalV Q)^|^\Q � K\YA`0VXWAY�Z[OPK\Q2YUSRa�ORWASRY�M�ORkAa ]���M£Q�^\WAORa=��]�^�WAa�Q�VCK�O[M ��Q¬]�O£K�YA`f��Q�K\Y'O#Y'WAqr��a�S=]�SR`2WAq«a�Y¬O�H4;6O%W�MPa�MORkAaI !' oc�c�c �&%A��� c�c�c �&( �>��"rZ[Q2Y�xbK\OPK\Q2Y�]�^#Z[Q2Y�MPORSRW�Z[O�H# (�� � � � � %�� ' �% � � ���"���&%A� ��% � ( �>�-&5� % � * 9 7 � � �# *���� � � �# *�� ��� � � � �jlkAaUq¦]�K\YoVXWAY�Z[OPK\Q2Y��!`�K\�2a�Y ��a[^\Q � �_W�MPa�MfORkASRa�a{^�QAZ�]�^lVXWAY�Z[OPK\Q2Y�M�H¡jlkAa{��SwMPOeQbYAa��/#� � '!(���KNMy])Y a[��])q��'^\aQ�V ]�*D'����*#$��TB' V WAY�Z[OPK\Q2Y��fK\O�Z�]�^s^NM K�O[MPa[^sV K\Y K�O[Me�CQEx'T��!]�Y�x KNMrx'a[��YAa�x W�M+K\YA` ]D(�� � ����¡Z[Q2Y�M£ORSRW�Z[O8 I���MPkAQ � M�ORk�]�O#O�kAa x'a[��Y'K\OPK\Q2YUKNM%SRa�Z[WASwM+K\�2a.$[H�;6O%Ow].&2a�M�ORkASRa�a0]�SR`2WAq�a�Y'OwM��_]f�ASRa�xbKNZ�]�ORa � QbY���Q¬])OwM��¬] V WAY�Z[O£K�QbY % � ������V S�Q2q ��Q¬])OwM%ORQ ��Q¬])OwM��¬])Y�x¯]��Q¬]�O %.H ;XV � " % ) KNM�Vz]�^�M£a��AORkAa�Y #�� � '!( KNM=Z�]�^s^\a�x � K\ORkU^N]2MPO=]�SR`2WAq«a�Y¬O % � ����� " % ) �@Q2ORkAa�S � K�M£a���%oKNMrORkAaUSRa�MPW'^\O�Q�V�ORkAa � kAQ�^\a¡Z�]�^s^zH , a � Ks^|^ MPO�W�x'T SRa�Z[WAS[M+K\�2a�VXWAY�Z[OPK\Q2Y�Mrq«Q2SRaZ�^\Q¬MPa[^\T«^�])ORa�S�H#jlkAa�O � QeQ2ORkAa�S=]�W'�'Ks^sK�])SRTUV WAY�Z[O£K�QbY�M�� �� �A' �! A'&���e]�Y�x '6 � ��, ���(�2Ow].&ba ] ��Q¬]�O=]2Ml]�SR`2WAq«a�Y¬O]�Y�xrx'a[^sK\�2a�SlSRa�MP��a�Z[O£K��ba[^�T�]��CQ¬Q�^\a�]�Y«��]�^\WAa ]�Y�xr]���Q¬])O�H:jlkAa%VXWAY�Z[OPK\Q2Y �� �A''�) A'&���0]2M'&AM � a�O�kAa�S!ORkAa%K�qU]�`2aQ�V.K\OwMl]�SR`2WAq«a�Y¬O!�'TO fKNM M£q¦]�^s^\a�S O�k�]�Y�� � �-'!(>,��yQbS#YAQ2OA�bORk'W�M#O�a�MPOPK\YA` � a�ORkAa�S �rKNM Z�^\Q¬M£a a�YAQ2WA`bk¦ORQr]0SRQ'Q2OQ�V� .H#jlkAa�VXWAY�Z[OPK\Q2YN'6 � ��, ���yZ[Q2q��AWAO�a�MlORkAa0YAa[�AO ]��A�ASRQ��'K�qU]�OPK\Q2YUW�M+K\YA`¦ORkAa�VXQ2SRqrW'^N]f`�K\�2a�Y¯��a[^\Q � HljlkAaORkASRa�a�^\QAZ�]�^_V WAY�Z[OPK\Q2Y�M�]�SRa0x'a[��YAa�xpW�M+K\YA` ]«Z�]2MRZ�]2x'a0Q�V(*� �¯Z[Q2Y�MPORS�W�Z[OwM�H!jlkAa � kAQ�^\a�V WAY�Z[OPK\Q2YvKNM��# (�� ��� �!#���,�� � � �-'!(7, � �# (�� � ��� #�� �A')( � % � � ���6% �# ' � " % ) �.%A����%# �&( �7�6#���A')( � % � ����� " % ��� ��� " % )�) '��# (�� � ��� �A' �! '.��� ��� � � � " �� )�� �D� � ��')(7, � ' �# (�� � ' � �-,'��� � � �.&5� " " � ) � � " �*�!� ' � �� � � ��')(7,�� )�)# '��-#���A')( ��� � ''�! '.��� ' � �-,'��� � � ��> � � � �3� �� *���� � � �# *��&"�� � � �� *���� � � �� *���� � � �� *��-��� � � � �¢2Q2q�a0a[��]�q��'^\a�M�Q�V!a��2W�]�O£K�QbY MPQ�^\�bK\YA`��# (�� � ��� # �!���

��-,7,'� % � � ��'!(>,�� �

# �A�!#���, � " $#� �A'),����.& � � � ���.&5� % ) � � �-'!(7, ��%

Page 25: Functional programming using Caml Light Michel Mauny January 1995

G�� ������� ����� � ������ � � � � ��

# ��� � # � ''���,>,'�-% � � ��')(7,����# �A�!#���, � " $#� �A'),����.& � � � ��� � � �3& � % ) � � ��')(7,���% �

7� � * +%� � +.& � � � �� *���� � � �� *���� � � �� *��-� � � � � �� �#9 �#� ��+�- � � � �# *���� � � �# *���� � � �# *��-� � � � � �# ��� # �!���

��-,7,'� � � � � ��& 5 �

��� � �# *��1� 0 �� � ! �� 0��������# # � ''

���,>,'�����"� � ��& 5� �

��� � �# *��1� ! 0�� ��� ����� ��� �� #�� �"� � � " �A�)#�-,�� , � � ��& 5 � � 5 )/ � ��� � �# *��1� � 0 �� ���� ! 0�������

���C �.�L& *+%�� �)%�&K��*7�jlkAa��ASRa�MPa�Y�Z[a0Q�V_ORkAa Z[QbY�xbK�O£K�QbY�]�^ªZ[Q2Y�MPO�SRW�Z[O%K�q«�'^|K\a�M�ORkAa��ASRa�MPa�Y�Z[a0Q�V:�CQ¬Q)^�a�])Y¯��]�^\WAa�M�H#jLkAa0O´T'��a���,>,7( K�MZ[Q2q��CQ¬MPa�xvQ�V:O � Qy��]�^\WAa�M��>�*#A�y]�Y�x ��&( �7�EH# �>�*# � � ��� 9-&�� �-� +����# �&( �7� � ��� 9-&�� � � * � 7 �jlkAa�V WAY�Z[O£K�QbY�M � K�O�k¦SRa�M£W'^�O[MlQ�V�OPT¬�Ca ��,>,7(r]�SRa=Q)V ORa�YUZ�]�^s^�a�xF��*D'(O��������'�$�H:mo]�Y'Tr�ASRa�xbKNZ�]�ORa�M=])SRa=�ASRa�x'a[��YAa�xK\YN< ])qr^6H#J=a�S�ae]�SRaeMPQ2q«a0Q�VªO�kAa�q¡�# � ���) A'�% � � �����F*'� � �R*�� � 9&-�� ��� � � � �#�� � �� � ��� 9-&�� �-� +����# � ���) A'�% � � � ��� � �# *��3� � � �# *���� � 9-&�� � � � � � �# � � �/��5 � � � � � � � � ��� 9-&�� � � * � 7 �jlkAa�SRa0a[�'KNMPO0]�^NMPQ � ��� � � � ����]�Y�x¯M´K�q{K|^N]�S£^�T � ����� � ��� � ���[H�� ��� �� ���! %,?-+(X&��� �bW�]�^sK\OPT�k�]2Ml]rMP��a�Z�KN]�^ªM£Ow]�ORW�MªK�YUVXWAY�Z[OPK\Q2Y�]�^.^N]�YA`2W�])`2a�M%��a�Z�]�W�MPa0Q)V?VXWAY�Z[OPK\Q2Y�]�^���]�^\WAa�M�H;+O%K�M%a�]2M£T�ORQrORa�MPOa��bW�]�^sK�OPT¯Q�V!��]�^�WAa�M�Q�V!��]2MPa0OPT'��a�M/ XK\Y'ORa�`2a�SwM^� ��Q¬]�OPK\YA`2¥X�CQ�K\Y¬O�Y'WAqy�Ca�SwM��A�CQ¬Q)^�a�])Y�M��:c�c�c'$[�#�� � �� � ��� 9-&�� � � * � 7 �# �&( �7� � " � � � ) � ��� 9-&�� �-� +����

Page 26: Functional programming using Caml Light Michel Mauny January 1995

� W� ������+��� ����� ��� � �� G2�

 %WAO!K\O!KNM�K\q���Q'MRM+K\�'^\a��'K\Y¦ORkAa�`2a�YAa�Sw]�^�Z�]2MPa��2O�Qex'a�Z�K�x'a0O�kAa=a��2W�]�^|K\OPT�Q�V.VXWAY�Z[OPK\Q2Y�]�^.��]�^\WAa�M�H#J�a�Y�Z[a��'a��2W�]�^|K\OPTMPORQb��MlQ2Y¡]rSRWAYA¥XO£K�q«aea�SRSRQbS � kAa�Y¯K\O=a�Y�Z[Q2WAY'ORa�SwMLV WAY�Z[O£K�QbY�]�^:��]�^�WAa�M©H# " *#���%.& � % ) � " *#��%2& � % )/ � � ����* ���-5 � � �4� �R� ��� � ���� � * � � = � * +��4� ��� �/�� � � � * � � � � ���*��� �<* �?� * �&��� �

¢�K\Y�Z[ara��2W�]�^sK\OPT¯q¦]�T���afW�MPa�x¯QbY¯��]�^\WAa�M�Q�V�])Y¬TUOPT¬�Ca�� � k�]�O%KNMlK\OwMLO´T'��a�¡� �2W�]�^sK\OPT¯Ow].&2a�M%O � Q�]�SR`2WAq�a�Y'OwMQ�V0ORkAa¡MR]�q«a¡OPT¬�Ca � k�]�O�a��2a�SrO´T'��avK\O�KNM�$y])Y�x²SRa�ORWAS�Y�M�]o��Q'Q�^\a�]�Y ��]�^\WAa2H5jlkAapO´T'��a¯Q)V a��bW�]�^sK\O´T KNMU]�L �� J Q% �* � �&�����JK�L'A�LK6H a2Hdq¦]�T Ow] &2a MPa��2a�Sw]�^0��Q'MRM+K\�'^\a V Q2S�q¦M�H ;+Y�x'a�a�x�� � kAa�YORa�MPOPK\YA`²a��bW�]�^sK�OPT�Q�VrO � QY'WAqy�Ca�SwM��_ORkAa�YoK\OwMfOPT'��arKNM '�� �3& � '�� �3& � ��,7,>(��:]�Y�x � kAa�Y O�a�MPOPK\YA`¡a��bW�]�^sK\O´T Q�V MPORSPK\YA`¬M��@K\OwM O´T'��a{K�M� �>�A'�� �3& � � �7� ' � �'& � �*,7,7(�H# � ���) A'�%�� � �����F*'� � �R*�� � 9&-�� ��� � � � �

jlkAafO´T'��afQ�V!a��2W�]�^sK\OPT¡W�MPa�M �JK�L'�BN��*����&Y)��'�$�� � SPK\ORORa�Y �6�(��� �c��a�OwZ�H"�Y'T¯O´T'��arZ�]�Y¡�CayMPWA��M£OPK\ORWAORa�xpORQ�OPT'��a��])SPKN]��'^\a�MrK\Y²Q2Swx'a�S«ORQ¡�ASRQAx'W�Z[a�MUMP��a�Z�Ks�?Z���� $�������(')$ Q)V OPT¬�Ca�M�H ��Q2Sra[��]�q«�'^�a��lMPWA��MPO£K�O�WAOPK\YA`P'�� �oVXQ2S�� �]��CQ��bay�AS�QEx'W�Z[a�M ' ���3& � '�� �3& � �*,7,>(�� � k'KNZ�k KNM0O�kAa�OPT¬�Ca�Q�V O�kAa�a��2W�]�^|K\OPTpV WAY�Z[O£K�QbY W�MPa�x Q2YoK\Y¬O�a�`2a�S��]�^�WAa�M©H#�� � �� � ��� 9-&�� � � * � 7 �# " � � � ) � " � � �$) � ��� 9-&�� � � * � 7 �#�� � " � � � ) � � ����������� ��� ��� ���� -� � ; ! "%$&$� '-'&'65 ��7 � � �4+%� 7&7 � � 5 *�7�� )��8� �!�/�������� ;9�� �-��7 � 7 ��=?> ��� 5 � )��@� ����� 0

�� ��� � �¦*@"��#(z&2(6*�"%,?-<#Q2Y�xbK\OPK\Q2Y�]�^ªa[�A�ASRa�MRM+K\Q2Y�M0])SRa0Q�V#ORkAa V Q2S�q? !' ������������&%A����� � � ( �7� � "(� � kAa�SRa ���������%K�M�]�Ypa[�E�ASRa�M�M+K\Q2Y¡Q�VOPT¬�Ca ��,>,7(r]�Y�x � � � � ]�SRa=a[�A�ASRa�MRM´K�QbY�M#�CQ¬MRMPa�M�M+K\YA`yO�kAa MR])q�a=OPT¬�Ca2H " M%]�Y¦a[��]�q��'^\a��'ORkAal^\Q2`)K�Z�]�^�YAa�`']�OPK\Q2YZ[Q2W'^Nx¯�Ca � S£K�O�ORa�Y��# (�� ��� � � � ��� ��� ' � �.%A��� �� ( �>� � ( �>�&�7�$#A� � � ��� *�� � � 9-&�� � � 9--�� � � � � � �# � � � � ��� " � � � )/ � ��� 9-&�� �-� +����

Page 27: Functional programming using Caml Light Michel Mauny January 1995

G2� ������� ����� � ������ � � � � ��

�� ��� K �*�3�(+$A,.- *�/ ��12,C&2*�1&�jlkAaeZ�^N]2MRM´K�Z�]�^:^\Q2`�KNZ�]�^_Q2��a�Sw])ORQ2SwMl]�SRae]���]�Ks^�])�'^�afK\Y < ]�q{^zH%��K�M )´WAY�Z[OPK\Q2Yo]�Y�x¡Z[QbY.)´WAY�Z[OPK\Q2Yo]�SRa�SRa�MP�Ca�Z[OPK\�2a[^\T� SPK\ORO�a�Y�,&�¯]�Y�x��.�# �>�*# �P,.� �� ( �>� � ��� 9-&�� �-� +����# " � � � ) � " � � �$) � ��� 9-&�� �-� +����

jlkAa�Q2��a�S[]�ORQ2SwM���]�Y�x ,.��]�SRa=YAQbO#VXWAY�Z[OPK\Q2Y�M�H%jlkAa�T¦MPkAQ2W'^Nx«YAQ2O#�CaeMPa�a�Y¯]2M!SRa�`bW'^�])S#VXWAY�Z[OPK\Q2Y�M��AM+K\Y�Z[a0ORkAa�Ta���]�^�W�])ORa¯ORkAa[K\S¦MPa�Z[Q2Y�x²])SR`2WAq�a�Y'OeQ2Y'^\T KsV K\OfKNMrYAa�a�x'a�x.H²�AQ2Sfa[��]�q«�'^�a��%ORkAa ,&� Q2��a�Sw])ORQ2Sra���]�^\W�]�O�a�MfK\OwMMPa�Z[Q2Y�x Q2��a�Sw])Y�x¡QbY'^�TpKsV O�kAae��S[MPO0Q2YAara���]�^\W�]�O�a�M0ORQ �&( �>�AHejlkAar��a�k�]��bK\Q2SeQ�VlORkAa�MParQ2�Ca�Sw]�ORQ2S[M=q¦]�T¯�Cax'a�MRZ[SPK\�Ca�x ]bM%V Q)^|^\Q � M��

� � ,.��� KNM=a��bW'K\��]�^\a�Y'O ORQ ' �� � �.% � � �>�*#A� �&( �>��� � � ��� KNM=a��bW'K\��]�^\a�Y'O ORQ ' �� � �.% � ��� � ( �>�2 �� ( �7�

��a�`¬]�OPK\Q2YUKNM��ASRa�x'a[��YAa�x.�# �*,'���>�*# � � ��� 9-&�� � � * � 7 �

jlkAa ��,'�²KNx'a�Y¬O£K|��a�SoSRa�Z[a[K\�2a�Mo]²MP�Ca�Z�KN]�^yORS�a�]�ORq�a�Y'OUV S�Q2qtO�kAa ��]�SwMPa�S�� O�kAa ]��A�'^sKNZ�]�OPK\Q2Y �*,'� -% " K�MSRa�Z[Q2`bY'K B�a�xf]2M ��,'� " -% ) " � k'Ks^�a\ ���% "%KNM�K�x'a�Y'OPKNZ�]�^AORQ " �� ) % "AH:jLk'K�M_MP�Ca�Z�K�]�^EORS�a�]�ORq�a�Y'O.a[�E�'^N]�K\Y�M� k'T¦O�kAa�V WAY�Z[OPK\Q2Y�]�^ª��]�^\WAay]2MRM£QEZ�KN]�ORa�xUO�Q �*,'�¯Z�]�Y¯��afQ2�AOw]�K\YAa�x¯QbY'^�T¯W�M´K�YA`UORkAa � ���! A'%8&ba�T � Q2Swx.�# � ���) A'�% ��,'� � ��� 9-&�� � � 9--�� ��� � � � �

����� �L���#�K�!(�� % ��� "E!% ��%) "��*+���

¢2ORSPK\YA`�Z[Q2Y�MPO[]�Y¬O[MR +O´T'��a � �>�A'�� ��$ª]�SRa � SPK\ORO�a�Y¦�Ca�O � a�a�Y��0Z�k�]�Sw]2Z[ORa�S[MR Px'Q2WA�'^\a�¥ �2WAQ2O�a�M�$wHl¢�K\YA`�^\a�¥6Z�k�]�Sw]2Z[ORa�SZ[Q2Y�MPO[]�Y¬O[M/ 6OPT¬�Ca % �!��$ ])SRa � SPK\ORORa�Yp��a�O � a�a�Y � Z�k�]�Sw]2Z[O�a�SwM/ 6��]2ZF& �2WAQ2O�a�M�$wH#jlkAafq�Q¬MPO�W�MPa�x¡MPO�SPK\YA`¦Q2�Ca�SR¥]�OPK\Q2YUKNM�MPORSPK\YA`¦Z[QbY�Z�]�ORa�Y�]�OPK\Q2Y��Cx'a�YAQ2ORa�x¯�'TUORkAa 2yZ�k�]�Sw]bZ[ORa�S�H# ����� (7(7,�� 2���,&��(�� ��� � ��� 7 � + �!� � � ��� � �&�����+��#=�� �# � ���) A'�% 2 � ��� 7 � + �!� � � � 7 � + ��� � � � 7 � + ��� � ��� � � � �<#k�]�S[]2Z[ORa�SwMl]�SRa�"f¢�<; ; Z�k�]�Sw]2Z[O�a�SwM��# � � � � ��� � 5 * + ���L*��# ��� ��! 5 � � ��� � 5 * + �������

Page 28: Functional programming using Caml Light Michel Mauny January 1995

� �� ����� ���� G'�

]�Y�x¯Z�]�Yp��af�AW'K|^\O�V S�Q2q�ORkAa[K\S�"f¢�<; ; Z[QAx'ay]2M�K\Y��# % �)�

�,&

�' � � ! 5� �

��� � 5 * + �������

:=ORkAa�SUQ2��a�S[]�OPK\Q2Y�MU]�SRa¡]���]�Ks^N]��'^\a� ��# ��� �7�A'�� � � '�� �

�,.

� % �!� �!a�O[Z6$wH5¢2a�aoORkAa <l]�qr^ nCK\`2k'OUSRa[V a�S�a�Y�Z[a

q¦]�Y'W�]�^ � GAI��.VXQ2S Z[Qbq��'^\a�ORa0K\Y'VXQ2SRq¦]�O£K�QbY�H

����� D � �:& *+��� �� �� �¦*@"��&212 #$'&2(6"%3 &) %/#-I���;6OLK�M���Q'MRM+K\�'^\ayO�Q¦Z[Q2qr�'K\YAae��]�^�WAa�MLK\Y¬O�Q�ORWA�'^\a�M 6��]�K\SwM��'ORS£K��'^\a�M��_c�c�c]$[H#jlkAa�B��� ��'%�( �� $��*(���� �*%VXQ2SlORWA�'^\a�MLK�MORkAa[ �#"¦Z�k�]�Sw]bZ[ORa�S3 +ORkAayZ[Q2q«q¦]%$wH , a � Ks^|^lQ�VXORa�Y¡W�MPar��]�S�a�Y¬ORkAa�M£a�M0]�SRQ2WAY�xpORWA�'^\a�M�K\Y Q2Swx'a�S�ORQ«K\q��ASRQ��2aSRa�]2xA])�'K|^sK\OPT����AWAO�ORkAa�T¯]�SRa0YAQ2O�MPORSPKNZ[OP^\TUYAa�Z[a�MRMR]�SRT2H#�� � �� � ��������� �1�!�/�-� ; !#�� � � � � �� � ��������� �1�!�/����!�/��������-� ; ! ; � ; �# (�� � � � " ��� � � � � ) � � ������� � 9&-�� �-� ; � +����jlkAarK\Y'�A� � "«K�x'a�Y'OPKs��a�SrKNM0O�kAa��JK�L'!�� �� $S�*��&�N� �*�V QbS0ORWA�'^\a�M�H¡�AQbS�K�Y�M£Ow]�Y�Z[a�� ��� Z[QbSRSRa�MP�CQ2Y�xAM0ORQpORkAaq¦]�O�kAa�q¦]�OPKNZ�]�^:Z�]�SRO�a�M+KN]�Y¡�ASRQAx'W�Z[O=Q�V!OPT¬�Ca�M � ])Y�x� H, aeZ�]�Y¯�AW'Ks^�xpORWA�'^\a�MLV S�Q2q ]�Y'T¦��]�^\WAa�M��%ORkAa0ORWA�'^\ae��]�^\WAa{Z[QbY�MPORSRW�Z[ORQbS#KNM U�'N��'*�����H�� �� � � H!&212,.$'&2(6"%3 /#,.(+1¡$A*�45/�*�"�C"�&&�� *D ���'����� ��fV WAY�Z[O£K�QbY�M ]�S�a0W�MPa�x¯ORQ«a[�EORS[]2Z[O=Z[Q2q���QbYAa�Y¬OwMLQ�VªO�WA�'^�a�M©H ��Q2Sl��]�K\SwM�� � a0k�]��2a2�# � � � �����F* � � 9 � � �F*���� � � � �# ��� � � �����F* � � 9 � � � 9 ��� � � � �jlkAa�T¯k�]��2a0�CQ�^\T¬q�QbSR�Ak'KNZrOPT¬�Ca�M��AQ�V#Z[Q2WASwMPa��.M+K\Y�Z[arORkAa�T¯q¦]�TU��ay])�A�'^|K\a�xoO�Q¦]�Y'T!&bK\Y�x¡Q)Vª��]�K\S�H=jLkAa�T¡]�SRa�ASRa�x'a[��YAa�x K\Y ORkAa�<l]�qr^LM£TEMPO�a�q ���AWAO�Z[Q2W'^Nx ��a¯x'a[��YAa�x �¬T O�kAa�W�MPa�S XK\Y V6]2Z[OA�@ORkAa¯Z�]�SRORa�M+KN]�Y �ASRQAx'W�Z[OK\OwMPa[^sV Z[Q2W'^Nx¯�Cayx'a[��YAa�x ��MPa�arMPa�Z[OPK\Q2Y ��H\I��¬x'a�xbKNZ�]�O�a�x¡O�Q�W�MPa�SR¥6x'a[��YAa�xv�ASRQEx'W�Z[O�OPT¬�Ca�M�$w�# (�� � ' � � � " %��� ) ��%# ��� � �>� ,�� � " %�� � ) � � � � � + 7 ��� �F*� � 9 � � �F*�� � � � � �7 � � � = � �F* � � 9 � � � 9 � � � � � �# ' � � � � � �������������# �>� ,�� � � � ��� 9-&�� �-� +����

Page 29: Functional programming using Caml Light Michel Mauny January 1995

G2§ ������� ����� � ������ � � � � ��

, a¯MR]�ToORk�]�O ' ��� �pKNM�][U�'��'*����r��]�^\WAa¯��a�Z�]�W�MPaUK\O � Q2S]&AM0WAY'KsVXQ2SRqr^\T Q2Y M£a��2a�Sw]�^ &2K\Y�xAMrQ�V0]�SR`2WAq�a�Y'OwM 6�ASRQ��bKNx'a�x ORkAa�T ]�SRaU��]�K\SwM�$[H , aUQ�VXORa�Y Z[QbY'V W�MPa¯�Ca�O � a�a�Y `2a�YAa�SPKNZ�" ]�Y�x9 [��Q)^�T'q�Q2S��Ak'K�Z�" � MR]�TbK\YA` ORk�]�OMPW�Z�k¡��]�^\WAa0KNM=�CQ�^\T¬q«Q2SR�Ak'KNZ�K\Y�MPORa�]bx¯Q�V!`2a�YAa�SPKNZ�H

��� ��%+����*7� �!� %���� ��%+����*7� ��� I %+�� E��K�!(

�!]�ORO�a�SRY�M ])Y�x¡��])ORORa�SRYA¥Xq¦])OwZRk'K\YA`¯�'^N]�T ]�YpK�q«��Q2SRO[]�Y¬O0S�Q�^\aeK\Y mon ^�])YA`2W�]�`2a�M�HrjlkAa�To]��A��a�]�S�K\Y²]�^s^#SRa�]�^�ASRQ2`bSw]�q¦Ml]�Y�x¯]�S�aeMPORSRQ2YA`)^�TUSRa[^N]�ORa�xvORQrOPT¬�Ca�M+ 6�AS�a�x'a[��YAa�x¯Q2S=W�M£a�SR¥6x'a[��YAa�x�$wH

" � ����'*��¯K\Y�xbKNZ�]�ORa�MfORkAa $ �&�S�L'fQ�VL]v��]�^\WAa2H¡�!]�O�ORa�SRY�M0]�SRa[ [��]�^\WAa�M � K\ORk kAQ�^\a�M#"AH "�M+K\YA`�^\a¯��])SPKN]��'^\a XVXQ2SRq¦]�^#��]�Sw]�q�a�O�a�S�$=KNMr]¯��]�O�ORa�SRY � K\ORk YAQ MPk�]��Ca M£��a�Z�Ks��a�x.�«K�Orq¦])OwZRkAa�Mr]�Y'To��]�^\WAa.$wH , kAa�Y ]p��]�^\WAaKNM[Q%������&'�O��U������ $�=]o��]�O�ORa�SRY 6ORk'KNM{KNM¦Z�]�^s^\a�x �L����'N*(� M7Q%������&����U.$0�%ORkAap��]�ORORa�SRY ]bZ[OwM�]2M�] �A^�O�a�S�H , a]�^\SRa�]2x'T�W�MPa�x���]�ORORa�SRY�MU]�Y�x���])ORORa�SRYA¥Xq¦])OwZRk'K\YA` K\Y ]�^s^rORkAapV WAY�Z[OPK\Q2Y�M � a � SRQ2ORa2� ORkAapVXWAY�Z[OPK\Q2Y5��QAx'T" $#� �A'),���%'& � ���� ) x'Q'a�M4 6ORS£K��bKN]�^L$¦��]�O�ORa�SRYA¥Xq¦]�O[ZRk'K\YA`�H , kAa�Y ]��A�'^sK\a�xORQ ]²��]�^\WAa��0ORkAapV QbSRq¦]�^��]�Sw])q�a�ORa�S %o`2a�OwM ��Q2WAY�x ORQ¡O�k�]�O0��]�^\WAa2H¡jLkAa�VXWAY�Z[OPK\Q2Y ��QAx'T " *#� � '!,�� " % �� ) & � % � ) x'Q'a�Mr]�^NMPQ��]�ORO�a�SRYA¥Xq¦]�OwZ�k'K\YA`�� � kAa�Yo]��A�'^sK�a�x ORQ¦]«��]�^�WAa ´]r��]�K\SA�.�Ca�Z�]�W�MParQ�V � a[^s^�¥XOPT'�'K\YA`¯k¬T'��Q2O�kAa�MPa�M�$0�CORkAa %¡]�Y�x�U`2a�O=��QbWAY�x¯SRa�MP�Ca�Z[OPK\�2a[^\T¡ORQrORkAa ��SwMPO=]�Y�xvORkAaeMPa�Z[Q2Y�xpZ[Q2q���QbYAa�Y¬O=Q)VªORk�])O ��]�K�S�H

"�^s^:ORkAa�MPa0��])ORORa�SRYA¥Xq¦])OwZRk'K\YA`�a[��]�q��'^\a�M � a�SRa0ORSPK\�bK�]�^ªQ2YAa�M^�¬O�kAa�T¡xbK�xvYAQ2OlK\Y'�2Q�^\�2ay])Y¬T�O�a�MPO��, V Q2S�q¦]�^2��]�Sw]�q«a�ORa�SwM�MPW�Z�ky]bM/%0x'Q YAQbO.K\q���Q¬M£aL])Y¬T0��]�S�OPKNZ[W'^�])SªMPk�])��a#O�Q ORkAa!��]�^\WAa=ORkAa�T0]�SRalMPWA�A��Q¬M£a�xORQrq¦]�OwZ�k M, ��]�K\S ��]�O�ORa�SRY�M=MPW�Z�k ]bM " %��� ) ]�^ � ]�TAMlq¦])OwZRkvV QbS=OPT¬�'K\YA`USRa�]2MPQ2Y�M ´Z�]�SRORa�M´K�])Y¡�ASRQAx'W�Z[O=KNM�] ��*D O��&�N�J#� '�$wH

J�Q � a��2a�S6��MPQ2q�a�OPT'��a�Mfx'Q¡YAQ2Of`2W�]�Sw]�Y'ORa�a�MPW�Z�k ]¯WAY'KsVXQ2SRq�MPk�]���aUORQ¯ORkAa[K\Sr��]�^�WAa�M©H�<%Q2Y�M+KNx'a�SeORkAa ��,>,7(OPT¬�Ca2�e]�Y a[^\a�q�a�Y'OeQ)VLOPT'��a ��,7,>( K�M a[K\ORkAa�S �>�*# �UQ2S� �� ( �>�AH ;XV � arK\q��CQ¬MPa�ORQo]U��]�^\WAaUQ�V=OPT¬�Ca���,7,>(pORQk�]��2a0ORkAaeMPk�])��aeQ)V �7�$#A�(�¬O�kAa�Y¯��]�ORORa�SRYA¥XqU]�OwZ�k'K�YA`«q¦]�T�V6]�Ks^6H�<#QbY�M+KNx'a�S=ORkAa0VXQ�^s^\Q � K\YA`�VXWAY�Z[OPK\Q2Y��# (�� � � *#�� �A'!, � �7�$#A�-& � �� ( �>� � � ����������� ��� ��� ���� ��� � � � � � ���$��� � � +���� � � � * � 7 � $-$� '-'&'-'&'-'-'&'-'&'-'-'&'-'&'-'-'&'-'&'-'-'� * + ����� � ��� 5 ��7 � *��#� 5 �!� � ��7 � � � � 5 * � 7 ��� ����0� � 9-&�� � � 9--�� ��� � � � �jlkAaeZ[Q2q«�'K|^\a�S � ]�SRY�M%W�M�ORk�]�OlORkAa0��]�O�ORa�SRYA¥Xq¦]�O[ZRk'K\YA`�q¦]�T«Vz]�K|^j � aexbK�xvYAQ2O Z[Q2Y�M´K�x'a�S�ORkAa� �� ( �7�{Z�]2M£a.$wHjLk¬W�M���KsV � al]��A�'^\T 0ORQ ]���]�^\WAa=ORk�]�O_a���]�^�W�])ORa�M_ORQ��>�*# �(����]�ORO�a�SRYA¥Xq¦]�OwZ�k'K\YA` � K|^s^�MPW�Z�Z[a�a�x ´]�Yfa��2W�]�^|K\OPTORa�MPOLK�ML��a�SPVXQ2SRq�a�xpx'WASPK\YA`¦a[�Aa�Z[WAOPK\Q2Y�$wH# " � �$� ) � ��� 9-&�� � � * � 7 �

 %WAOA�'KsV �> Ml]�SR`2WAq�a�Y'O=a���]�^\W�]�ORa�M�ORQ �&( �7�(�E]{SRWAYA¥XOPK\q�aea�S�SRQ2SlKNMlSRa��CQ2SRORa�x.�# " � � � ) � � ����* ���-5 � � �4� �R� ��� � � � *���� 5�� � *�� �-� +%� � � � ; � � 0 ; � 0 �"J�a�SRa�KNM ]�Z[QbSRSRa�Z[O x'a[��Y'K\OPK\Q2YoW�M+K\YA`U��]�ORORa�SRYA¥XqU]�OwZ�k'K�YA`C�

Page 30: Functional programming using Caml Light Michel Mauny January 1995

� �� � � ��� ����� � ���� � ��� ������� � � � ��� � ��� G2�

# (�� ��� � � � ��� � $#� �A'),�� �>�*# �-& � �� ( �>�# � �&( �7�-& � �>�*# � � � ��� *�� � � 9-&�� � � 9--�� � � � � � �jlkAar��]�ORO�a�SRYA¥Xq¦]�OwZ�k'K\YA`¦k�]bM=YAQ � O � Q¦Z�]2MPa�M^�?MPa���])Sw]�ORa�xv�¬TpORkAaF � "UZRk�]�S[]2Z[ORa�S�H < ]bMPa�M ])SRaea[��]�qrK\YAa�xvK\YORWASRY��EV SRQbq O�Q2�¯ORQ��CQ2ORORQ2qpH�"�Y¯a��bW'K���]�^\a�Y¬Oex'a[��Y'K\OPK\Q2YoQ�V �A� ��� ��� � Q2W'^Nx¯�Ca2�# (�� ��� � � � ��� � $#� �A'),�� �>�*# �-& � �� ( �>�# � %.& � �7�$#A� � � ��� *�� � � 9-&�� � � 9--�� � � � � � �jlkAa M£a�Z[Q2Y�x�Z�]2MPa�YAQ � qU]�OwZ�kAa�M!]�Y¬Tf��Q'Q�^\a�]�YU��]�^\WAa XK\YrVz]bZ[OA��Q2Y'^\TO �� ( �>�0M+K\Y�Z[a �7�$#A�0k�]2M_��a�a�Y¯Z�]�WA`2k'O!�¬TORkAa���SwMPOlq¦]�O[ZRk¯Z�]2MPa.$wH , kAa�YUORkAaeMPa�Z[QbY�x¯Z�]2MPa�K�M�ZRkAQ¬M£a�Y��AORkAa�K�x'a�Y'OPKs��a�S %�`2a�OwM%��QbWAY�x¯ORQfORkAae]�SR`2WAq«a�Y¬OQ�V5�A� ��� ���(��]�Y�xoZ[Q2W'^Nxo��arW�MPa�x K�YoORkAarSPK\`2k'OR¥Xk�]�Y�x ��]�SRO�Q�V#ORkAarq¦]�OwZ�k Z�]2MPa2Hr¢�K\Y�Z[arK\Y QbWAS a[��]�q��'^\a � ax'QoYAQ2OrW�MPa¯ORkAaU��]�^\WAa¯Q�V�ORkAa¡]�SR`2WAq«a�Y¬O K�Y²O�kAa¯SPK\`2k¬O�¥Xk�]�Y�x ��])SROrQ�V ORkAa¯MPa�Z[Q2Y�x q¦])OwZRk Z�]2MPa��#]�YAQbORkAa�Sa��bW'K���]�^\a�Y¬Oex'a[��Y'K\OPK\Q2YoQ�V �A� ��� ��� � Q2W'^Nx¯�Ca2�# (�� ��� � � � ��� � $#� �A'),�� �>�*# �-& � �� ( �>�# �

�& � �7�$#A� �

� ��� *�� � � 9-&�� � � 9--�� � � � � � �, kAa�SRaF

�"r]2Z[OwM�]2M=]yV Q2S�q¦]�^���]�Sw]�q«a�Y¬ORa�S 6q¦]�OwZ�kAa�M=]�Y'TU��]�^\WAa.$0�C�AWAO x'Q'a�M�YAQ2OlK\Y¬O�SRQEx'W�Z[ar]�Y'T¦�'K\Y�xbK\YA`��

K\O MPkAQ2W'^Nxp��afSRa�]2x¯]2M� �])Y¬T'ORk'K\YA`¦a[^NMPa"�H"0M!]�Yra[��]�q��'^\a=Q�V.��]�ORORa�SRYA¥XqU]�OwZ�k'K�YA`��¬Z[Q2Y�M+KNx'a�S%ORkAalVXQ�^s^�Q � K\YA` V WAY�Z[OPK\Q2YUx'a[��Y'K�O£K�QbY 6O�SRWAORkr��]�^\WAa�Ow]��'^\aQ�V_K\q��'^sK�Z�])OPK\Q2Y�$w�

# (�� � ' � ( ��� *#�� �A'!, � " �>�*# � �"�>�*# � ) & � �7�$#A�# � " �>�*# � � �&( �7� ) & � �&( �>�# � " �&( �7� � �7�$#A� ) & � �>�*#A�# � " �&( �7� � �� ( �7� ) & � �7�*# � � � � ���/) � 9--�� � 9-&�� � � 9&-�� � � � � � �J�a�SRa�KNM ]�YAQbORkAa�S � ]�T�Q�V#x'a[��Y'K�YA`N'6 � ( � �'�'T¦W�M´K�YA`U��])SPKN]��'^\a�M��# (�� � ' � ( ��� *#�� �A'!, � " �>�*# � � % ) & � %# � " �&( �7� � % ) & � �7�$#A� � � � ���/) � 9--�� � 9-&�� � � 9&-�� � � � � � �¢�K\q��'^\a�SA�.]�Y�x¡M+K\q��'^\a�S0]�`¬]�K\Y��# (�� � ' � ( ��� *#�� �A'!, � " �>�*# � � % ) & � %# � " �&( �7� �

�) & � �7�$#A� �

� � ���/) � 9--�� � 9-&�� � � 9&-�� � � � � � �# (�� � ' � ( ��� *#�� �A'!, � " �>�*# � � �&( �7� ) & � �&( �>�# �

�& � �>�*# � �

� � ���/) � 9--�� � 9-&�� � � 9&-�� � � � � � ��!]�ORO�a�SRYA¥Xq¦]�OwZ�k'K\YA`fK�M�]�^s^�Q � a�xUQ2Y¯]�Y'T¦OPT'��a�Q�Vª��]�^\WAa 6YAQ2YA¥XORS£K��bKN]�^:��]�O�ORa�SRYA¥Xq¦]�O[ZRk'K\YA`fKNM=Q2Y'^\TU��Q¬M�M+K\�'^�afQ2YOPT¬�Ca�M � K\ORk O�����!�� �� $��*(���� �*#$�$wH��Q2Sla[��])q��'^\a2�

Page 31: Functional programming using Caml Light Michel Mauny January 1995

u2h ������� ����� � ������ � � � � ��

# (�� � ' �����!�-,�� *#�� � '!, ���1& � �>�*#A� �

�& � �� ( �7� �

��7 ���<�D+. � �!�/��� � 9--�� � � � � � �# (�� � ' �

����� � $#� �A'),�� � , # ' � & � �>�*# �

# � � ��' � & � �7�$#A�# � � ��� � & � �7�$#A�# � � ����� � & � �>�*# �# �

�& � �� ( �7� �

��7 ��)<� 7 � 7 � + �!� � � � 9-&�� ��� � � � �

����� �����! "�#� �$�!�

jlkAa¯OPT'��a¡Z[Q2Y�MPO�SRW�Z[ORQ2S! �& � "vKNMr�ASRa�x'a[��YAa�x�]�Y�x Z�]�YAYAQ2O��Ca¡x'a[��YAa�x K\Y mon"> MfOPT'��a¯MPTEM£ORa�q¡H , a¡MPk�]�^s^a[�A�'^�QbSRa0K\Y¡O�k'K�M�MPa�Z[OPK\Q2Y¡M£Q2q�a�VXWASRORkAa�S ]2M£��a�Z[OwM�Q�V�VXWAY�Z[OPK\Q2Y�M�]�Y�xUVXWAY�Z[OPK\Q2Y�]�^:OPT'��a�M�H

�� ��� �� �! %"#$'&2(6*@"#,.-0$A*�45/=*4��(z&2(6*�"�AWAY�Z[O£K�QbY�]�^ªZ[Q2q��CQ¬M+K\OPK\Q2YvK�M�a�]2M+Ks^\T¡x'a[��Y�]��'^\afK\YN< ]�q{^zH$;6OlKNM�Q�V�Z[QbWASwMPae]r�CQ�^\T¬q�QbSR�Ak'KNZ0VXWAY�Z[OPK\Q2Y��# (�� � , � , �>�2 � � *#�� � '!, ��%.& � " � " % )�)/ � � ���� 7 � � � �F*�� � � 9 "�� � � � �-� � �F*&"�� � � �-� � � 9 ��� � � � �

jlkAafO´T'��afQ�V , � , �>��Z[Q2Y'Ow]�K\Y�M=YAQUq�Q2S�aeZ[Q2Y�MPORSw]�K�Y'OwMlO�k�]�Y¡ORkAafQ2YAa�M�]��A��a�]�S£K�YA`«K\YoORkAayx'a[��Y'K\OPK\Q2Y��LK�Yo]MPa�Y�MPa��EK�O�KNMlORkAaTQ $S U�'��'*D���bO´T'��aeZ[Qbq���]�OPK\�'^\a � K\ORk¯ORkAa�MParZ[Q2Y�MPORSw]�K�Y'OwM�HjLkAa�MPaeZ[Q2Y�MPORS[]�K\Y¬OwM�]�SRa2�, ORkAaeZ[QEx'Qbq¦]�K\Y¡Q�V �¡]�Y�xUORkAaex'Q2q¦]�K�YpQ�V� ¦qrW�MPOl��afORkAaeMR]�q«a�M, %¦qrW�MPOl��a[^\Q2YA`UORQ�O�kAaex'Q2q¦]�K\Y¡Q)V �2M, , � , �>�2 ���% � Ks^|^!��a[^\Q2YA`UORQ�O�kAaeZ[QEx'Q2qU]�K\Y¡Q�V� .Hn�a�O?> M=MPa�a &, � , �7�y]�O � QbS]&?�

# (�� � �# ��%���% ��� � 7 � �-� �+�!�/��� � �!�/����� � � � �# , � , �>����# P(�''� �

�(�� ����.% �

����� � * � ��7 ��� � �!�/�-� � � � � �# " &,� � , �7���# �P(�' � �

�(*��� ��&% )��!�� � �� �

�������������

�� ��� � �¦ %121��#(+"#3, aeZ�]�Yox'a[��YAaeO � Qr�2a�SwM+K\Q2Y�MlQ)VªORkAae]bxAxbK�O£K�QbY¯VXWAY�Z[OPK\Q2Y��

Page 32: Functional programming using Caml Light Michel Mauny January 1995

� �� � � � � � � ��� uAI

# (�� � � ( # ���P *#� � '!,�� " %�� � ) & � % � � ���&� 7 �+�!�/��������'� � �!�/����� � � � �# (�� � ������� $#� �A'),���%.& � " *#� � '!,�� �.& � % � )/ � * =&= �+�����3� � �����'� � �!�/����� � � � �jlkAa�MParO � QrVXWAY�Z[OPK\Q2Y�M0xbK���a�S0QbY'^�TvK\Y O�kAa[K�S � ]�TUQ�V#Ow].&bK\YA`¯ORkAa[K\S ]�S�`2WAq�a�Y'OwM�H jLkAae��S[MPO QbYAa � Ks^s^#Ow].&2ar]�Y]�SR`bWAq�a�Y¬O@��a[^\Q2YA`�K\YA`eO�Q ] Z�])SRORa�M+KN]�Yf�ASRQEx'W�Z[O6��ORkAa MPa�Z[QbY�xeQbYAa � Ks^s^�Ow].&2a#]�Y'WAqy�Ca�Sª])Y�xeS�a�ORWASRYy] V WAY�Z[OPK\Q2Y�HjlkAa �����fVXWAY�Z[OPK\Q2YUKNM=MR]�KNx«ORQr��a4��&' ���*(*���'(O:B'N*#$��� ��eQ�V � ( # � XK\Y¦kAQ2YAQbS Q)V:ORkAa�^�Qb`�KNZ�K�])Y J�]2M'&2a[^s^�<#WASRSRT�$wHjLkAaLZ[WAS�SRT2K\YA`rORSw])Y�M+V QbSRq¦]�OPK\Q2Yfq¦]�Te�Ca � SPK\ORORa�Y{K�Y+< ]�qr^�WAY�x'a�S%ORkAalVXQ2SRq¤Q�V�]�k'K�`bkAa�SR¥XQ2Swx'a�S�V WAY�Z[OPK\Q2Y��# (�� � #��>� � � *#�� � '!, ��%3& � " *#� � '!,����3& � " %�� � )�)/ � � � +-+�) � � �F* � � 9 � � � ��"'� � �R*'� � � 9 � � �B��� � � � � �;6O[M%K\Y¬�2a�S[MPa0VXWAY�Z[OPK\Q2Y¡qU]�T«��ayx'a[��YAa�xp�'T?�# (�� ��#�� #��7� � � *#� � '!,�� " % �� ) & � �%�� � � ��� � +-+�) � � �F*�� � � 9 � � � ��"�� � �F*� � 9 � � �B�-� � � � � �, a0q¦]�T¯ZRkAa�ZF&UORkAaeOPT'��a�MlQ�V�#��>� �¯]�Y�x #�� �#-�7� �UQ2Y¯��]�S�OPKNZ[W'^�])S a[��]�q��'^\a�M��# #�� #��7� � " � ���) A'�% ) � ��������� �1�!�/��� � ���/� ��� � � � �# #�� #��7� � " � ���) A'�% 2 ) � ��� 7 � + �!� � �:7 � + �!� � � � 7 � + ��� � ��� � � � �# #��>� � � ( # � � ���������'� � �!�/�'� � �����-� � � � � �

� �!*+�� � ��*7�

0 6�BE���2��D�Bp� X��� ' � ��'��S�����N��� �� $4��&�� �( �Q]�2�&�'!��&'T$���* ������'I��*D'�� ����O ��&'/B �����Q%'! D� '���WM�� �� � ��U�'( �MQ%'�*����% &Y �S'���$ & *D'(�N����&U���'�$�� ���*D���'�$�� $ � �&'N*D'�$��ªc�c�c ) �0 6�BE���2��D�Bp� �8�� �&��" ��&��O �������L'N������� �����&U��&�U�'%$��LY)Q ����'�O!� !�(�����9M Y)J?MCB������' �����*D'(�N�&*K$��� �� � � ��&'N*D' � $\�� I�� ���O������ ������ �( �� $��*(��� &F' ���� �.% � � ���� � ( �7� ��� )!#0 6�BE���2��D�Bp� \}�� ' � ��'\��&'� �� ��,&�A''� ( �S�����N��� ��[$����!�!��&����

�� ��,&�A''� ( / � / � / -²I $ � c�c�c � G �

I� �TB'% /B'N*#$��� �� $� D�� ��� ��,&�A' �&(!��*D'(�N�&*K$S�TB'%����OI������ *D'����*#$��TB' �0 6�BE���2��D�Bp� s��� ' � ��'!��&'O A' ��,�� ���'%���&������ �����&����' �&'� U��TB'N��������Q4Y#'N* / �\*D'���*(� $I��&' / �� � MYK ��������� ����Q4Y#'N*�� � � ' � ��&' / ��[�'*�Q ���� D�\��&'%$�'����'����'�O�' � ��'�O!Y�J��

� � � I� � I� ��� ��� ��� � 3 � �

Page 33: Functional programming using Caml Light Michel Mauny January 1995

u2G ������� ����� � ������ � � � � ��

0 6�BE���2��D�Bp� ���� �&�����*D'%��&'4�JK�L')$\ D�\��&' �� ����� � ���&UT' �#��*D'�$�$��� �� $�#

, #�� #��7� � &,� � , �7�, , � , �>���#-�7� ��#� �#��>� �, , � , �>� #� �#-�7� � �#-�7� �

Page 34: Functional programming using Caml Light Michel Mauny January 1995

� ��������� �

� �l²�5

nCKNMPOwM�SRa��ASRa�M£a�Y¬O ])Y¯K\q���QbSROw]�Y'O xA]�Ow]«MPORSRW�Z[ORWAS�a��Aq¦]�K\Y'^\T¯��a�Z�]�W�M£ayQ)VªORkAa[K\S0MPW�Z�Z[a�MRMLK\Y¡ORkAaenCKNMP�p^N]�YA`2W�])`2a2HnCKNMPOwM«K\Y�m n¤])SRa+�& �Q% (U�'��'( ���$¬�o]o^sKNMPO¡Z�]�YAYAQbO Z[Q2Y'Ow]�K\Y a[^�a�q«a�Y¬OwMUQ)V xbK���a�SRa�Y'O¯O´T'��a�M©H5jlk'KNMUq¦]�T �Ca]�YAYAQ�TbK�YA`rORQrYAa � monpW�MPa�SwM��'T2a�O%^sKNMPOwMl]�SRa�YAQ2O=]2M_VXWAY�xA]�q�a�Y'Ow]�^:]2MªK\Y¡nCKNMP����M+K\Y�Z[aymonp�ASRQ��bK�x'a�Ml] V6]2Z�Ks^|K\OPTVXQ2S%K�Y'ORSRQAx'W�Z�K\YA`¦YAa � O´T'��a�Ml]�^s^\Q � K\YA`¦O�kAa W�MPa�S�ORQ�x'a[��YAaeq�Q2S�a �ASRa�Z�KNMPa[^\T¯ORkAaexA])Ow]rMPORSRW�Z[ORWAS�a�M#YAa�a�x'a�xv�¬TORkAa0�ASRQb`2Sw]�q� ´Z�VRH#Z�k�]��AORa�S �%$[H

� � � �K&��:�K�!( &K� �����

nCKNMPOwM�]�SRa0a�q«�AO´T«Q2S=YAQ2Ypa�q��AOPT¦MPa��bWAa�Y�Z[a�M�Q�Vªa[^\a�q�a�Y'OwM�H%jlkAa�T ])SRa0�AW'Ks^�O � K�O�k¯O � Q/B��� ��'4�� �� $��*��&�N� �*#$'�, � ���'ORkAa0a�q��AOPT�^sKNMPO 6SRa�]2x.�V�����9$�M,���� �2ORkAa�YAQ2YA¥Xa�q��AOPTr^sKNMPO=Z[Q2Y�MPO�SRW�Z[ORQ2S 6SRa�]2x.���� �� $�$[H�;6O%Ow].&2a�M%]�YUa[^�a�q«a�Y¬O �0]�Y�xU] ^|KNMPO��'�']�Y�x��AW'Ks^NxAM]rYAa � ^sKNMPO � kAQ¬MPa���SwMPO�a[^�a�q«a�Y¬O �&'���O�$_KNM �f]�Y�x¯S�a�MPO/ (������9$�K�M��PH

jlkAarMP��a�Z�KN]�^#MPT'Y¬Ow]�� � � � c�c�c � � �¦�AW'Ks^NxAM0O�kAa�^|KNMPO � kAQ¬MPa0a[^\a�q�a�Y'OwM ])SRa�� � B�c�c�cKB � � H;+OlKNM=a��bW'K\��]�^\a�Y'OeORQ� � ��� � ��� c�c�c' �� � ��� � ��$.c�c�c $[H

, a0q¦]�T��AW'Ks^�xv^sKNMPOwM�Q�V!Y¬WAqr��a�S[M��#�� ��� � ��� � � � ��������� � ��7 �-�N �$ !��# � �� 5 � � ��������� � ��7 �-� �<$ � $ � �# (�� �-%�� � ' � �!�� �� % (�� % �� � � ��������� � ��7 �-�N �$ ! $ � $ � �

nCKNMPOwM�Q�V�VXWAY�Z[OPK\Q2Y�M��# (�� � ����� ���# (�� � ������%�� �-% �# '�� � ����� �� ����� � ������ � � * =&= 7 � � ���/��� � �����-" � ��7 ���� � � � � � $ � � � � � $ � � � � � �

u2u

Page 35: Functional programming using Caml Light Michel Mauny January 1995

u�� ������� ����� � �� � ��$

]�Y�x«K\Y�x'a�a�x��C^sKNMPOwM�Q�V�])Y¬T'ORk'K\YA`¦x'a�M+K\SRa�x.H, aeq¦]�T � Q2Y�x'a�S � k�]�O0]�SRarORkAafOPT¬�Ca�M�Q�V ORkAa ^sK�M£O8 ´xA]�O[]%$ Z[Q2Y�MPO�SRW�Z[ORQ2SwM©H jLkAaya�q«�AO´Tv^sK�M£O�K�M0]«^sKNMPO0Q�V]�Y'T¬O�k'K�YA`4 ´M+K\Y�Z[a K�O�k�]2MlYAQUa[^�a�q«a�Y¬O�$��'K\O k�]2MLORk¬W�MLORkAa0OPT¬�CaF ��� $S D�%����J ��&���&UN"AH!jlkAa0^sKNMPO0Z[Q2Y�MPORS�W�Z[ORQ2S ���Ow].&ba�M ])Y¯a[^�a�q«a�Y¬O0]�Y�x¯]f^sKNMPO ´Z[Q2Y'Ow]�K\Y'K\YA`�a[^\a�q�a�Y¬O[M � K\ORk¯O�kAaeMR]�q�a0OPT'��a.$ ]�Y�xUS�a�ORWASRY�M=]rYAa � ^|KNMPO�H J�a�SRa

]�`¬]�K�Y���ORkAa�SRa�KNM=YAQ«O´T'��aeZ[QbY�MPORSw]�K\Y'O=Q2Y¯ORkAa0a[^\a�q�a�Y'OwM�Z[Q2Y�M+KNx'a�SRa�x.H# � � � �����F* � ��7 � � �# $#� �A'),�� % ����1& � *#�� �A'!, ��� ��')( & � %A����� ��� � ��')( � �����F*'� � �R* � ��7 �'� � �F* � ��7 �-� � � � � �, a¦M£a�a�kAa�SRa�ORk�])OeORkAa (�''� �pO´T'��a{K�Mf]�*D'����*#$�� BN'0OPT¬�Ca2H¦jlkAa ��� Z[Q2Y�MPO�SRW�Z[ORQ2S0SRa�Z[a[K\�2a�MfO � Q ])SR`2WAq�a�Y'OwM�MORkAaeMPa�Z[QbY�x¡]�SR`bWAq�a�Y¬O%KNMLK�O[MPa[^sV ]O(�''� �?H

�C � �����%) �#�K�!( * & * I * � ��� �?���$I &K� �������&��%+����*+�#��� I %+�� "E��K��(

, a&¬YAQ � kAQ � ORQo�AW'Ks^Nx ^sKNMPOwM�M � a¦YAQ � MPkAQ � kAQ � ORQpORa�MPOra�q��AOPK\YAa�MRMrQ)V ^sKNMPOwM ´]�^\ORkAQ2WA`2k ORkAaUa��2W�]�^|K\OPT�ASRa�xbKNZ�]�ORaeZ[QbW'^�xU�Ca W�M£a�x«V Q2S%ORk�]�O�$!]�Y�x«a[�EORS[]2Z[Ola[^�a�q«a�Y¬OwM�VXSRQ2q ^|KNMPO[M/ 6a2H `�H_ORkAa���SwMPO%Q2YAa.$wH , a k�]��2a=W�M£a�x��]�ORO�a�SRYA¥Xq¦]�OwZ�k'K\YA`¡Q2Y ��]�K\SwM��_Y¬WAqr�Ca�SwM0Q2Sf��Q'Q�^\a�]�Y ��]�^\WAa�M�H¡jLkAa¦MPT'Y¬Ow]�� Q�V=��]�ORO�a�SRY�Me]�^NMPQvK\Y�Z�^�W�x'a�My^|KNMPO��]�ORO�a�SRY�M�H , a � Ks^|^ M£a�ayO�k�]�O ])Y¬T¡xA]�O[]¦Z[Q2Y�M£ORSRW�Z[ORQ2S0Z�]�Y ]2Z[ORW�]�^|^\To��arW�MPa�xvK\Y ]«��]�ORORa�S�Y�H�$ ��Q2S=^sKNMPOwM^�:]�O^\a�]2MPO=O � Q�Z�]2MPa�Mlk�]��2a0O�Q���arZ[Q2Y�M+KNx'a�SRa�x +a�q��AOPT��AYAQ2Y¯a�q��AOPT�$w�# (�� � ' �

���#�(>(�� *#�� � '!, � � �3& � �7�*# � �

�& � �&( �>� �

��7 � � �-�-� � �R* � ��7 �'� � 9--�� � � � � � �# (�� � % ���� �P *#� � '!,���% ��� � & � %# �

�& � ���-''�>� " � �-'!( #-��� � % ������ )/ �

5�� * = � �R* � ��7 ��� � �F* ��� � � � �# (�� ��� ��')( �P *#� � '!,��

� ��� (1& � (# �

�& � ���-''�>� " � �-'!( #-��� � � ��'!(�� )/ �

�-*�� � � �R* � ��7 ��� � �F* � ��7 �-� � � � � �jlkAaUa[�E�AS�a�MRM+K\Q2Y � ��' �7� " � ��')( #-��� � %A���� � ) � Ks^s^ �ASRQAx'W�Z[a ]vSRWAYA¥XOPK\q�aUa�SRSRQ2S � kAa�Y a���]�^\W�]�ORa�x.HD;6Y ORkAax'a[��Y'K\OPK\Q2Y¡Q)V %A����r]��CQ��ba�� � a k�]��2a�ZRkAQ¬M£a�Y¦ORQ V QbSR�'KNx�Ow] &2K\YA`rORkAa�kAa�]2x�Q)V@])Y¦a�q��AOPTr^sKNMPO�H , a Z[QbW'^�x«k�]��2aZ�kAQ¬MPa�Y ���-'!( � ��O�Qya���]�^\W�]�ORafORQ � � �'�AWAO � a0Z�]�YAYAQ2O=S�a�ORWASRY¯]e��]�^\WAa0VXQ2S % ���� � � � K\ORkAQbWAO ZRk�])YA`�K\YA`�ORkAaOPT¬�Ca0Q�V!ORkAa % ����rVXWAY�Z[OPK\Q2Y�H

, a¡MR]�T ORk�]�OrORkAa¯OPT'��a�MO(�' � �²]�Y�x �*,7,7( ]�SRa $��&Q �J#� '�$��!��a�Z�])W�MPa¡ORkAa�T²]�SRa¡x'a[��YAa�x � K\ORk M£a��2a�Sw]�^]�^\ORa�SRY�])OPK\�2a�M��

, ]f^sK�M£O=KNMla[K\ORkAa�S � �UQ2S ��� Q�V c�c�c, ]r��Q'Q�^\a�]�Y¡��]�^\WAa0KNM�a[K�O�kAa�S��7�$#A�eQ2S �&( �7�n?K�M£OwMr]�Y�x ��Q'Q�^\a�]�Y�M�]�S�a¦OPT'�'K�Z�]�^La[��]�q��'^\a�M«Q�V MPWAq�OPT'��a�M�H ¢2WAq OPT'��a�Mr]�SRaUORkAa¯Q2Y'^\T OPT¬�Ca�M � kAQ¬MPa��]�^�WAa�M�YAa�a�x¯S�WAYA¥XOPK\q�aeORa�M£OwM�K�YpQ2Swx'a�S=O�Qy�Caeq¦])OwZRkAa�x«�'T ]rYAQbYA¥X��]�SPKN]��'^\ar��]�ORO�a�SRY zKzH�a2H#]r��]�ORO�a�SRY¦O�k�]�O%K�M

YAQ2O ]«M+K\YA`�^\ae��])SPKN]��'^\a.$wHjLkAa Z�]�SRO�a�M+KN]�Ye�ASRQAx'W�Z[O@K�M_] ��*D O����bO´T'��a 6Q2Y'^\T0Q2YAal]�^\ORa�SRY�]�OPK\�2a.$[H:�!S�QEx'W�Z[O_OPT¬�Ca�M:x'Q�YAQ2O.K\Y'�2Q�^\�2alSRWAYA¥

OPK\q�arORa�MPO[M x'WASPK\YA`¯��]�O�ORa�SRYA¥Xq¦]�O[ZRk'K\YA`��C��a�Z�]�W�M£ayO�kAayOPT'��afQ�V#ORkAa[K\S0��]�^\WAa�MfMPW � Z[a�M�ORQ�K\Y�xbKNZ�]�ORaUMPOw]�OPKNZ�]�^s^\T� k�]�O�ORkAa[K\S MPORSRW�Z[O�WASRa�KNM�H

Page 36: Functional programming using Caml Light Michel Mauny January 1995

� �� � � � � � � ��� � �����6� � ��� u2���� �����! "�#� �$�!�6� �L*+� &K� �2���

, a � Ks^s^#MPa�a�K\Y¡ORk'KNM�MPa�Z[OPK\Q2Y¯ORkAaex'a[��Y'K\OPK\Q2YoQ�V#MPQ2q�a0W�M£a[V W'^�VXWAY�Z[OPK\Q2Y�M�Q��2a�S%^|KNMPO[M�H#jlkAa�MPa V WAY�Z[O£K�QbY�M ]�S�a Q�V`2a�YAa�Sw]�^:K\Y'ORa�SRa�MPOA�.�AWAOr]�SRafYAQ2O0a[�Ek�])W�MPOPK\�2a2Hr¢2Q2q«ayQ)V ORkAa�q ]�S�ae�ASRa�x'a[��YAa�x K\Y ORkAa < ]�qr^!nCK\`2k¬OrMPTAMPORa�q¡H¢2a�ay]�^�M£Q[� �N��Q2S\�iu'���.V QbS QbORkAa�S=a[��]�q��'^\a�M=Q)V:VXWAY�Z[OPK\Q2Y�M�Q��ba�S#^sKNMPOwM©H

<%Q2q��AWAOw]�O£K�QbY¦Q�V!ORkAa�^\a�YA`2ORkpQ�V#]f^sK�M£O��# (�� � ��� (*��� ���.% � *#�� �A'!, � � �.& � �# �

� ��� ( & � �6 (*� ����&% " ( ) � ��� � � � 5 � �F* � ��7 �'� � �!�/����� � � � �# (�� ����.% � �7�$#A� �� ( �7� � � ����������� !

<#Q2Y�Z�])ORa�Y�]�OPK\YA`�O � Qf^|KNMPO[M��# (�� � ��� � � � ��� ���# *#�� � '!, � � � ��( � & � ( �# � " % ��� ( �*) ��( � & � % ��� " � � � ��� � " ( � � ( � )�) � * �&�8� � = � �F* � ��7 � � �F* � ��7 ��� � �F* � ��7 ��� � � � � �

jlkAa � � � � � �{V WAY�Z[O£K�QbY¯KNM ]�^�S�a�]2x'T x'a[��YAa�xvK\YN<l]�qr^9�A]�Y�x¯�CQ2WAY�x¯ORQ«ORkAa�K\Y'�A�¯K�x'a�Y'OPKs��a�S��CH# � �� � ��� � � � � ��������� � ��7 �-�N �$ ! $ � $ � �

8la��2a�S[M+K\YA` ]f^sKNMPO��# (�� � ���P��� ��� *#�� � '!, � � �3& � � �# � % ��� (1& � " ��� � ( ) � � % � � +%��� � �F* � ��7 ��� � �F* � ��7 ����� � � � �# ��� � � �� � � � ��������� � ��7 �-� �<$ ! $ �

jLkAa � � VXWAY�Z[OPK\Q2Yr]��A�'^sK�a�M!]LVXWAY�Z[OPK\Q2YeQ2Ye]�^|^'ORkAa#a[^\a�q�a�Y'OwM@Q�V�] ^|KNMPO6�2]�Y�x0SRa�O�WASRY0ORkAa_^sKNMPO!Q�VAORkAa_V WAY�Z[O£K�QbYSRa�MPW'^\OwM©H ;6Orx'a�q�Q2Y�MPORS[]�ORa�M�VXW'^|^lVXWAY�Z[OPK\Q2Y�]�^sK\OPT XK\OfOw].&2a�M0] V WAY�Z[OPK\Q2Y ]bM0]�SR`2WAq�a�Y'O�$0��^sK�M£Oy�AS�QEZ[a�MRM´K�YA`��#]�Y�x��Q)^�T'q�Q2S��Ak'K�M£q 6YAQbORa0ORkAaeMPk�]�S£K�YA`UQ�V!OPT¬�Ca0��]�SPKN]��'^\a�M���a�O � a�a�Y¡ORkAae])SR`2WAq�a�Y'OwM%Q�V � � K\YvK�O[MlOPT¬�Ca.$wH# (�� � ��� � � �# $#� �A'),�� � �.& � � �# � % ��� (1& � " �% ) ��� " � � ( ) � � * � � � �R*3� � � 9 "'� � �R* � ��7 ��� � � 9 � ��7 ����� � � � �# � � " *#�� � '!, ��%.& � % ��*) � �� �� �� 5 � � ��������� � ��7 �-� ! $ � $ � $ �<$ 0 �# � � (�� ����.% � � �� � � � �� 5 � � !�� � � � � ��������� � ��7 �-� �<$ ! $ .$ � �

Page 37: Functional programming using Caml Light Michel Mauny January 1995

u2� ������� ����� � �� � ��$

jLkAaUV Q�^s^\Q � K\YA` VXWAY�Z[OPK\Q2Y K�MU]p^sKNMPOUK\ORa�Sw]�O�Q2S�H ;6O�O[].&2a�M�]pVXWAY�Z[OPK\Q2Y9Ab�=] ��]2MPa¯a[^\a�q�a�Y'O �²]�Y�x²] ^|KNMPO� E � c�c�c E � �?H$;6O Z[Q2q«�AWAORa�M��

' � (�' � �!A � � E � M�c�c�cDM(E � �%�@A5 wc�c�c' 7A 7A �TE � $ E $oc�c�cZ$7E ��AQbS#K\Y�MPO[]�Y�Z[a�� � kAa�Y¡]��A�'^sK�a�xpORQrORkAaeZ[WAS�SPK\a�x¡]2xAxbK\OPK\Q2YvV WAY�Z[OPK\Q2Y���ORQrORkAa0��]2MPa0a[^\a�q�a�Y'O ���A]�Y�xUORQ�]f^sKNMPO=Q�VY'WAqy�Ca�SwM��'K\O0Z[Q2q��AWAORa�MLORkAaeMPWAq�Q�V#]�^s^:a[^\a�q�a�Y'OwMLK�YpORkAa�^sKNMPO�HljlkAaea[�A�ASRa�MRM+K\Q2Y��

'���(�''� � " � ���) A'�% ) � �!�� �� �� 5 �

a���]�^\W�]�ORa�M�ORQ ] ] F ´h 3 I.$ 3 G*$ 3 u%$ 3 �($ 3 �KzH�a2H!ORQ �5 H

# (�� � ��� ' ��(�''� � � �

# *#�� �A'!, � � �'& � �# � % ��� (1& � ' �

�(�''� � " �6% ) ( �

��� �-� ��7 � � � �F*�� � � 9 � � �R*-"�� � �F*�� � � 9:� ��7 ��� � �R*-� � � � � �# (�� � �-' � � � ' �

�(�''� � � ���) A'% � �

7 � ��� *��+���/� � ��7 �'� � �!�/����� � � � �# �-' � � � �� �� �� 5 � � ����������� ��# '��

�(�''� � " � ���) A'�% � )�� �!�� �� �� 5 � �

����������� ! �

jlkAa2' ��(�''� � V WAY�Z[OPK\Q2Y�K�MvQ2YAaoQ�VeORkAaoq¦]�Y'T � ]�TAM�ORQ K\ORa�Sw]�O�a Q��2a�S¯] ^sKNMPO�Hd�AQ2SUQ2ORkAa�SU^sKNMPO¯K\ORa�S[]�OPK\Q2Y

VXWAY�Z[OPK\Q2Y�M��.MPa�a4� �N�6H

� �!*+�� � ��*7�

0 6�BE���2��D�B � X��� ' � ��'���&' &,� ��'��A�]���&������ ��� �&���!� � �&'N�IU�� BN'�!� � ����* D����� $��$ � *7'N��&*�� $��4��� $S D� �L����*#$$��&���F��&����&,� � ' �A� " � % �� ��� % � ��� � � �� ���� �'� � ) � � " % � �� �*)/ ���� " %'� �� � ) �

� �&' ���&������ ��!U�'N��'*D���')$ �!*���� M7���Q%'%'*�*7 �*\� �\��&'4��*�U���Q%'�� ��� $��$�O� !�� � �&� BN' ���'%$S��Q '%��'��U��� �

0 6�BE���2��D�B � �8 � ' � ��'\� ���&������ �� �&����� � �&'N�FU�� BN'� �T� � $��� *7'N��&*�� $\���' ��� $S D�\����� ���$�$S� Y���� $S�$(�

Page 38: Functional programming using Caml Light Michel Mauny January 1995

� ��������� �

� � ���1� ��� � � � ��� � ��

jlkAa0W�MPa�S%KNM=]�^s^\Q � a�xUORQ�x'a[��YAa0k'K�M:2�kAa�S=Q � Y¯xA]�Ow]fOPT¬�Ca�M�H , K\ORk¯O�k'K�M Vz]2Z�Ks^sK\OPT��AORkAa�SRa�KNMlYAQrYAa�a�xUORQra�Y�Z[QAx'aORkAa xA])Ow]eMPO�SRW�Z[ORWASRa�M�ORk�]�O!qrW�MPO#�Ca qU]�Y'K\�AW'^�])ORa�x��'T�]0�ASRQb`2Sw]�q K\Y'ORQ0^sKNMPOwM ´]2MªK\Y nCKNMP��$!Q2S�K\Y¬ORQr]�SRSw]�TAMj ´]2MK\Y �AQ2SRO�Sw]�Y�$wHl�AWASRO�kAa�SRq�Q2SRa��Ca�]�SP^\T¡x'a�ORa�Z[O£K�QbY Q)V#O´T'��afa�SRSRQ2S[MlKNM�a�Y'VXQ2SwZ[a�x��.M+K\Y�Z[a�W�MPa�SR¥6x'a[��YAa�xoxA]�Ow]«OPT¬�Ca�MSRa ��a�Z[O=�AS�a�Z�K�M£a[^�TpORkAaeYAa�a�xAM�Q�V!ORkAae]�^\`2Q2S£K�O�kAq¦M�H

j%T'��a�M=])SRa0a[K\ORkAa�S��, ��*D O����.OPT'��a�M��, Q2S $S��Q¤OPT¬�Ca�M�H, a k�]��2a0]�^\SRa�]2x'T¯MPa�a�Y¯a[��]�q��'^\a�MlQ�V:�CQ2ORk&2K\Y�xAM�Q�V:OPT'��a�M��_ORkAa��,>,7(�]�Y�x (�' � ��OPT¬�Ca�Ml]�SRaeMPWAqdOPT¬�Ca�M

6ORkAa�TUZ[Q2Y¬O[]�K\Y¦��]�^\WAa�M � K\ORk¯xbK[��a�SRa�Y'O MPk�])��a�Ml]�Y�xU]�SRa0x'a[��YAa�x¯]�Y�xUq¦]�OwZ�kAa�x«W�M+K\YA`{M£a��2a�Sw]�^:]�^\ORa�SRY�])OPK\�2a�M�$wHjlkAa¯Z�]�SRORa�M´K�])Y²�ASRQEx'W�Z[OfKNM�]�Y a[��]�q��'^\a¯Q�V ]v�ASRQEx'W�Z[O«O´T'��a2� � a!&'YAQ � MPOw])OPKNZ�]�^s^�T ORkAa¯MPk�]��Ca¯Q�V ��]�^�WAa�M��a[^\Q2YA`)K�YA`¯O�Q{Z�])SRORa�M+KN]�Yp�ASRQEx'W�Z[O[M�H

;+Y¯ORk'KNM Z�k�]��AORa�S6� � a � Ks^|^!MPa�aekAQ � ORQ�x'a[��YAar]�Y�x¯W�MPa0YAa � OPT¬�Ca�M%K\YN< ])qr^6H

�� � ����� �:�� "� � � �/*+��!S�QEx'W�Z[O�OPT¬�Ca�M=]�SRa � �����'����&YK'��'(O �ASRQEx'W�Z[O[MlQ�V#OPT¬�Ca�M�HljlkAa�T¡]�SRae]r`ba�YAa�Sw]�^sKCB�]�OPK\Q2YoQ�V#Z�]�SRORa�M+KN]�Yp�ASRQAx'W�Z[O�H�_^\a�q�a�Y'OwM�Q�V:�ASRQAx'W�Z[O�O´T'��a�M�]�SRaeZ�]�^s^\a�x *7'��� �*DO $ H�� � �� �@��� "%(6"%3 /#1b* �# #$'&p&��#/����"�Y¦a[��]�q��'^\a2�#MPWA�A�CQ¬MPa � a � ]�Y'O#ORQrx'a[��YAa ]rxA]�O[]eMPORS�W�Z[ORWASRa Z[Q2Y'Ow]�K\Y'K\YA`rK\Y'VXQ2SRq¦]�O£K�QbY ]��CQ2WAO!K\Y�xbK\�bK�x'W�]�^�M©H, aeZ[Q2W'^Nxpx'a[��YAa2�# (�� �������� � " �>�� � � � � � ��� �*# ��� ��� � � �� �!� ''� � ) � � � *�� � 7 � + �!� � ���!�/��:7 � + �!� � �:7 � + �!� � � ��� � *!� � ; ! � ; � ( � ��=#� �/� � ; ���4* + ��7 �]�Y�x«W�MPa0��]�ORO�a�SRYA¥Xq¦]�OwZ�k'K\YA`rORQra[�EORS[]2Z[O ]�Y'T���]�S�OPKNZ[W'^�])SlK\Y'V Q2S�q¦]�OPK\Q2Y¯]���QbWAO O�kAa0��a�SwMPQbY��*��� ��HªjLkAa0�ASRQ2�A¥^\a�q � K\ORk MPW�Z�k W�MR]�`ba�Q�VLZ�])SRORa�M+KN]�Y �AS�QEx'W�Z[O K�MfORk�])Oe]«V WAY�Z[OPK\Q2Y�� �$ 4� � ,. ¡SRa�ORWAS�Y'K�YA`pORkAa�Y�]�q«ar��a[^Nx Q�V]o��]�^\WAa¡SRa��ASRa�M£a�Y¬OPK\YA`²]�Y K\Y�xbK\�2KNx'W�]�^ � Q2W'^Nx²k�]��2a¯O�kAa¡MR]�q�a¯OPT'��a¡]2MrO�kAa¯`2a�YAa�Sw]�^=��S[MPO��ASRQ )´a�Z[OPK\Q2Y VXQ2S�2¥XORWA�'^\a�M ´])Y�x«K�Y�x'a�a�x � QbW'^�xv��arORkAarMR]�q�a�VXWAY�Z[OPK\Q2Y�$wH�jlk'KNM=OPT'��a0KNM�YAQ2O��ASRa�Z�KNMPara�YAQ2WA`2k M+K\Y�Z[afK�O0]�^s^\Q � MVXQ2S=ORkAae]��A�'^sKNZ�]�OPK\Q2YoQ�V_ORkAa0VXWAY�Z[OPK\Q2Y¡O�Q{])Y¬TU�2¥XWA�'^\a��?])Y�x¯YAQ2OlQ2Y'^\T¯ORQ���]�^\WAa�M M£W�ZRko]2M��������H

;+Y�MPORa�]2xUQ)VªW�M+K\YA`¯Z�]�SRORa�M´K�])Y¯�ASRQEx'W�Z[O6� � aex'a[��YAa{] � �)���&, �¡xA]�Ow]fOPT¬�Ca2�u'�

Page 39: Functional programming using Caml Light Michel Mauny January 1995

u2§ ������� ���������$>��� � ��� � � � ��� � � � ��

# � � � � � �)���&, � �# ��� �� �� � � �7� ' ��� �� ��� � '�� � &, � � � �7� ' ��� � ' � � � � �7�A'�� ��� � )/�8� �@�D+ 7 � =�� � ��� ��=80

jlkAa0OPT'��a � �!� �&,���KNM#O�kAa ��*D O����.Q�V�� �7� ' � � ��'�� � ��� �>�A' ����]�Y�x � �>�A' ���.H:jlkAa���a[^NxvY�]�q�a�M%�ASRQ��2KNx'a0OPT'��aK\Y'V QbSRq¦]�OPK\Q2Y¡])Y�x¯]�^NMPQ�x'QEZ[WAq�a�Y'Ow]�O£K�QbY��_K\OlKNM=qrW�Z�k¦a�]2M´K�a�S�ORQ�WAY�x'a�SwMPO[]�Y�x¯xA]�Ow]rMPORS�W�Z[ORWASRa�MlMPW�Z�k¡]2M �*��� �]��CQ��ba0ORk�]�Y¡]�SR�'K\ORS[]�SRT�ORWA�'^\a�M�H

, a=k�]��2a\���&YK'� $H XK6H a2H � �$ 4�(��c�c�c]$_ORQ0SRa[VXa�SlORQeZ[Q2q��CQ2YAa�Y¬O[M#Q)V�O�kAa=�ASRQAx'W�Z[OwM�H#jlkAa�Q2Swx'a�S#Q)V@])�A��a�]�Sw])Y�Z[aQ�VAORkAa#�AS�QEx'W�Z[OwM_Z[Q2q��CQ2YAa�Y'OwM.KNM@YAQ2O�SRa[^\a���]�Y¬O���^N]��Ca[^NM!]�SRa#MPW � Z�K\a�Y'O!ORQ=WAY'K �bWAa[^�TfKNx'a�Y'OPKsV T0ORkAalZ[Q2q��CQ2YAa�Y¬O[M�HjlkAa < ])qr^�MPTAMPORa�q ��Y�xAM=]rZ�]�YAQbY'K�Z�]�^�QbSwx'a�SlQ2YU^N]���a[^NM�ORQeSRa��AS�a�MPa�Y¬O�]�Y�x��AS£K�Y'O=SRa�Z[QbSwx���]�^\WAa�M�HljlkAa QbSwx'a�SKNM ]�^ � ]�TAM#O�kAa0Q2Swx'a�S � k'KNZ�k ]��A�Ca�]�SRa�x K�YpORkAayx'a[��Y'K\OPK\Q2YoQ�V_ORkAaeOPT'��a2H, a0q¦]�T�YAQ � x'a[��YAaeORkAa K\Y�xbK��bKNx'W�]�^ �*��� �v]bM��# (�� �������� � � &, � �����'�$# ��� � � � � '�� � ���� �!�A' � � # � �$ 4� � �>���� � �� ��� � � �� � � � *�� � �@�D+ 7 � ���%* ��� � ��� � *�� ��$ � ��� � ! � $ � -9 � � ( � �#=�� ��� � $ ����� ) � ���4* + ��7 ���jlk'KNM�a[��]�q«�'^�a Ks^|^\W�MPO�Sw]�ORa�M�ORkAa�V6]2Z[O=ORk�]�OlQ2S[x'a�S=Q�V_^�])��a[^NM�KNM=YAQ2OlSRa[^\a���]�Y¬O�H

�� � � � H!&212,.$'&2(6"%3 /#1b* �# #$'&&�¯$A*�4/=*�"�C"�&&�jlkAa�Z�]�YAQ2Y'KNZ�]�^ � ]�TUQ�V#a[�EO�Sw]2Z[OPK\YA`¯�ASRQAx'W�Z[OeZ[Q2q��CQ2YAa�Y¬O[MlKNMV�L����'*�� M7Q%������&���&U2H0�!]�O�ORa�SRYA¥Xq¦]�O[ZRk'K\YA`U�ASRQ2¥�bK�x'a�M0] � ]�TUORQ�q�a�Y'OPK\Q2YpORkAaeMPk�]��CayQ)Vª��]�^\WAa�M0]�Y�xUORQ�`�K\�2a X^\QEZ�]�^ $lY�]�q�a�M�ORQ¦Z[Qbq���Q2YAa�Y'OwM�Q�V!��]�^\WAa�M�H�;+YORkAa V Q�^s^\Q � K\YA`¦a[��]�q��'^\a�� � a0Y�]�q�a��¡ORkAa0Y'WAq�a�SPKNZ�]�^!��]�^\WAa�Z[Q2Y'Ow]�K\YAa�xUK\YpORkAa0��a[^Nx � ����Q�VªO�kAae]�SR`2WAq�a�Y'OA�]�Y�x � aeZ�kAQ¬Q¬M£a0ORQrVXQ2SR`2a�Ol��]�^�WAa�M0Z[QbY¬Ow]�K�YAa�x«K\YpQ2ORkAa�Sl��a[^NxAM 6W�M+K\YA`�O�kAa �

ZRk�]�S[]2Z[ORa�S�$wH# (�� � � ���

�,. �� $#� �A'),��

# ��� ��� � � �� �� �� �� &, � �

� � ' � ���

��1& � � �

* ��� �# � � �8�,+ 7 � � � �����1� � � � � �# � ���

�,. �*���� �

����������� ! �

;6OLK�M�]�^NMPQ��CQ¬MRM+K\�'^\arORQ¦]2Z�Z[a�M�MlORkAa0��]�^�WAarQ�V!]�M+K\YA`�^\af��a[^�x�� � K\ORk¯ORkAa �8 Px'Q2O�$!Q2��a�S[]�ORQ2S��# ������ � � ��� � ����������� ! �# ������ � , � � ��� 7 � + �!� � � � ( � �#=�� ��� �

n�]��Ca[^NM#]�^ � ]�TEM_SRa[VXa�S_ORQ0ORkAalq�Q¬MPO_SRa�Z[a�Y'O!OPT¬�CaLx'a[��Y'K\OPK\Q2Y�� � kAa�YrO � Q�SRa�Z[Q2SwxfOPT'��a�M_��Q'MRMPa�MRM!MPQbq�a Z[Q2q«q�Q2Y^N]���a[^NM��.O�kAa�Y O�kAa�MPa0^N]��Ca[^�M0]�^ � ]�TAMlSRa[VXa�S ORQ«ORkAaeq�Q'MPO=SRa�Z[a�Y'OP^\T x'a[��YAa�xpOPT¬�Ca2H , kAa�Y¡W�M+K\YA`¯q�QAx'W'^\a�M ´MPa�aMPa�Z[OPK\Q2Y¯I2IbH G%$.ORk'KNM_�ASRQ2�'^\a�q ]�S£K�M£a�M@V Q2S_OPT¬�Ca�M!x'a[��YAa�xfK\Y�ORkAa=MR]�q«a q«QEx'W'^\a2H#��Q2S:OPT'��a�M!x'a[��YAa�xfK\Y¦xbK���a�SRa�Y'Oq�QAx'W'^\a�M��'ORkAa=VXW'^s^?Y�]�q«a Q�VC^N]���a[^NM/ XK6H a2H � K\ORkUORkAa=Y�])q�a Q)V?ORkAa�q�QAx'W'^�a�M%�ASRa��Ca�Y�x'a�x�$ xbKNMR]�qr�'K\`2W�]�ORa�MlMPW�Z�kM+K\ORW�]�O£K�QbY�M�H

Page 40: Functional programming using Caml Light Michel Mauny January 1995

��W� P�� � � ����� u2��� � K �f,.12,.4 �A&&��1b(���� �/#12* �% #$'&¯&��#/����;6OLK�M K�q«��Q2SRO[]�Y¬O�ORQr��ae]��'^\aeO�Q{x'a[��YAaf��]�Sw]�q«a�ORa�SPKCB�a�xUOPT¬�Ca�M%K\Y¡Q2Swx'a�SlORQ�x'a[��YAa%U�'��'*����=xA])Ow]�MPORS�W�Z[ORWASRa�M�HjlkAa�(�''� �fO´T'��a%KNM%��]�Sw]�q«a�ORa�SPKCB�a�x��¬]�Y�x{ORk'KNM_KNM!ORkAalSRa�]bMPQ2Y � k'T � alq¦]�Te�AW'Ks^Nx«^sKNMPOwM!Q)V�]�Y'T3&bK\Y�x�Q�V.��]�^\WAa�M�H;XV � a � ]�Y¬O�ORQ¡x'a[��YAa�O�kAa¦Z�]�SRORa�M´K�])Y �AS�QEx'W�Z[Or]2M0]D< ]�qr^#OPT'��a�� � a�YAa�a�xoOPT'��ar��]�Sw])q�a�ORa�SwM��Ca�Z�]�W�MPa � a� ]�Y'O O�Q���ar]��'^\a0ORQ��AW'Ks^Nx Z�])SRORa�M+KN]�Yp�ASRQEx'W�Z[O�Q�V ����J���]�K\S=Q�V!OPT¬�Ca�M�H# � � � � " � � � � � ) � ��' ��� � � � � � �6� ��� � � � � � � )/�8� � *�� + =#� � ��� ��=80# (�� � ' � � �-% �-% � � � ��� � � �>�&, � ��%���% ��� � � � � � + 7 ��� � �F* ; � 9 " � *�� + � � �R*-� � � � � �7 � � � = � � �R* ; � 9 " � *�� + � � � 9 � � � � � �# (�� � � � � ��� � �'�>�*#A� � � � � ���� � � � � � �!�/� ; 9&-�� " � *�� + � ����7 �-�-� $ ( � = ��� +���� �# ' � � � " � )/ � �������������

, ]�S�Y'K�YA`C�!ORkAa � �-' �¦OPT'��a�KNM�M+K\qrKs^�])S ORQ«ORkAa < ]�qr^:Z�]�S�ORa�M+KN]�Y¡�AS�QEx'W�Z[O � �A�AWAOlK\O�KNM=]�xbK���a�SRa�Y¬O�OPT¬�Ca2H# � � � � � ����������� ��� ��� ������ 7 � � $-$� '65 ��7 � � �4+%� 7&7 � � 5 *�7�� )��8� � ���/� ; 9-&�� " � *�� +�;9�� �-��7 � 7 ��=?> ��� 5 � )��@� �F* � � 980

"0Z[ORW�]�^s^\T��E])Y¬TfO � Q�OPT¬�Ca x'a[��Y'K\OPK\Q2Y�M%�ASRQEx'W�Z[a0xbK���a�SRa�Y¬O%OPT¬�Ca�M�H ;XV � a=a�Y'ORa�S#]�`']�K\Y�ORkAal�ASRa��bK�QbW�M x'a[��Y'K\OPK\Q2Y��# � � � � " � � � � � ) � ��' ��� � � � � � �6� ��� � � � � � � )/�8� � *�� + =#� � ��� ��=80

� aeZ�]�YAYAQ2O ])Y¬T«^\Q2YA`2a�S=a[�AORSw]2Z[O�ORkAa � � �¯Z[Q2q���QbYAa�Y¬O=Q)V %.�# � � � � � � � ����������� ��� ��� ���� � 0 ��7 �%$&$��'65 ��7 � � �4+%� 7&7 � � 5 *�7�� )��8� � ���/� ; 9-&�� " � *�� +�;9�� �-��7 � 7 ��=?> ��� 5 � )��@� � �R* ; � 9 " � *�� + 0

M+K\Y�Z[a0ORkAal^N]��Ca[^ � � �rSRa[V a�S[M#O�QeORkAa\������'N*!OPT¬�Ca � �-' �rORk�]�O � a x'a[��YAa�x�� � k'Ks^�a � > M�O´T'��aLK�M%ORkAa �� �*(Q%'N* � ��' �?H

��C ����I � � �/*7�">$S��Q5OPT'��alKNM%ORkAa � �����']���&YK'��'�O=xbKNMU)´Q)K�Y'OlWAY'K\Q2Y¯Q�V:MPa��2a�Sw]�^�O´T'��a�M©H�"5MPWAqdO´T'��a�x'a[��Y'K�O£K�QbY¡x'a[��YAa�M=]0OPT'��a]2Ml�Ca[K\YA`¦ORkAafWAY'K\Q2Y¡Q�V#MPQ2q«a Q2O�kAa�S=OPT¬�Ca�M�H

Page 41: Functional programming using Caml Light Michel Mauny January 1995

�¬h ������� ���������$>��� � ��� � � � ��� � � � ��

�� ��� �� �@��� "%(6"%3P�� #4 &��#/�����_��]�q��'^\a2� � a � ]�Y'OlORQ�k�]��2ae]rOPT'��aeZ�]�^s^\a�x ' �*��� �A' A' � � '!, � � kAQ'MPa0��]�^\WAa�M�Z�]�Y¡�Ca2�

, a[K�O�kAa�S MPO�SPK\YA`¬M/ 6Y�]�q«a0Q�Vª]�YUK\Y�xbK\�2KNx'W�]�^>$0�, Q2S%K�Y'ORa�`2a�S[M+ 6a�Y�Z[QAxbK\YA`¦Q)V�MPQAZ�KN]�^ªMPa�Z[WAS£K�OPT¯Y'WAqr��a�S ]2M�]r��]�K\S=Q�V_K\Y¬ORa�`ba�SwM�$wH

, arORkAa�YoYAa�a�xo]UOPT¬�Ca{Z[QbY¬Ow]�K�Y'K\YA`XYK ����' ��� � ' ���¡])Y�x Z�k�]�Sw]bZ[ORa�S M£ORSPK\YA`¬M�H , ay]�^NMPQ � ]�Y'O O�Q¦�ASRa�M£a�SR�2aMPOw])OPKNZ�OPT'��a�¥6Z�kAa�Z]&bK\YA`�� � a¦O�k¬W�M � ]�Y'O0ORQo��a¯]��'^\a¯ORQ xbKNMPOPK\YA`2W'KNMPk ��]�K\SwM V S�Q2q Z�k�]�Sw]2Z[O�a�SyMPORS£K�YA`'Mea��ba�Y KsVORkAa�T¯]�SRa�K\Y.)Pa�Z[ORa�xvK�YpQ2Swx'a�S=O�QeVXQ2SRq ]yM´K�YA`)^�arOPT'��a2H

J�a�SRa�KNM � k�]�O � a � QbW'^�xpx'Q��# � � � � ' ��� � � ' ''� �A'),���� � �� ��P,. � �>�A'�� �# � � � ,. '�� � � ' ��� � )/�8� � =�� �/��� � �#��*���� � =#� � �!� ��=80

jlkAapO´T'��a ' �*� ���A' A''�� � '!,�� KNM�ORkAav^N]���a[^\a�x5xbKNMU)PQ�K\Y¬O¯WAY'K\Q2Y�Q�V � �>�A'�� �²]�Y�x '�� � � '�� �.H jlkAav^N]���a[^NM� �$ 4� ])Y�x � � ]�SRa���� ��'(�N��� �� $�H jlkAa�T SRa�MP�Ca�Z[OPK\�2a[^\T²K\Y.)´a�Z[O ' ��� � ' ���²]�Y�x�� �>�A' ���oK\Y'ORQ²] M´K�YA`)^�aoOPT'��a' ��� ���A' ''�� �A'),���H

n�a�O=W�MlW�MPafORkAa�MPa�K\Y.)´a�Z[O£K�QbY�M�K�YpQ2Swx'a�S=O�Qy�AW'Ks^NxoYAa � ��]�^\WAa�M��# (�� � ' � � � � �� 4� � 7���� � � � = �+� =#� �/��� � ����*���� � � 4* ��� ��� � *�� �# (�� � ' � � � � � " � ! �� � � � � � ���� �� 5 )/ � � = ! �+� =#� �/��� � ����*���� � � (&( � $0�� � � ! ; ! � � � �#"� ]�^\WAa�M ' � � ])Y�x ' � � �Ca[^\Q2YA`¦O�Q�ORkAaeMR]�q«a0O´T'��a2H%jlkAa�T¦qU]�T«VXQ2Sla[��]�q«�'^�af��af�AWAO=K\Y'ORQr^sKNMPOwM�]2M%K\Y��# � ' � �� ' � � � � ����� =#� ����� � ����*���� � � ��7 ���� 4* ��� � � � *�� � $ (-( � *0�� � � ! ; ! � � � ��" �

;+Y.)´a�Z[O£K�QbY�M¯q¦]�T²��Q'MRMPa�MRMUQ2YAa ]�S�`2WAq�a�Y'O ´]bMrK\Y5ORkAaoa[��]�q��'^\a ]���Q��2a.$��=Q2SUYAQ2YAa2H jlkAap^N]�ORO�a�S¡Z�]2MPaZ[Q2SRS�a�MP��Q2Y�xAM � ORQ['���&Q%'N*7���'(OT�JK�L'�$��A]2M%K\Y �!]bMRZ�]�^6H�"�Y¯a[��]�q«�'^�afQ�V!a�Y¬WAq�a�S[]�ORa�xUOPT¬�Ca0KNM��# � � � ����# ' ��� �����!���# ��� ' �� ,�� �# � � ( # �# � � � ����� � )/�8� 7 � ��� =#� � ��� ��=80# � ( # � � ��� 7 � ����� � �-��9

jlkAafO´T'��a �#�' � Z[Q2Y'Ow]�K\Y�M�Q2Y'^\T¡�¦xbKNMPO£K�Y�Z[O0a[^\a�q�a�Y'OwM�H�n.a�O�W�M Z[Q2Y'OPK\Y'WAaeORk'KNM�a[��]�q��'^\ae�'T¡x'a[��Y'K\YA`¡]�OPT'��aVXQ2S Z�]�SwxAM©H<>_eN+C�DFEHG �.TVO�?�J�'�JL?A@'KL@;TVS;NAMjTVE h�GZTVf>TVJHM�KXUA@'K�M�N+Q0DYGWRA@'SbMFW�SXRAE�JTV�h.@'S'n

Page 42: Functional programming using Caml Light Michel Mauny January 1995

��W� ��� � � ����� ��I

# � � � ���)� ��� � >� ,. �#�' �# ��� '�� � ,. ���#�'��# ��� # �7��� ,. ��# ' �# � �� % ,. ���#�'��# � �( ��'�� ,. ��# ' � � '�� � � )/�8� ��* +�= =#� � ��� ��=80jlkAa0OPT'��a �!� �fKNM�ORkAaexbKNMU)PQ�K\Y¬O�WAY'K\Q2Y¡Q�VR�

, �#�'��«WAY�x'a�S ORkAa�K\Y.)Pa�Z[OPK\Q2Y � 7�(�, �#�'��«WAY�x'a�S ORkAa�K\Y.)Pa�Z[OPK\Q2Y � ' � � �, �#�'��«WAY�x'a�S ORkAa�K\Y.)Pa�Z[OPK\Q2Y � #A�7�����, �#�'��«WAY�x'a�S ORkAa�K\Y.)Pa�Z[OPK\Q2Y �� % �, ORkAa0�ASRQAx'W�Z[O Q�V�'�� � ])Y�x �#�'��UWAY�x'a�S�ORkAa�K\Y.)´a�Z[OPK\Q2Y �( ��' ��H

n.a�O=W�M��AW'Ks^Nx ]y^|KNMPO�Q�V#Z�]�SwxAM��# (�� � ' �$#������

�,. � � � 7� �� '�� � �� #A�>� � �� % ��

# ��� � �$ � (7(��)� � �

�,& �

# � � " $#� �A'),�� � & � �( ��' � " � � )�) � � � � � ��� � � � �%� +%� 7 �� � � 7 � ���'� � ��* +�= � ��7 ����� � � � �7 � * �&��� ��* +�= 7 �# � � 7 � ����� � ��* +.= � ��7 �-� � � � � �# ' �$#������

�,. ����)�� �

��� ��* +.=:� ��7 �-� �%� � � � * + �4$����!� � � � * + �%$�� ���-� �� � * + �4$ �-*#� � � * + � �# �$ � (7(

��)� � �

�,& � � ����� �

��� ��* +.=:� ��7 �-� � � *���� � (D� * =#�.; �/"%$ � � *��!� � (,� * =��.; �"%$ � � *��!� � (,� * =��.; �-"%$ � � *���� � (,� * =��.; � " �

�� ��� � � H!&212,.$'&2(6"%3P�� #4 $A*�4/=*�"�C"�&&�:lV Z[Q2WAS[MPa��_��]�ORORa�SRYA¥XqU]�OwZ�k'K�YA`vKNMeW�M£a�x ORQpa[�EO�Sw]2Z[OeMPWAq Z[Q2q��CQ2YAa�Y'OwM�H ;6Y²Z�]2MPaUQ�V MPWAq OPT'��a�M��_��]�O�ORa�SRYA¥q¦]�O[ZRk'K\YA`¡W�M£a�Myx'T'Y�]�qrKNZ«ORa�MPOwM�VXQ2SfORk'KNM0a[�AORSw]2Z[OPK\Q2Y�H¯jlkAa«YAa[�EOfa[��]�q«�'^�a¯x'a[��YAa�M�]«VXWAY�Z[OPK\Q2Y� ,7(>,.�oSRa�¥ORWASRY'K\YA`UORkAa0Y�]�q�a0Q)VªORkAaeZ[Q)^�QbS Q�V_ORkAayMPW'K\O ])SR`2WAq�a�Y'O��# (�� � ,7(>,.��� *#�� �A'!, � � ' �� ,�� ��& � � �������# � �����!���3& � � �������# �

�& � � ��( � % � �

� ���/+ � 7 � ����� � 7 � + �!� � � � � � � �n.a�O=W�M�Z[Q2WAY'O=ORkAa0��]�^\WAa�M=Q�V#Z�]�SwxAM ´]2MRMPWAq«a � ae])SRa0�'^N]�TbK\YA` ��a[^\Q2ORa"%$[�# (�� � , #�� ���>�*# � � *#�� � '!, �# � 7�

�& � ���

# ��� ' ����

& � �

Page 43: Functional programming using Caml Light Michel Mauny January 1995

�¬G ������� �������� �$>��� � ��� � � � ��� � � � ��

# � � #A�>� ��

& � # � �� % & � ' ���7�$# � �.%A��� � � � ( �7� �# � -( �-' � " � � � ) & � � �# � -( �-' � " � ) & � ' ���7�$# � �.%A��� � � � ( �7� �# �

�& � � �

� �� ����� 7 � ����� � ��* +.= � � �����-� � � � � �

�� ��� K � �C$A #1&��(�� �o&��#/����¢2Q2q�a�O´T'��a�M_�CQ¬MRMPa�M�M#]�Y�]�ORWAS[]�^s^�TrSRa�Z[WAS[M+K\�2a MPORS�W�Z[ORWASRa���^sKNMPOwM^��VXQ2S!a[��])q��'^\a2H�;6O_KNM#]�^�M£QeORkAa=Z�]2MPaLV Q2S!O�SRa�a�¥�^sK &baMPORS�W�Z[ORWASRa�M���M´K�Y�Z[afORSRa�a�Mlk�]��2aeM£WA�AORSRa�a�MlORk�])O ]�SRa�ORSRa�a�MlO�kAa�q¦MPa[^\�2a�M�H

n�a�O W�M�x'a[��YAay]«OPT¬�Ca0VXQ2S ]���MPO�Sw]2Z[O MPT'Y'Ow]��¯ORSRa�a�MlQ�V ]«M+K\q��'^\a{])SPK\ORkAq�a�OPKNZ ^N]�YA`2W�]�`2a H "�Y ]�SPK\ORkAq«a�OPKNZa[�A�ASRa�MRM+K\Q2Y � Ks^|^��Ca#a[K\ORkAa�S!]=Y'WAq�a�SPKNZ%Z[Q2Y�MPOw]�Y'OA��QbSª]l��]�SPKN]��'^\a���Q2S_ORkAa#]2xAxbK\OPK\Q2Y���qrW'^\OPK\�'^sK�Z�])OPK\Q2Y��AxbK[��a�SRa�Y�Z[a��Q2S xbK\�bKNM+K\Q2YoQ�VªO � Qea[�A�ASRa�MRM´K�QbY�M�H# � � � ���!� ' �.%

�� % � ��� � , � � � ,& ' ���

# ��� �)� ,& � �>�A'�� �# � �( # � ,. �)�� �# ��� #*('� ,. �)�� �# ��� '���# � ,& �!�����# � � '�� ,& �!�����# ��� � �)�� ��� ��� ��� � � �!� ' �&% � � % � � �� �� � � �!�A'��.% � � % � ��� � )/�8� * + ��� 5���� � �%+ =#� � �!� ��=80 )/�8� * +�� 7 =#� � ��� ��=80

jlkAa=O � Q0OPT¬�Ca�M��)�A' �&% � � % � �r]�Y�x �!����� ]�S�a M+K\qrW'^�O[]�YAa�Q2W�M+^\T¦x'a[��YAa�x��A]�Y�x �!�A'��.% � � % � �0KNM!S�a�Z[WASwM+K\�2a0M+K\Y�Z[aK\OwM=x'a[��Y'K\OPK\Q2YoSRa[VXa�SwMlORQ �)�� � � k'KNZRkvK�O[MPa[^sV#SRa[V a�S[MlORQ �)�A' �&% � � % � �.H " M=])Y¯a[��]�q«�'^�a��CQ2YAaeZ[Q2W'^NxvSRa��ASRa�MPa�Y'OORkAae]���M£ORSw]2Z[O=MPT'Y¬O[]�� O�SRa�a0Q�V!ORkAae]�SPK\ORkAq�a�O£K�Z a[�E�AS�a�MRM+K\Q2Y % " � � ) "r]2M%ORkAaO< ])qr^���]�^\WAa2�# -( # � ��� �� � � � �!� �!% � # � �� � � � #�( � ��� �� � � � ,�� � � � �� � � � �!� � � � ��� � ��� * + ��� 5���� � �4+ �� �-� 7� � +�� ����* + �R� ��$ � +�� ! � �.�-� � � � +�� �� � �47 ���<$�� +�� ! ���* + � ) � ���

jLkAaeSRa�Z[WASwM´K��ba{x'a[��Y'K\OPK\Q2Y Q�V#OPT¬�Ca�M�q¦]�T�^\a�]2xoO�Q�OPT¬�Ca�M0MPW�ZRkpORk�]�O�K\O�K�M�k�]�SwxpQ2S�K\q���Q'MRM+K\�'^\a�ORQU�AW'K|^Nx��]�^�WAa�M�Q�V!ORkAa�MPafO´T'��a�M©Hª��Q2S=a[��]�q��'^\a2�# � � � ��� �$# � ' ��� ��� � %� � � �*# � ' � � � )/�8� 7 � �6� � =?=�� � ��� ��=80

�_^\a�q�a�Y'OwM�Q�V:ORk'KNM�OPT¬�Cae]�SRa4��� � �����'=xA])Ow]rMPORSRW�Z[ORWAS�a�M�H#�#M�MPa�Y¬O£K�]�^|^\T��CORkAa0Q2Y'^\T � ]�T�ORQ¦Z[Q2Y�M£ORSRW�Z[O=Q2YAa�KNM��# (�� � ��� � �$# � ' � � ��� ( #A� � ��� � %��� � �*# � ' � � ��� ( # ��� � 7 � �N� � = �#� * �-��� � 7 � �N� � = ��� � � �-��]IKV�N�J9DZY+JLKL@g@'SHDFKL@HS9DYTWU JLMR\.@ P�3U � Q PNO��.\#@'f]DZRASL@RJL?6@4V+DFKL@ h^TV@'fg@'SXMFW@P�3U � QTPNO���U ����� PRK;f'M�N�JLK9D]SLJUTVN6OLQ�TVJL? OLS���ORQTI�� I U������ PRK

Q�?^TVf9?/TVS�JL?6@ B SLJLKUTVNAO�P W M0KLE�MFW�hAKLM�O0K9DFE S � DFN#DYGWV��9TVN6O�� h#DFKLSUTVNAO��;f'M0N6fgKL@'JL@XSXV�N�J9DZY R6SXR#DYGZGWV3h6KLMKU?RAf'@'SXD]\6SLJLK9D]f'J;SXV�N�J9D8Y.n

Page 44: Functional programming using Caml Light Michel Mauny January 1995

��W� P�� � � ����� �¬u

�� � � �-��� � � �-��� � � �-�� � � �-��� � � ���� � � �-�� � � � �� � � �-�� � � ���� � � �-��� � � �-�� � � � � �� � � �-�� � � �-�� � � �-� 0 ����� ��� ����� ���

��� ��� ���

8La�Z[WASwM+K\�2a¡OPT'��a¡x'a[��Y'K\OPK\Q2Y�M¯MPkAQbW'^�x ��a '���WM �S ��&��O�'(O XK6H a2H²�CQ¬MRMPa�M�M�]oYAQ2YA¥XSRa�Z[WAS[M+K\�2a Z�]2M£a��#Q2S Y#� $�'��� $S'^$_K�YpQ2Swx'a�S=O�Q � Q2S]& � a[^s^ � K\ORkoZ�]�^s^�¥X�'T'¥X��]�^\WAa2H�� ��� � �f,.12,.4 �A&&��1b(���� � �� %4 &��#/����¢2WAq OPT'��a�M�q¦]�Ty]�^NMPQf��a���]�Sw]�q�a�O�a�SPKCB�a�x.HªJ�a�SRalKNM%ORkAa=x'a[��Y'K\OPK\Q2Y¯Q�V:]�OPT¬�CalKNMPQ2q�QbSR�Ak'KNZ=ORQ0O�kAa�(�''� �eOPT¬�Ca2�# � � � � �6� �7��� # � � >� ��� � � �# � ����� # � � 7�P,& �� � � �6� �7��� # � � >� � )/�8� 7 � � ��� ��� � =#� � ��� ��=80

" q�Q2S�aeMPQ2�Ak'KNMPOPKNZ�]�ORa�xva[��])q��'^\a0KNM=O�kAa0O´T'��a0Q)Vª`2a�YAa�S£K�Z �'K\Y�]�SRT¯ORSRa�a�M©�# � � � � " � � � � � ) ���7���7� �������! ,& � �# � A�>���>�P,. " � � � � � ) ��,����# ��� � " �6� � � � ) ��,��*� � ��� ��� �6� # �7,�� � � " �6� � � � ) � �>���>� # �7,�� � � " �6� � � � ) � �>���>��� � )/�8� 9 � +4�-� =#� � �!� ��=80 )/�8� � -=#� =#� � ��� ��=80

"d�'K\Y�]�SRT ORS�a�arKNMea[K\ORkAa�Sr]U^\a�]�V3 +kAQ�^NxbK�YA`o��]�^\WAa�MeQ)VLOPT'��a � ��$ Q2Se]vYAQEx'a¯Z[Q2q��CQ¬MPa�x Q�VL]�Y Q2��a�Sw])ORQ2S8 +Q�VOPT¬�Ca � �%$ ]�Y�xUO � Q�MPQ2Y�M�����Q2ORk¯Q)VªORkAa�q ��a[K\YA`¦�'K\Y�]�S�T¯ORSRa�a�M�H

 �K\Y�]�SRT¯O�SRa�a�M Z�])Y ]�^NMPQU��afW�MPa�xpORQ�SRa��ASRa�M£a�Y¬O0]���MPORS[]2Z[O=ORSRa�a�MLVXQ2S ]�SPK\ORkAq«a�OPKNZea[�A�ASRa�MRM´K�QbY�M+ � K�O�k¡Q2Y'^\T�'K\Y�]�SRTrQ2�Ca�Sw]�ORQ2S[M!]�Y�xrQ2Y'^\TrQ2YAaR&bK\Y�x�Q�V.^\a�]��2a�M�$wH_jlkAa ]���M£ORSw]2Z[O#MPT'Y'Ow]��yO�SRa�a �eQ)V ��� "�Z[Q2W'^Nx«��a0x'a[��YAa�x]2M��# (�� ��� �:A�>���>� ��� � � � � �7, � � � �����! �� �7, � � � �����! � � � � � � 7 � + ��� � ; �����-" 9 � +%�&� ����� +%�&� ��� � � �6� ��$ (. �� �� � * � �$ (� � ! � � * �:! �

�@K\Y�]�^s^\T���K\OUKNMUOPK\q�a ORQ YAQ2OPKNZ[a O�k�]�O¦��])ORORa�SRYA¥Xq¦])OwZRk'K\YA` KNMUYAQ2O¯SRa�M£ORSPKNZ[ORa�x ORQ V WAY�Z[OPK\Q2Y��QAxbK�a�M^��K6H a2HZ[Q2Y�MPO�SRW�Z[OwM=MPW�Z�k¡]2M��

$#� �A'),�� � � & � � �� c�c�c� � � & � � �

Page 45: Functional programming using Caml Light Michel Mauny January 1995

�2� ������� ���������$>��� � ��� � � � ��� � � � ��

�AWAO=ORkAa�S�a0KNM=]�^NMPQ¦]«Z[Q2Y�MPORSRW�Z[O�x'a�xbK�Z�])ORa�xpORQr��]�ORORa�SRYA¥XqU]�OwZ�k'K�YA`«Q�V�]bZ[ORW�]�^���]�^\WAa�M�� � � % � # ' �&% � � & � � �

� c�c�c� � � & � � �

� k'KNZ�k¯q¦]�OwZ�kAa�M%ORkAa ��]�^\WAaeQ�V�ORkAa0a[�A�ASRa�MRM´K�QbY � ]�`¬]�K\Y�MPOla�]2Z�k¦Q)V:ORkAa���]�ORORa�SRY�M � � �AMPa[^\a�Z[OPK\YA`UORkAa���SwMPOlQ2YAaORk�]�O�q¦]�OwZ�kAa�M��A]�Y�xU`�K\�bK�YA`¡Z[QbY¬ORS�Q�^?ORQ«ORkAaeZ[Q2SRSRa�M£��Q2Y�xbK\YA`¯a[�A�ASRa�MRM+K\Q2Y�Hl�AQ2Sla[��]�q��'^\a�� � aeZ�])Y¯q¦]�OwZ�k¯ORkAaORSRa�a �U�ASRa��bK\Q2W�M+^\T x'a[��YAa�xv�¬T.�# � � % � #A'��.%�A��7���7� ��� � �*% �7, � � � � �7,�� � � � �1& � %# � ����) (3& � � � , , � �!��� ��,&� � � ��� 7 � + �!� � � �N� �

�� ��� �� � ,�&2, $A*�"��&212 #$'&2*�1.�¡,."����R #"%$'&2(6*�" �:=YAarq¦]�T ]bM'&?�� , k�]�OlKNM�ORkAarxbK���a�S�a�Y�Z[ay�Ca�O � a�a�Y ]UMPWAqgxA]�Ow]�Z[Q2Y�M£ORSRW�Z[ORQ2S�]�Y�xo]fV WAY�Z[O£K�QbY S"AH "=Ol��S[MPOM+K\`2k'OA��ORkAa�T�^\Q¬Q�&0�ba�SRTeM+K\qrKs^N]�S�H , al]2MRM+K\qrKs^N]�ORalZ[Q2Y�MPOw])Y¬O:xA])Ow] Z[QbY�MPORSRW�Z[ORQbSwM; ´MPW�Z�ky]bM ����!����$�ORQ Z[QbY�MPOw]�Y'OwM�H¢�K\qrKs^N]�SP^\T��CK\YN< ]�q{^@n?K�`bk¬OA�.MPWAq xA])Ow]rZ[Q2Y�MPORSRW�Z[O�Q2SwM � K\ORk¡])SR`2WAq�a�Y'OwM=]�^NMPQ«��Q¬MRM£a�MRM=]fVXWAY�Z[OPK\Q2Y�]�^:OPT'��a2�#�� 7� � ��� 7 � ���'� � ��* +�= ��� � � � �J�Q � a��2a�S6��] xA])Ow]=Z[Q2Y�MPO�SRW�Z[ORQ2S_��Q¬M�MPa�MRMPa�M@��]�SROPKNZ[W'^N]�S_�ASRQ2�Ca�SROPK\a�M_ORk�]�O:]�`2a�YAa�Sw]�^¬VXWAY�Z[OPK\Q2Yyx'Q'a�M_YAQ2O��CQ¬MRMPa�M�M��]�Y�x K�O�KNMlK\Y'ORa�SRa�MPO£K�YA`UORQ�WAY�x'a�S[MPOw]�Y�xvORkAa�MPayxbK���a�SRa�Y�Z[a�M�H��ASRQbq�ORkAa0q¦]�O�kAa�q¦]�OPKNZ�]�^:�CQ�K\Y¬O�Q�V#�bK\a � �?]«MPWAqxA]�Ow]UZ[Q2Y�MPO�SRW�Z[ORQ2S�KNM/&¬YAQ � YpORQ¦�Ca�]�Y���� �S'����� �� � k'K|^\a¦]+< ]�q{^:VXWAY�Z[OPK\Q2YpKNM0]U`2a�YAa�Sw]�^_V WAY�Z[O£K�QbY � K�O�kAQ2WAOVXWASRORkAa�SlK\Y'VXQ2SRq¦]�O£K�QbY�H" q¦]�ORkAa�qU]�OPKNZ�]�^�K\Y.)Pa�Z[OPK\Q2Y�Ao�&6 .?:d]2x'qrK\OwM�]�YUK\Y¬�ba�SwMPa0VXWAY�Z[OPK\Q2Y A���� V SRQbqdK\OwMK\q¦]�`2a\A 76 $� :¤ORQI6fH

��SRQ2qdORkAa0a[��]�q��'^\a�M�]���Q��2a��'KsV � aeZ[Q2Y�M+KNx'a�S O�kAa � '�� �¦Z[Q2Y�MPO�SRW�Z[ORQ2SA�'ORkAa�Y��# (�� ��% ' ��� � � ' ��� � ��!� � � 7 � ����� � ��* +.= � � � � � �%A'�� ��KNMlO�kAae`2a�YAa�Sw]�^?VXWAY�Z[OPK\Q2Yo]2MRMPQAZ�KN]�ORa�x¯O�QyO�kAa � '�� �¦Z[Q2Y�MPO�SRW�Z[ORQ2SA�A]�Y�x.�# $#� �A'),�� � ' ��� �& � � � ����������� ��� ��� ������ � ���*��� � �(��� � ��� � ��$-$��'&'-'&'-'-'&'-'&'-'-'&'-'&'-'-'&'-'&'-'� * + ����� � ��� 5 ��7 � *��#� 5 �!� � ��7 � � � � 5 * � 7 ��� ����0��� ��* +.= � � 7 � ������� � � � �KNM=O�kAa�K�Y'�2a�SwM£a0VXWAY�Z[OPK\Q2Y¯VXQ2S % ' � �?H�;+OlKNM=]r��]�S�OPKN]�^�VXWAY�Z[OPK\Q2Y��?M´K�Y�Z[af��]�ORORa�S�YA¥Xq¦]�OwZ�k'K\YA`�q¦]�TrV6]�Ks^zH�� ��� � �@��3��C"��1b,�&&� $A,A�!���� �����" �� %4 �¦4 ���A&¯/#1b* �# #$'&&�, k�]�OlKNMlORkAarMPOw]�O�W�M#Q)V�]�M£WAq�OPT¬�Ca � K\ORk ]rM+K\YA`�^\a�Z�]2MPaeMPW�Z�k ]bM��# � � � ��&, #� ���!� � � � , #�� ���!� ,& ' ��� � )/�8� � �� �/� �,+ =#� � ��� ��=80

Page 46: Functional programming using Caml Light Michel Mauny January 1995

���� P�� � � ��� � �¬�

:lV#Z[Q2WASwMPa��AO�kAaeOPT¬�Ca , #�����)� � KNM%KNMPQ2q«Q2SR�Ak'KNZfORQ '�� �?H%jlkAa�K\Y.)´a�Z[OPK\Q2Y *#�� � '!, �-%.& � � , #�����)�-%«KNM=]� �����bVXWAY�Z[OPK\Q2Y¯VXSRQ2q '�� �¦O�Q &, #�� ���!� � H ;6OLK�M�ORk'W�M=][Y)� ��'(�N��� ���H

"�YAQ2ORkAa�S � ]�T�O�Q{x'a[��YAa�]rOPT'��a�KNMPQ2q«Q2SR�Ak'KNZ0ORQD'�� � � Q2W'^Nx¯�Ca2�# � � � ��&, #� ���!� � � � � , #�����!� � '�� ��� � )/�8� � �� �/� �,+ ! =#� � ��� ��=80

jlkAaUOPT¬�Ca�M &, #�����!� � ]�Y�x &, #�����!� � ]�SRa{K�M£Q2q�Q2SR�Ak'KNZ«ORQ ' � �?HUjlkAa�T ]�SRaU]�O0ORkAa¯MR]�q�a�O£K�q«a¦MPWAq ]�Y�x�ASRQAx'W�Z[O OPT'��a�M�H!jlkAa[K\S���]�ORORa�S�YA¥Xq¦]�OwZ�k'K\YA`¦x'Q¬a�M�YAQ2O=�Ca�SPVXQ2SRq ]�Y'T�SRWAYA¥XO£K�q«aeORa�MPO�H

jLkAae��Q'MRM+K\�'Ks^|K\OPT Q�V#x'a[��Y'K\YA` ]�S��'K�O�Sw]�SRT¡Z[Q2q«�'^�a[� xA]�Ow]«OPT¬�Ca�M=�Ca�SRqrK\OwM�ORkAafa�]2MPT¯q¦]�Y'K\�AW'^N]�OPK\Q2Y Q�V ]��A¥MPORS[]2Z[O=MPT¬Y'Ow]��UORSRa�a�M�K\YN< ]�q{^ PMPW�ZRk¯]2MlO�kAa �)�A'��.%

�� % � �rOPT¬�Cae]���Q��2a.$wH!jlkAa�M£ae]���MPORSw]bZ[OLM£T¬Y'Ow]��¦O�SRa�a�Ml]�SRaMPWA�A�CQ¬MPa�xoORQUSRa��ASRa�M£a�Y¬O0�ASRQb`2Sw]�q¦M�Q�V ]«^N]�YA`2W�])`2a 6a2H `�H0]«^N]�YA`2W�]�`bayQ)VL]�SPK\ORkAq«a�OPKNZea[�A�ASRa�MRM´K�QbY�M�$wHrjlkAa�MPa

&bK�Y�x Q)V=^N]�YA`2W�]�`2a�M � k'KNZ�k ]�SRa¯x'a[��YAa�x K\Y < ]�qr^=]�SRa¯Z�]�^s^�a�x &Y ��'��TM7������U����U�')$e]�Y�x2<l]�qr^lKNMyM�]�KNx ORQ¡�CaORkAa[K\S%Q 'N��������&U��&�NU�'�H

���� ����I I %)���

, �=a � OPT'��a�M=Z�])Y¯��a0K\Y'ORSRQAx'W�Z[a�xvK�Y@< ]�qr^6H, j#T'��a�MLq¦]�T���a �L��*D��Q%'�'N*(� @�'(O0�'TUO´T'��af��]�S£K�])�'^�a�M©H jlkAaeM£T¬Y'Ow]��¯Q�V!O´T'��a0��])Sw]�q�a�ORa�S[M!KNM��� � �)���� � � ���

� � �����)� �� " � �����!� � � � � �� �!� � � � )

, j#T'��a�M�Z�]�Y¯��aT*7'����*K$S�TB'�H, �!SRQAx'W�Z[O=OPT¬�Ca�M��

0 m ])ORkAa�q¦]�OPKNZ�]�^��ASRQAx'W�Z[O=Q�V#MPa��2a�S[]�^�O´T'��a�M©H0 jlkAaeZ[Q2Y�MPORS�W�Z[OlKNM��

� � � � � � �!� �� � � � �'� �$ 4� � �� � � '.�&(�� � � � � � � � � ���� �

� kAa�SRa0ORkAa � � � � � � Mlq¦]�T¦Z[Q2Y'Ow]�K\Y¯OPT'��ae��]�SPKN]��'^\a�M�]��A��a�]�S£K�YA`«K\Y � � �!���$ � � H, ¢2WAq�OPT¬�Ca�M��

0 m ])ORkAa�q¦]�OPKNZ�]�^:xbKNMU)PQ�K\Y¬O�WAY'K\Q2Y¡Q)V�MPa��ba�Sw]�^�OPT¬�Ca�M�H0 jlkAaeZ[Q2Y�MPORS�W�Z[OlKNM��

� � � � � � �!� �� � � � �'� �$ 4� � �� C�� �*�� � '!,�� � � ,. � � � � � � � � ����

� kAa�SRa0ORkAa � � � � � � Mlq¦]�T¦Z[Q2Y'Ow]�K\Y¯OPT'��ae��]�SPKN]��'^\a�M�]��A��a�]�S£K�YA`«K\Y � � �!���$ � � H

Page 47: Functional programming using Caml Light Michel Mauny January 1995

�¬� ������� ���������$>��� � ��� � � � ��� � � � ��

� �!*+�� � ��*7�

0 6�BE���2��D�Bo­X��� ' � ��'����S�����N��� ��[�� � ����U4� $���*�U���Q%'�� �TY�������*�J%�*7'�'\����O4*D'���*������&U4� �L����*R �\� � $��$������'� *K$� ���' �� ��������� $ ����� S�L'*D��� �*#$\ D�%��&'%�*D'(' � ��&' $S'��( ���O4 ���'%�( ��������� $������ ���$\��'�� B')$��

0 6�BE���2��D�Bo­�8 � ' � ��'4�����&������ �� � � � ���7���7���������� (U� ���$ � ��&'� � � ���&������ �� ������ $��$(� � ��'��S�����N��� �� � � � � �7���7�!$ �� ��&��O!�� � '4� $%��*�U���Q 'N���$% �S�����N��� �� $� X����O � ������O!� Y�������*�J4�*D'�' � �( $ �� ��&��O!*D'���*������' ZY)������*�J[�*D'(' �& $�'[��'�� B')$4��*D'!��&'!*D'�$��&�� D�I�����2� J ���&U W� ��&' ��'(� BN'�$4 D�I���'!�*7'�'!��*�U���Q%'���� ����O �& $�'% ��L'N*D��� �*K$ ��*D'%��&'4*D'�$���� �$� D�\��������J ���&UT��&' �%�S�����N��� �� � !��&'% �� '*D��� �*K$ �\��&'%��*�U���Q 'N����0 6�BE���2��D�Bo­\} � 'I������� $($� �N�����'P� [��&' (�''� �X�JK�L'TO�' ��������� ������X������ ������(��� ���'N*7��� �*%�������']�� ���� ����U ��J�� � '\U�� BN' �V���&������ ������ �����'* ��*D'������ �� � !��&'%O�����!�� �� $��*��&�N� �*#$\ � ��&'�(�' � ���JK�L' �

� '!���&����U�'[���'[��� $�]�� �� $��*��&�N� �*#$ � �W����O ��� *7')$ � '(�N�� BN'��JT����� ����� �� $������ � ����O ���� ��L'N*D��� �*��& ��$�'(O � $[� ��*D' � � ��O�'N���� � '* ) �\����O��&YS$S�*D���N� ����W*D'�$ �L'���� ��&'�$�' � ��L'N*7��� �*#$��4 &Y������������U���&'���� $S���'*D��� �* $S���� $��SJ ���&U��

(�''� � ' ��� � � ��� �(�''� � ' ��� � " E � ��� c�c�c ��� E � ��� � � ) �GE � � " c�c�c�� " E � � � ) c�c�c )

�(�$�� ��Q%� O�' � ������� �� ���� O[YK' �# (�� � ��� (�' � �

�' � � �

# *#�� �A'!, � � �'& � �# � % ��� (1& � �% " (�' � �

�' � � ( ) �

� ��7 � � ��� � � �F*�� � � 9 � � � 9 "�� � � 9 � � �R* � ��7 ��� � � 9 � � � � � �� $R���[' � ��QV����' ����&' �����������(����� �� D��'��

�(�''� �!� T��&' ���&������ ��������� �QV�L $������ ��!����O4� 4���$R��'N�&�*D���2'N� 'NQ%'��

& ��&'%��O�'N������J����&������ �� ) � �( �Q]�2�&�')$\��&'4�� �QV�L $������ �� D� ��� $S�$� D� ���&������ �� $ & �*(JP���� ) �� ' ����' ����$S���&UT��&' $���Q%'%Q 'N��& O � �!������ ��������������'N*7��� �*\ BN'*%Y�������*�J4�*D'(')$��

Page 48: Functional programming using Caml Light Michel Mauny January 1995

� �� � � �

� � � � � ����� � � � � � ��

�A�

Page 49: Functional programming using Caml Light Michel Mauny January 1995
Page 50: Functional programming using Caml Light Michel Mauny January 1995

� ��������� �

� � ��� �#� � � � � ²��� � � ��� ��g

jlkAarx'a[��Y'K�O£K�QbY Q�V ]�MPWAq Q2S��ASRQAx'W�Z[O OPT'��aeqU]�T¯�Cay]�YAYAQbOw]�ORa�xvORQ¦]�^s^\Q � �Ak'TEM´K�Z�]�^R ´x'a�MPORSRW�Z[O£K��ba.$#WA�?xA]�O�aQ2Y xA]�O[] M£ORSRW�Z[ORWASRa�M{Q�V ORk�]�OrOPT'��a2H jlk'KNMfKNM«ORkAa¯q¦]�K\Y VXa�]�ORWASRa¯Q)V ORkAa���Q]� '*D����TB'P��*D (U�*D��Q%Q ���&U¯M£O´Tb^\a2H, SPK\OPK\YA`���]�^\WAa�MlK\Y'ORQ�q�a�q«Q2SRT«^�QAZ�]�OPK\Q2Y�M K�M�ORkAa�VXWAY�xA]�q�a�Y'Ow]�^�q�a�Z�k�]�Y'KNMPq�Q�V_K\q���a�S[]�OPK\�2a0^N]�YA`bW�]�`2a�M=MPW�Z�k]2M��!]bMRZ�]�^6H:jlkAalnCKNMP�f^N]�YA`2W�]�`2a�� � k'Ks^\alq�Q¬MPOP^\T�VXWAY�Z[OPK\Q2Y�]�^9�2]�^NMPQ=�AS�Q��bKNx'a�M�O�kAa xA]�YA`2a�S�Q2W�MCVXWAY�Z[OPK\Q2Y�M � � ( ���]�Y�x � � ( ��� ORQ0�Ak'TEM+KNZ�]�^s^\T�q�QAxbKsV T{^|KNMPO[M�H!m¡WAO[]��'^\a MPORSRW�Z[O�WASRa�M#]�S�a S�a��2W'K\SRa�x«ORQ�K\q��'^\a�q�a�Y'O qU]�Y¬Tfa�� Z�K\a�Y¬O]�^\`2Q2S£K�O�kAq¦M�H#jlkAa�T¯]�SRae]�^�M£Q��2a�SRT¯Z[Q2Y'�2a�Y'K\a�Y¬O�ORQrSRa��ASRa�MPa�Y'O�ORkAaeZ[WASRSRa�Y'O MPOw])ORa Q)V�]�M£Ow]�ORa�q¦]2Z�k'K\YAa2H

� � � � ��*+� ���* �/�!* � I ���% �:& * ��% � % �����#�! � ����*+�

"0MRMPWAq�a � a � ]�Y¬O0O�Q x'a[��YAa¡]¯OPT'��a � �!��� ,�� ]2M K\Y²ORkAa��ASRa��bK\Q2W�M�Z�k�]��AORa�S�H¯jlkAa�Y��_K\OrMPa�a�q¦MfY�]�ORWASw]�^ ORQ]�^s^\Q � ]«��a�SwM£Q2Y¡ORQUZRk�]�YA`baek'KNM�2�kAa�S0]�`2a�� )´Qb�¡]�Y�x¯ORkAarZ�K\O´T¯O�k�]�O=��a�S[MPQ2Yp^sK��ba�M�K�Y��C�AWAO%�� �@k'K�M:2�kAa�S Y�])q�a2H, a Z�])Y{x'QfORk'KNM!�'T�]�YAYAQ2Ow]�O£K�YA`eM£Q2q�a%^N]���a[^NM�K\Y¦ORkAalOPT'��a x'a[��Y'K\OPK\Q2YUQ�V � �!��� ,��e�¬TrORkAa� # � � ��(��R&2a�T � Q2Swx.�# � � � � � �)���&, � �# ��� �$ 4� � � �7� ' ��� # ��� ��(�� � ��� � '�� � # #���� �*(*� , � � � �>�A' ��� # � � ��(�� � '�� � � � �>�A' ��� � � )/�8� �@�D+ 7 � =�� � ��� ��=80, aeZ�]�Yp�AW'Ks^�xp��]�^\WAa�M=Q�V!OPT¬�Ca � �!��� ,��¦K\YpORkAa0�2a�SRT¯MR]�q�a � ]�T¦]2ML��a[VXQ2SRa2�# (�� �������� �# ��� �$ 4� ���>�� � � �� ��� � � , � � ��� �*# �*� ��� � � ' � ��� �� ��!� ''� � � � � � *�� � �@�D+ 7 � ���%* ��� � ��� � *�� ��$ � ��� � ! � $ � -9 � � ( � �#=�� ��� � $ ����� ) � ���4* + ��7 ��� %WAOeYAQ � �.ORkAa«��]�^\WAa ������oq¦]�T¡�Ca��Ak¬TAM+KNZ�]�^s^\T q«QExbKs��a�x K�Y ORkAar��a[^NxAMrMP��a�Z�Ks��a�x ORQ¯��a # ��� ��(��rK\Y ORkAax'a[��Y'K\OPK\Q2Y5 ´]�Y�x �����J=K\YpORkAa�MPa���a[^NxAM�$wH

, a Z�]�Y q�QExbKsVXT²ORkAa¯��a[^Nx � '.� (�� Q)V ]�Y a[�E�AS�a�MRM+K\Q2Y � � % � � � � K\Y�Q2Swx'a�SUORQ ]2MRM´K�`bY²K\O¦O�kAa¡��]�^�WAaoQ�V� � % � � � � �¬TUW�M+K\YA`UORkAa0VXQ�^s^\Q � K�YA`UZ[Q2Y�MPORSRW�Z[O��� � % � � � � � � '.�&(�� � & � � % � � � ��AQbS=a[��])q��'^\a�M'KsV � a � ]�Y'O ���� � ORQr�Ca�Z[Q2q�aeQbYAa0T2a�]�S=Q�^Nx'a�SA� � a � Q2W'^Nx � SPK\ORa2�# ������ � � ��� � &��*��� � � � ��� �� � ��� � ������� � "

�¬�

Page 51: Functional programming using Caml Light Michel Mauny January 1995

�2h ��������� ����� �� � � � �+��� ��� � � �� � ��� ��� ���

��Q � �¬O�kAa0��]�^\WAa ���� �¦k�]2M���a�a�Y¡q«QExbKs��a�xUK\Y'ORQ��# ������ � ��� �8�,+ 7 � �� 4* ��� � ��� � *�� ��$ � ��� � ! �<$ � -9 � � ( � ��=�� �/� ��$ ����� ) � ���4* + ��7 ���, a�q¦]�T�ORSRT«ORQyZ�k�]�YA`2a0ORkAa � �$ 4�eQ�V �*��� �c�'�AWAO � a � Q2Y�>�O MPW�Z�Z[a�a�x.�%ORkAa�O´T'��a�Z�kAa�&2a�S � K|^s^:YAQbOL]�^|^\Q � W�MlORQx'Q�ORk�])O�H# ������ � � �� �� � & �� ��#�( � � � ����������� ��� ��� ���� � � *!� 0 4* ��� ��� � �%* �-� � $-$��'&'-'&'-'-'&'-'&'-'-'&'-'&'-'-'&'-'&'65�� � * 9���� 4* ��� ��76� � �%� �-* 9�����0;6OLK�M�Q�V#Z[Q2WASwMPa0�CQ¬MRM+K\�'^\arORQ�W�MPaeM£W�ZRkoZ[Q2Y�MPORSRW�Z[O[M!K\YvV WAY�Z[OPK\Q2Y�M�]2M%K\Y��# (�� ����� �

�,7(��*�)� " ��� ��� ���

�� ��� � ) � � � � ��� � &&� .�� �

��� � �#���=#�D+ � �8�D+ 7 � � � � �����-� � � � � �;+Y¦ORk�])O!a[��]�q«�'^�a�� � a=Y�]�q«a�x ��ORkAa Z[WAS�SRa�Y¬O � ��� Q)V�O�kAa ]�SR`2WAq«a�Y¬OA���AWAO � a ]�^NMPQfY�]�q�a�x � ORkAa�]�SR`2WAq�a�Y'O�Hjlk'KNMLK�M�]�YX������� $#��]�O�ORa�SRY��_K\O MR]��2a�MLW�MlORkAa0��QbORkAa�S Q)V � SPK\OPK\YA`��# (�� ����� �

�,7(��*�)� � �

# � � % � #A'��.% ��� ��� ��� �-& � � � � ��� � &&� .�� � ��� � �#���=#�D+ � �8�D+ 7 � � � � �����-� � � � � ���Q2OPKNZ[a¦O�k�]�O0K\Y ORkAa¦O � Q¯�ASRa��bK\Q2W�Mfa[�E�ASRa�M�M+K\Q2Y�M�� � a¦xbKNx YAQ2OyMP�Ca�Z�KsV T²]�^s^l��a[^�xAMfQ�V=ORkAaUSRa�Z[Q2S[x � H :=ORkAa�Sa[��]�q��'^\a�M � Q2W'^Nxv��a2�# (�� �& ,'��� � �A�!#

�-' � ��� � � � ' � � � & � �!# � �'�� �# ��� � % ��� ���

��>, � � ��� � � &, � � & � �

� &��� � �@�D+ 7 � � � 7 � + ��� � � � � �/���1��� � � � �� 5 *�� ��� � � &9 � �8�,+ 7 � � � 7 � + ��� � � � � �/����� � � � � �# % ��� ���

��>, � �*���� ������� %A�!� � A, �������� � � � � ���A��� �

# ��� ��,7(��*�)� ���� � �*���� �

��� �8�,+ 7 � �� 4* ��� � ��� � *�� ��$ � ��� � ! �<$ � -9 � � -� *�� 5��D+ ��$ ����� ) � ���&*���� � 7 � �, a%W�MPa�xfORkAa "0Z�k�]�Sw]2Z[ORa�S@��a�O � a�a�YeORkAa=xbK���a�SRa�Y¬O!Z�k�]�YA`2a�M � a�K\q���Q¬M£a�xeO�Q ���� ��H_jlk'KNM@K�M_O�kAa]$�'��N�&'N������&UQ�V:a���]�^\W�]�OPK\Q2Y�M���K\O=��a�S�qrK\OwMlORQra���]�^�W�])ORaeMPW�Z�Z[a�MRM+K\�2a[^\T¡MPa��ba�Sw]�^�a[�E�AS�a�MRM+K\Q2Y�M���xbKNMRZ�])SwxbK\YA`¦ORkAa0S�a�MPW'^\O=Q�V:a�]2Z�k 6a[��Z[a��AOlORkAa=^N]2M£O#Q2YAa.$wH%jlk'KNM Z[QbY�MPORSRW�Z[O%��a�Z[Q2q�a�MLW�MPa[V W'^CK\Y¯ORkAa �AS�a�MPa�Y�Z[a Q)V $S��O�' M7'�� '(�N�$ªMPW�Z�k ]bM#�Ak'TAM+KNZ�]�^q�QAxbKs�?Z�]�OPK\Q2Y�M�]�Y�x K\YA�AWAO�2�Q2WAOR�AWAOA�#M´K�Y�Z[a � a � ]�Y¬OfORQoa[�E�'^sKNZ�K\OP^\T MP�Ca�Z�KsV T ORkAaUQ2Swx'a�SfK\Y � k'KNZRk²ORkAa�T ]�SRa��a�S£V Q2S�q�a�x.H

� �C D6E!*���� � � �/*jlkAa ���! ¦OPT'��a K�M�ORkAaf�ASRa�x'a[��YAa�xpO´T'��afQ�V!qyWAO[]��'^\a0K\Y�xbK\SRa�Z[OPK\Q2Y Z[a[^s^NM�H�;+O=KNM��ASRa�MPa�Y'OlK\YoORkAaO< ])qr^:MPTEM£ORa�qVXQ2S#SRa�]bMPQ2Y�M!Q)V@Z[Qbq���]�OPK\�'Ks^sK�OPT � K\ORkUa�]�SP^sK\a�S �ba�SwM+K\Q2Y�M%Q�V�< ]�qr^6H!jlkAa ���! rOPT¬�Ca Z[Q2W'^NxU��a0x'a[��YAa�x¯]2M_VXQ�^s^\Q � M � a¦x'Q2Y�>�OeW�MPa�O�kAa ���) oY�]�q«arK\Y ORkAa{V Q�^s^\Q � K\YA` x'a[��Y'K\OPK\Q2Y²��a�Z�])W�MPa � a � ]�Y'O0ORQp�ASRa�MPa�SR�2a«ORkAa¦QbSPK\`�K\Y�]�^���) UOPT¬�Ca.$w�

Page 52: Functional programming using Caml Light Michel Mauny January 1995

� �� ��� � ��� �AI

# � � � � �6�P���) ��)��� � 7� � � #���� ��(*�����! � �6� � � )/�8� +4� � �D+%� ��� � =�� � ��� ��=@0

�_��]�q��'^\afQ�Vª�AW'Ks^NxbK\YA`¡]r��]�^�WAarQ�V_O´T'��a ���! .�# (�� � � � ���) " ��� ) � + ������� +%� � � +4� � �jlkAa����) «KNx'a�Y¬O£K|��a�S�KNM=M£T¬Y'Ow]2Z[OPKNZ�]�^s^\T¯�ASRa�MPa�Y'ORa�xp]2M=]rMPWAqgxA]�Ow]rZ[Q2Y�MPORS�W�Z[ORQ2S�H!jlkAaex'a[��Y'K\OPK\Q2YoQ�V�� M£kAQ2W'^Nx��a¯S�a�]2x ]bMI �^\a�O � ��a¡]pSRa[VXa�SRa�Y�Z[aUORQoORkAaU��]�^\WAa¯Q�V ���� "AHojlkAa¦��]�^\WAa¯Q�V��oKNMfYAQ2ORk'K\YA` �AWAO�]pq�a�q�QbSRT^\QEZ�])OPK\Q2Y � kAQ'MPaeZ[Q2Y'ORa�Y¬O[M=Z�]�Y¯��afQ��2a�S � SPK\ORO�a�Y�H, aeZ[Q2Y�MPW'^\O ]{SRa[V a�S�a�Y�Z[a XK6H a2H!SRa�]2x K\OwMlq�a�q�QbSRT�^\QAZ�]�OPK\Q2Y�$ � K�O�k¡ORkAaI �D" MPT'qr��Q�^6�# �F� �� � �������������

, a0q�QExbKsVXT¯��]�^\WAa�M�Q�V!O´T'��a����! � K\ORk¯O�kAa � �fK\Y'�A�¡VXWAY�Z[OPK\Q2Y��# � � � �I� (�� � ��� � ������� � "# � � ��������� +%� � � +4� � �

¢2Q2q�a0�AS£K�q{K�O£K��ba�M0]�SRae]�ORO[]2ZRkAa�x«ORQ�O�kAa����! ¦OPT'��a��'VXQ2Sla[��]�q��'^\a2�# '�� )� � ��������� +%� � � � � �����-� � � � � �# ���)� � ��������� +%� � � � � �����-� � � � � �

� k'KNZ�k¯K\Y�Z[SRa�q�a�Y'OwM 6SRa�MP��H#x'a�Z[S�a�q�a�Y¬O[M�$#SRa[VXa�SRa�Y�Z[a�M�Q2YUK\Y¬ORa�`ba�SwM�H

� ��� � ����%"���

"�SRSw]�TEMf]�SRaUq�QAxbK|�?])�'^�aoxA]�Ow]pMPORSRW�Z[ORWAS�a�M�H jLkAa�T ��a[^\Q2YA` O�Q O�kAa¦��]�S[]�q�a�ORa�SPKCB�a�x OPT¬�Ca �6� ���� �?HD"�SRSw]�Ta[�A�ASRa�MRM+K\Q2Y�M�]�SRa0�ASw]bZ]&2a�O�a�xU�¬T � � ]�Y�x � � �C]�Y�xUa[^\a�q�a�Y¬O[M ]�S�aeMPa���]�Sw]�O�a�xU�¬T¯MPa�qrKNZ[Q�^\Q2Y�M��# (�� � � � � � � � � � �� � � � * ������� ��� �$�-��� � $ ! � $ � � � �

jlkAa�^\a�YA`2ORkpQ�V#]�Y¡]�SRSw]�TrKNM�SRa�ORWASRYAa�xU�'T � K\ORk¯ORkAa�VXWAY�Z[OPK\Q2Y ��� � � (�� ����.%��# ��� �

�(�� ����.%�� �

�������������

Page 53: Functional programming using Caml Light Michel Mauny January 1995

�2G ��������� ����� �� � � � �+��� ��� � � �� � ��� ��� ���

7� K� �� Eo$A$����)��(+"#3�,.1212,�� ��-F�C4 �A"@& �"0Z�Z[a�MRMPa�M�ORQ�]�SRSw]�T�a[^\a�q�a�Y'OwM�Z�]�Y¡�Caex'Q2YAaeW�M+K\YA`UORkAa�VXQ�^s^�Q � K\YA`¯MPT'Y¬Ow]����# � � " � ) � ����������� �Q2SA�bq�Q2SRa�`2a�YAa�Sw]�^s^\T?��� � � " � ) � � kAa�SRa � � a���]�^\W�]�ORa�M%ORQy])Y ]�S�Sw]�Ty]�Y�x � O�Qy]�YrK\Y'ORa�`2a�S�H$"=^\ORa�SRY�])OPK\�2a[^\T��AORkAaVXWAY�Z[OPK\Q2Y ���� �

�' ���� UKNM��ASRQ��2KNx'a�x.�

# ��� ��'����$ �

�����F* �#� �*��� � ������� � �F*���� � � � �jlkAa���SwM£O=a[^\a�q�a�Y¬O�Q�V�])Y ]�S�Sw]�TrKNM=]�O%K\Y�x'a[� hAH "�SRSw]�TEMl]�S�a W�MPa[VXW'^:�Ca�Z�]�W�MPay]bZ�Z[a�MRM+K\YA` ])Y¯a[^�a�q«a�Y¬OlKNM�x'Q2YAaK\Y Z[Q2Y�M£Ow]�Y'O O£K�q«a2�#]�Y¡]�SRS[]�TfKNM�]yZ[QbY¬OPK\`2WAQbW�M%V S[]�`2q�a�Y'OlQ�V:q�a�q�QbSRT�� � k'Ks^\ay]2Z�Z[a�M�M+K\YA`�^sKNMPO=a[^\a�q�a�Y'OwM�Ow].&2a�M^sK\YAa�]�S O£K�q«a2H7� K� � � * �#(�� �#(+"#3 ,.121b,�� �C-F��4 ��"@& �mpQExbKs�?Z�]�O£K�QbY¡Q�V#]�Y¡]�SRS[]�T«a[^�a�q«a�Y¬O�KNM x'Q2YAa � K�O�k¡ORkAaeZ[Q2Y�M£ORSRW�Z[O��

� � � " � ) � &�� �� kAa�SRa�� � k�]bM#O�kAaeMR]�q�a�OPT¬�Cae]2M%ORkAa0a[^\a�q�a�Y¬O[MlQ�V:ORkAa0]�SRS[]�T � � H#jlkAa0a[�A�ASRa�MRM+K\Q2Y�� Z[Q2q��AWAORa�M%ORkAa�K\Y�x'a[�]�O � k'K�Z�k¡O�kAa0q�QExbKs�?Z�]�O£K�QbY � Ks^s^ªQAZ�Z[WAS�H

"0M%VXQ2S=]2Z�Z[a�MRM+K\YA`��.]fVXWAY�Z[OPK\Q2Y¯VXQ2Slq�QAxbKsV TbK\YA`¡]�SRSw]�T�a[^\a�q�a�Y'OwMLK�M�]�^NMPQ��ASRQ��bK�x'a�x.�# ��� �

�����-' �'� �

�����F* �#� �*��� � ������� � �F*'� � � �����-� � � � � ��AQbS=a[��])q��'^\a2�# � � " � ) � & " �5� " � ) & �$) � ��� � ������� � "# � � ��������� ��� �$�-��� �%$ ! � $ � � � �# ��� �

�����-' �'��� � "�" ��� �

�'����$ � � ) & �$) �

��� � ������� � "# � � ��������� ��� �$�-��� $ ! � $ � � � �

� ��� H �.��������������� ��%�� � �

;6q«��a�Sw]�O£K��ba��ASRQ2`2S[]�q�qrK\YA` XK6H a2HrW�M+K\YA` M+KNx'a�¥Xa���a�Z[OwMeM£W�ZRk ]bM��Ak¬TAM+KNZ�]�^ q«QExbKs�?Z�]�OPK\Q2Y Q�V=xA]�Ow]¯MPORS�W�Z[ORWASRa�M�$ORSw]bxbK�O£K�QbY�]�^s^�T q¦].&ba�M0W�MPaUQ�V MPa��bWAa�Y�Z[a�M�]�Y�x a[�E�'^sKNZ�K\Or^\Q¬Q2��M©H ¢2a��bWAa�Y�Z�K\YA` a���]�^\W�]�OPK\Q2Y K�Y <l]�qr^ nCK\`2k'OfK�Mx'Q2YAa=�'TrW�M+K\YA`eORkAa�MPa�qrKNZ[Q�^\Q2Y� "�H:�!��]�^\W�]�OPK\YA`ra[�E�AS�a�MRM+K\Q2Y � � �¬xbKNMRZ�]�SwxbK\YA`rORkAa=��]�^\WAa S�a�ORWASRYAa�x��¬])Y�xrORkAa�Ya���]�^�W�])OPK\YA`�� K�M � SPK\ORO�a�Y��

Page 54: Functional programming using Caml Light Michel Mauny January 1995

� �� � �������� �.C � ������� ��� � �2u

� � � ;XV � � ]�Y�x�� ��a�S£V Q2S�q M´K�x'a�¥Xa���a�Z[OwM^�¬O�k'K�MlZ[Q2Y�M£ORSRW�Z[Ola�Y�MPWASRa�M%ORk�]�O%ORkAa�T � Ks^s^���a���a�SPVXQ2SRq«a�xrK\Y¯ORkAa0MP��a�Z�Ks��a�xQ2Swx'a�S zV SRQbq ^�a[VXO#O�Q0SPK\`2k¬O^$wH�;+Y¦Q2S[x'a�S!ORQ0a�q��Ak�]2M+KCB�a0MPa��bWAa�Y¬OPKN]�^?M´K�x'a�¥Xa���a�Z[OwM^�2K\Y�MPO�a�]2xrQ�V.W�M+K\YA`y��])SRa�Y¬O�kAa�MPa�M]�SRQbWAY�x¯MPa��2WAa�Y�Z[a�M^��Q2YAaeZ�])Y¡W�MPa�A� �A' �v]�Y�xD� � ����]bM!K\Y��# (�� �-% � ���) � ' �# � � �A'��# % � � � % �� # % � � � % � � %# ��� � � ��� � ������� � "jlkAa &2a�T � Q2SwxAM �A� �A'�� ]�Y�x � � � ]�SRa¯a��bW'K���]�^\a�Y¬O¯O�Q Qb��a�Y'K\YA` ])Y�x²Z�^�Q'M+K\YA` ��]�S�a�Y¬ORkAa�M£a�M�H jlkAa¯�ASRQb`2Sw]�q]��CQ��baeZ[Q2W'^Nx¯��a � SPK\ORORa�Y¡]bM��# (�� �-% � ���) � ' �# " % � ��� % 7�� % � ��� % � � % )/ � ��� � ������� � "

�ª�E�'^sKNZ�K\Or^\Q¬Qb��My])SRa¦YAQbOyMPORS£K�Z[O£^�T YAa�Z[a�MRMR]�SRT �L'* $S'��y]pSRa�Z[WASwM´K��ba�VXWAY�Z[OPK\Q2Y²Z[Q2W'^Nx ��a�SPVXQ2SRq�ORkAa¦M�]�q�a� Q2S]&.H:J�Q � a��ba�SA��ORkAalW�MR]�`2alQ�V�]�Yra[�E�'^sKNZ�K\Ol^\Q¬Qb�r^\QEZ�]�^s^\T�a�q��Ak�]bM+KCB�a�M ]�q«Q2SRa%K\q���a�Sw])OPK\�2a MPOPTb^�a2H!j � Q�^\Q¬Q2��M]�SRa0�AS�Q��bKNx'a�x.�

, �&����'���#.%�')(*��� � �7,�� �7, �A�ea���]�^\W�]�ORa�M � � � k'KNZ�k¡qrW�MPO%SRa�ORWASRY¡]f��Q'Q�^\a�]�Ypa[�E�ASRa�M�M+K\Q2Y��'KsV � � S�a�ORWASRY�>�*# �(�2O�kAa�Y�� � k'K�Z�k«K�M%W�MPW�]�^|^\T¯]rMPa��2WAa�Y�Z[a.$�K�M%a���]�^\W�]�ORa�x��AORkAa�Y�� � KNM%a���]�^\W�]�ORa�x¯])`¬]�K\Y ])Y�x¦MPQfQ2YWAY¬OPKs^ � � SRa�ORWASRY�M �&( �7�AH, �S �*[�!O � Qr��]�SPKN]�Y'OwM��bK\Y�Z[SRa�]2M´K�YA`¡])Y�x¯x'a�Z[SRa�]2M+K\YA`

0 -,.� � � � � �-, � �7, � � �>,��A�0 -,.� � � � � �>,.# � ��,�� �7, � � �>,��A�

� kAa�SRa � K�Ml]�YfKNx'a�Y'OPKs��a�S�H �ª�E�AS�a�MRM+K\Q2Y�M � � ]�Y�x�� ]�SRa�ORkAal��Q2WAY�xAM%Q�V�ORkAal^\Q'Q2���_ORkAa�TrqrW�MPO!a���]�^\W�]�O�aORQ K\Y¬ORa�`ba�SwM�H ;6YORkAa Z�]2MPa Q�VyORkAa K�Y�Z[S�a�]2M+K\YA` ^�Q'Q2����ORkAa a[�A�ASRa�MRM´K�QbY�M � � ]�Y�x � ]�SRaoa���]�^\W�]�O�a�x�ASRQEx'W�Z�K\YA`f��]�^\WAa�M / � ]�Y�x / ��K|V / � KNM%MPORSPKNZ[OP^\Te`bSRa�]�ORa�S_ORk�]�Y / ��ORkAa�YrYAQ2ORk'K\YA`�KNM!x'Q2YAa2H :=ORkAa�S � KNMPa��� � K�MLa���]�^\W�]�ORa�x / - / � $ 3 I�OPK\q�a�M�� � K\ORk¯O�kAa0��]�SPKN]��'^\a �r��Q2WAY�x¯M£W�Z�Z[a�MRM+K\�2a[^\T¡ORQ / � � / � 3 I��.c�c�c]�/ HjlkAa0��a�k�]��bK�QbS=Q�V!ORkAaex'a�Z[SRa�]2M+K\YA`«^\Q¬Q2�UKNM�M+K\qrKs^N]�S���K|V / � KNM MPO�SPKNZ[OP^\T MPqU]�^s^�a�S�ORk�]�Y / �'ORkAa�Y¯YAQ2O�k'K�YA`K�Mrx'Q2YAa2H@:=ORkAa�S � K�M£a�� � � KNMra���]�^\W�]�ORa�x / � - / $ 3 IUOPK\q�a�M � K\ORk �p�CQ2WAY�x ORQ M£W�Z�Z[a�MRM+K\�2a¯��]�^�WAa�Mx'a�Z[SRa�]2M+K\YA`«V SRQbq / � ORQ / H

 %Q2ORkU^\Q'Q2��M=S�a�ORWASRY¯ORkAa0��]�^\WAa " ) Q�V!OPT¬�Ca #���' �?H# -,.� ' �����, " ���� �

�(*��� ���.% � ) & � �>, �5� " ' ) � & ' �7, �A� �

��� � ������� � "# � � ��������� ��� �$�-��� � $ �$ ! � �

Page 55: Functional programming using Caml Light Michel Mauny January 1995

��� ��������� ����� �� � � � �+��� ��� � � �� � ��� ��� ���

� � ���L&8� I ��� �:E�� � I %���� I ���% � & * ��%+��% ��� � �! "�#�!��*+�

jlkAa�SRaU]�SRa¦MPQbq�a�SRa�MPO�SPKNZ[OPK\Q2Y�MrZ[Q2Y�Z[a�SRY'K\YA`o��Q�^\T'q�Q2SR�Ak'KNMPqt])Y�xoqrWAOw]��'^\a xA])Ow]¯MPORSRW�Z[O�WASRa�M�HD:=YAa Z�])YAYAQ2Oa�Y�Z�^\Q¬MPaf��Q�^\T'q�Q2SR�Ak'KNZfQ2�()Pa�Z[OwM%K\Y�M+KNx'arqrWAOw]��'^\aexA]�Ow]�M£ORSRW�Z[ORWASRa�M©H# (�� � � � ���) � � � + ��� � * � ��7 � +%� � � +%� � �jlkAafSRa�]2MPQ2YUKNM�ORk�]�O=QbY�Z[aeORkAa0OPT'��aeQ)V ��� " � �P(�' � � ) ���) ��Ak�]2M���a�a�YoZ[Q2q��AWAORa�x���K\O Z�])YAYAQ2O=��arZRk�])YA`2a�x.H %WAO=ORkAaf��]�^\WAaeQ)V �¯Z�]�Y¯��arZRk�])YA`2a�x.� � aeZ[Q2W'^Nx � S£K�O�a2�� � � � �� � � � ]�Y�xUYAQ � �7� � Q2W'^NxU��ae]{SRa[V a�S�a�Y�Z[a0Q2Y ]y^|KNMPO�Q�V:Y'WAqy�Ca�SwM � k'Ks^\a0K\OwMLO´T'��a � Q2W'^Nx¯MPO£K|^s^:�Ca " �6� (�' � � ) ���! �]�^s^\Q � K\YA`¦W�MlO�Q � SPK\ORa2�� � ���7�$#A� ��� �F� � q¦].&bK\YA`O�¯]rSRa[VXa�SRa�Y�Z[aeQ2Y � �7�$#A� �� � � � � k'KNZ�k¯KNM ])YUK|^s^\a�`¬]�^�<l]�qr^�Q2�()Pa�Z[O�HjLk¬W�M�ORkAa�< ]�q{^?OPT¬�Ca�ZRkAa�ZF&2a�S�K�q«��Q¬MPa�MLORk�]�O!q�QAxbKs�?]��'^\aexA]�Ow]eM£ORSRW�Z[ORWASRa�M%]��A��a�])SPK\YA`{])O#ORQ2�'^\a��2a[^�qrW�MPO��Q'MRMPa�MRMlq«Q2YAQ2q�Q2S��Ak'K�Z OPT¬�Ca�M/ XK6H a2H!YAQ2O���Q�^\T'q�Q2SR�Ak'KNZ6$wH

� �!*+�� � ��*7�

0 6�BE���2��D�B ³ X��� � BN'��4Q%�&���Y���'\O�����I�JK�L'�O�' � ������U\���'�� � $ �[�J#� '\ D����� $��$]����OPO�' ����'���&' �� ���* �S�����N��� �� $�)� �5��.� ��� � ( ��F����O � � ( ���!�0 6�BE���2��D�B ³ �8 � ' � ��']� � ���$ � ���������� ���� D�]�JK�L' #���'��3& � ' ��� � ��&�� *7'N��&*�� $]� ��*7')$ �\�����'DU�'N*�'(����� ���Q%'�� � $\�(������'(O�� � ���� � $ � ���' � *K$S ������� *D'���*(� $ ��� ��&'%$�'��( ���O4�������2*D'���*�� $���������OP$S T ��!�

0 6�BE���2��D�B ³ \}�� ' � ��'�� � #�'' %��&,.��� ���&������ ��G ��>��*�*D��JN$� D���] ������&U��L �����%����Q4Y#'N*#$ �S ����� � ���&U����'

�����F&� ������ ��� U� �*������Q���� ���(� �(�)�S �*�Q%����� �� ��Y# ���T��&' �����]&� ������X��� U� �*(����&Q ����� YK'P�S �����O9����� ������� �S �*'N� ��QV����' �

Page 56: Functional programming using Caml Light Michel Mauny January 1995

� ��������� �

������� ��� � ������� ����� � !��"!#�$��� �&%

')( � ' � !#�$��� �

*,+ ��.-0/� ���21��� � + 43� � � + / �5/ � 61 �67 ���81:9 ����� � �;-0<����=1��� � + 4> *@?BA /�1��C/����67� +ED ��� � �;-0<����6/ �CFE/� + �C/ D / �G IH�� � + � ? 1 + + �C/ D / �KJ�9L7#MN3 �CFE/ +#A /O-�� ��K/ ��P1:<2/ ? ���.- �CF21��K/P-Q921����=1� � +ED ���21��� � +#A �CF�������6/ ����� + +ED 1 + 7 �C/ ��SR �T>

U + ���6FE/ �V/5W21:-0<SRI/ � ? �CFE/ � 61 D / � ? �� �CFX1 + / ��P1:<2/Y-0/ �6F21 + � Z-[1\<E<2/T1�� A FE/ +XA / A 1 + ����� G /5] + /�6FE/_^a`Lb.c ? � + � �� � + � + R � �� PdeSf `:gh^i`Sb\c�jlk;mSJin:gio:p\Je q�rLr �ts � qe u�vxw s �zy bEo.{S`}|5~EbEo f m y `#�5^a`Lb.c r `P����gS� f o.{:g��;���L��;�=�����;�E�:�#�4�\�������� � �L�x��� �h�� ��;���\���4�S� �¡�4¢��h�S���N�L�S£;���¤�t¥E�L�:�N�.¥#¦S�L�4¢§�P�§�P�S�¨�©��ª.�;¥��«�2�.�S�E�T�t�4�}�P¢¬�;¥­�®�S�L�E�T�\�°¯¢±�.�S²)�#³6�´���;¥��#� � ³C�¶µt·T¸��T� �¹ / �P1 +E+ ��� D ºH;/»1 �6/ D �SR¼1���H:1©R �E/ ��� �6FE/�/5W�<��C/ � � + ^a`Lb.c v,w A �6F������®R � +ED �6FE/B< �:RI7L- ���6<EF� ½- � ? ^i`Sb.c2>¹ /��6F� �CF�� � ½/����0/ ��P1\<2/.d A /0¾½¿.ÀÂÁPÃÄ¿.ÅÆÃPÇ:È=ÃZÉiÊ@ÀÌË.Å2>

ÍÄÎ=Ï ÐÒÑ�Ó$ÔÖÕØ×±Ù=ÚÜÛ�ÝU + /5W�Þ5/P<Eß½àIá + à¼âã1ä�1:-QR±H:1©RIåE/Äá ? ß6FE/V9EåSàæRIß6çÌà + ß½7L<N/Q` q J�3SH./PèC7éâxàI-QàæR¼1:èVß6á010âZåE-)ß½7L<N/.> U + /5W�Þ5/P<EßZàºá + d

ê F21.âã1KÅN¿.ëQÃVìí~�b�o f m y `_à + á.åEèã/5W21:-0<SRI/:î=3ê 1 + G FEá:R G âãïP/PèCá0á.èãá + /VH:1©RIåE/0ìð�ð^a`Lb.c r `ð���EgL� f o.{:g��Üá ? ß½7S<2/Y{�g y o4JEñQà + ß6FE/V/5W21:-0<SRI/:î=>ò á;-0/�/5W�Þ5/P<Eß½àIá + â$1:è6/$<Eè6/ G /5] + / G 3;RóàIô./_~EbEo f m y `E>±õ / A /5W�Þ5/P<EßZàºá + âBÞP1 + 9N/ G /5] + / G A àIß6FQß6FE/ ? á:RæRIá A à +EDÞ5á + â½ßCè6å2Þ5ßTd

` q nS`T�Egao�p\J�öL` q nS`©��gao�p\JlJabP�¬` � v p;k�ö:gL�;�i` � w÷ W�1\-0<SRI/.d

ø.ø

Page 57: Functional programming using Caml Light Michel Mauny January 1995

ø�� ���������� ����������������������� ��� !�"�� #�%$&'��(�)����+*��-,������.�)����

e ` q nL`©�Egio:p:J#~Lp\mSJ�c#p;k�oPJEg$�L�/ � ªS�6�®�S�L�4�102�;�T�¬²�²��©¸N�P�±�.²�¯2 FE/K/5W2Þ5/P<Eß½àIá + ~Sp\mLJ2cÆF21.â 92/P/ + G /TÞCR¼1:è6/ G 3ã1 + G àIß8ÞP1:èCè½àI/Tâ à + ß6/ D /Pè0H�1©RIåE/TâP> ¹ FE/ +�A /K1:<E<SRI7¤àIß0ß6áÒ1 +à + ßC/ D /PèT3 A / D /Pß°1 + /5W�Þ5/P<Eß½àIá + H�1©RIåE/ì,á ? ßí7S<2/Q` q Jiî=de ~Lp\mLJ2c43��S��)�Æ� � �}µ502�;�T�¬²56

ÍÄÎ�7 8:9_Ù=Ý�ÙPÛ�;<9_Û Ô$Ñ�ÓBÔ�ÕQ×®Ù=ÚÜÛ= 1©à¼âxà +ED 1 + /5W2Þ5/P<Eß½àIá + àÂâ G á + /V9S7é1\<E<SRº7;à +ED ß6FE/V<Eè½àI-QàIß½àIH./ ? å + Þ5ß½àIá + y b�o;{S`Äß6á81QH:1©RIåE/Äá ? ß½7L<N/Q` q J¬de y bEo.{S`®�L��)�Æ� � � � � ³6��µ ·T¸��©� �e y bEo.{S`§|=~Sp\mLJ2c432���L�>4��ª;�.�©�S¢��#� � ªS�6�®�S�L�4� �?02�;�©��²56@ /Pè6/_à¼â°1Q-Yá.è6/Vè6/T1©Ræà¼â½ß½à¼ÞÜ/5W�1:-Y<SRº/.deSf `:g�kio4J�cBAEoPJ2cE` q � je f `:g y `Sn�kio4J2chJ je k.mSJin:gao�p\J v,w s ��y bEo;{L`§|5~EbEo f m y ` �ðJ�p;g#kEp:mSJ�ca�;�e uéqÖrSr �ts � o©k�� | q �Xg;^a`TJ y b�o;{L`§|5~Lp\mSJ�c«J¬�e ` f {S`�kio4J�c |½J+C�D;� �e oPJ#kaoPJ2cEDa�S��;�=�����;�E�:�#�4�\�������� F � �S�,��� � �:¸���G �IH �4¢±�5� �N�L�;¥��JG�02�;�©��² � H� ��;���\���4�S� �¡�4¢��h�S���N�L�S£;���¤�t¥E�L�:�N�.¥#¦S�L�4¢§�P�§�P�S�¨�©��ª.�;¥��«�2�.�S�E�T�t�4�}�P¢¬�;¥­�®�S�L�E�T�\�°¯¸N�P�¬²�KE�4��²E� � �4GE³6� � � £L�S�;� H � � ³6�´���;¥��#� � ³C£¶µt·T¸��T� �2 FE/VkaoPJ2cBA�o4J�c�` q ? å + Þ5ßZàºá + 1©R A 1©7�â ? 1©àæR¼âP> * ß°è=1�àÂâZ/TâPd

ê ~Lp\mLJ2c«J�3;à ? ß6FE/Pè6/_à¼âã1 + /5RI/P-0/ + ß q á ? ß6FE/ãRæà¼â½ßVâ½å2ÞCFKß6F21:ß��B| q �S3;à + ßCFSàÂâ ÞP1.â½/_J0à¼â�ß6FE/_à + G /5W á ? q à +ß6FE/_RæàÂâZßT3ê ß6FE/Ä~EbEo f m y ` /5W�Þ5/P<Eß½àIá + à ?B+ á8â½å2ÞCF q F21.â�92/P/ + ? á;å + G >

= 1©à¼âxà +ED /5W2Þ5/P<Eß½àIá + â_à¼âV-Yá.è6/Qß6F21 + 1 + /PèCè6á.è_-0/TÞ6F21 + àÂâZ- d_àIßVà¼âÄ1<EèCá D è=1:-Y-81:9SRI/0Þ5á + ßCè6á:RBâ½ß6è6å2Þ5ß6åEèC/.> *x+ß6FE/0kao4J�cBA�o4J2cE` q /5W21:-0<SRI/.3®ß6FE/Pè6/ A 1.â + á¡/Pè6è6á.è A FE/ + è=1©à¼âxà +ED ß6FE/8~Sp:mSJ2cK/5W2Þ5/P<Eß½àIá + d A /0á + Rº7 A 1 + ß6/ Gß6áML;åSà¼Þ6ô;RI7Æ/Tâ6ÞP1:<2/ ? è6á.-)ßCFE/�Þ5á.-0<EåEß51:ß½àIá + 3aâxà + Þ5/ A / ? á.å + G A F21\ß A / A /Pè6/VRIáSá.ô;à +ED? á.èT> 2 FSàÂâ à¼â A FS7àIß-Qå2â½ß_92/Q<2áLâCâxàI9SRº/Yß6áOÊ@¾½¿5ÉK/5W2Þ5/P<Eß½àIá + âPd A / A 1 + ß_ß6á0ß6è51:< <NáLâ6âxàI9SRI/0/Pè6è6á;è=âP3N9EåEß A /�1�RÂâZá A 1 + ß°ßCá D /Pß_á.åEèè6/Tâ½åSRIß à + ß6FE/ÄÞP1.âZ/Vá ? ßCFE/Vkio4J�cBAEoPJ2cE` q k.mSJan�gao�p\J¬>

Page 58: Functional programming using Caml Light Michel Mauny January 1995

����� �1 "��� ����������, �����.�)���� ø��ÍÄÎ�� ���.9ãÕ0ÕÙPÛ ; Ô$ÑQÓBÔ�ÕQ×®Ù=ÚVÛQÝ2 è=1:<E<Sà +ED /5W2Þ5/P<Eß½àIá + â»à¼â°1.ÞCFSàI/PH./ G 9S7ß6FE/ ? á\RóRIá A à +ED Þ5á + â½ß6è6å2Þ5ß©dg y �töS` q � y `S{L{Eo�p\J � o©g.^�öP�¬b:g2n©^�nLbS{S`L{ �2 FSàÂâVÞ5á + â½ß6è6å2Þ5ßV/PH:1©RIå21:ß6/TâQöS` q � y `S{S{�o:p:J � > *@?�+ á /5W2Þ5/P<Eß½àIá + à¼âVè=1�àÂâZ/ GOG åEèZà +ED ß6FE/Q/PH:1©RIå21:ß½àIá + 3®ß6FE/ +ß6FE/Vè6/TâZåSRºß_á ? ß6FE/Vg y �KÞ5á + â½ß6èCå2Þ5ß�à¼â�ß6FE/ÄèC/Tâ½åSRIßãá ? öL` q � y `L{S{�o:p\J � > * ? 1 + /5W�Þ5/P<EßZàºá + à¼âãè51©à¼â½/ GKG åEè½à +ED ß6FSà¼â/PH�1�Rºå21\ß½àIá + 3�ß6FE/ + ßCFE/0è=1©à¼â½/ G /5W2Þ5/P<Eß½àIá + à¼âÄ-1:ß=ÞCFE/ G 1 D 1©à + â½ßVßCFE/Köð��b:g2n©^§nSbL{S`L{ � > *@? 1 ÞP1.âZ/0-81:ß=ÞCFE/TâP3ß6FE/ + Þ5á + ß6èCá:R�à¼âV<21.â6âZ/ G ß6áKàIßT> *@?ã+ áOÞP1;â½/0-81:ß5Þ6FE/TâP3aßCFE/ + ß6FE/0/5W2Þ5/P<Eß½àIá + àÂâ <Eè6á;<21 D 1:ß6/ G á.åEß5âxà G /0á ? ß6FE/

g y �KÞ5á + â½ß6èCå2Þ5ßT3;RºáSá.ô;à +ED0? á.èãß6FE/V/ + ÞCRIáLâíà +ED g y �i>÷ W�1\-0<SRI/.deSf `:g�kio4J�cBAEoPJ2cE` q ���#je f `:g y `Sn�kio4J2chJ je k.mSJin:gao�p\J v,w s ��y bEo;{L`§|5~EbEo f m y ` �ðJ�p;g#kEp:mSJ�ca�;�e uéqÖrSr �ts � o©k�� | q �Xg;^a`TJ y b�o;{L`§|5~Lp\mSJ�c«J¬�e ` f {S`�kio4J�c |½J+C�D;� �e oPJe g y �#kaoPJ2cED � oTg;^ ~Lp\mLJ2c«J§s � J��S��;�=�����;�E�:�#�4�\�������� ���;��¸2�4��² KE�P�¬²�� � �§�tµ� ��;���\���4�S� �¡�4¢��h�S���N�L�S£;���¤�t¥E�L�:�N�.¥#¦S�L�4¢§�P�§�P�S�¨�©��ª.�;¥��«�2�.�S�E�T�t�4�}�P¢¬�;¥­�®�S�L�E�T�\�°¯�;�=�����;�E�:�#�4�\�������� F � �S�,��� � �:¸���G �IH �4¢±�5� �N�L�;¥��JG�02�;�©��² � H� ��;���\���4�S� �¡�4¢��h�S���N�L�S£;���¤�t¥E�L�:�N�.¥#¦S�L�4¢§�P�§�P�S�¨�©��ª.�;¥��«�2�.�S�E�T�t�4�}�P¢¬�;¥­�®�S�L�E�T�\�°¯¸N�P�¬²�KE�4��²E� � �4GE³6� � � £L�S�;� H � � ³6�´���;¥��#� � �4����µ ·©¸E�©� �e kio4J�cBAEoPJ2cE` q |Ck;mLJan�gao:p:J�J§s � |½J¶�apSc��N�lj#MN� v D��� �� 3���� ��� � D©M w �S��)�¡�4���#µ��

e kio4J�cBAEoPJ2cE` q |Ck;mLJan�gao:p:J�J§s � |½J¶�apSc��N�lj#MN� v D��� �� 3���� ��� w �S�>4��ª;�.�©�S¢��#� � ªS�6�®�S�L�4� �?02�S�;�L�.�i���x���S��¸2�;�©��²��2 FE/ öð��b:g2n©^�nLbS{L`S{ � <21\è6ß�á ? ß6FE/_g y �0Þ5á + â½ß6èCå2Þ5ßBà¼â�1 è6/ D åSR¼1:è�<21:ß6ßC/Pè + -1:ß=ÞCFSà +ED á + H�1�RºåE/Tâ»á ? ß½7L<N/Ä` q J�>* ßØàÂâYß6FSå2â <2áLâ6âíàº9SRI/Æß6áÆß6è=1\<l1 + 7 /5W�Þ5/P<Eß½àIá + 9S7Òå2âxà +ED ß6FE/#A­âZ7L-Q92á\R > U â01 + /5W�1:-Y<SRº/.3$ß6FE/ ? á:RæRIá A à +ED? å + Þ5ß½àIá + ß6è=1\<2â°1 + 7 /5W2Þ5/P<Eß½àIá + è51©à¼â½/ GÒG åEè½à +ED ßCFE/Ø1\<E<SRóà¼ÞP1:ßZàºá + á ? àIß=â_ß A áK1:è D åE-0/ + ß5âP> ¹ 1:è + à +ED d°ßCFE/MAA àæRæR 1�RÂâZá0ß6è=1:<à + ß6/Pè6è6åE<Eß5â ? èCá.-�ß6FE/Äô./P7S92áS1:è G â½å2ÞCF 1.âãÞ5á + ß6è6á\Rºç½ä��eSf `:gtnLb:g2n©^ ALb fLf k�b y ñ´c�`:k2b©m f g#je g y �¶k�|4b y ñi� oTg;^:A�s � cE`:kNbTm f g$�S�ª;�L�Eª5¢ KE�.�S��� GE³C� � � ³C£ H � � ³C� � � ³6£#� � ³6£�µ ·©¸��T� �* ß_à¼â_/PH./ + <2áLâ6âíàº9SRI/0ßCá ÞP1:ß=ÞCFO1©RæRB/5W2Þ5/P<Eß½àIá + âP3 G á âZá.-0/Pß6FSà +ED â½<N/TÞCàÂ1�R°ìíÞCRIáLâ½/Qá.è_è6/P-0á:H./Qá.<N/ + / G ]ERI/TâP3 ? á.è/5W21:-0<SRI/:î=321 + G è=1©à¼â½/Ä1 D 1©à + ß6F21:ßã/5W2Þ5/P<Eß½àIá + 3Nß6áQ<Eè6á.<21 D 1\ß6/_àIßãåE< A 1:è G âP>eSf `:gt{T^2p AS` q nL`©�Egio:p:Ja{Xk b y ñ#je g y ��k�|Pb y ña� o©g;^ q s � � y oPJEg+AS{:g y oPJEñ ��� q nS`T�Egao�p\J y bEo.{S`.c����TJ±��� y b�o;{L` q �L�¥©¢��S¦�K2� � ªS�6�®�S�L�4�i¥)�4GE³6�#� � ³6£ H � � ³6�#� � ³6£�µ ·©¸��T� �

Page 59: Functional programming using Caml Light Michel Mauny January 1995

ø�� ���������� ����������������������� ��� !�"�� #�%$&'��(�)����+*��-,������.�)����

*,+ ß6FE/0/5W21:-0<SRI/81:9Ná�H;/.3 A /Y<Eè½à + ßÄ1 -0/Tâ6â61 D /�ßCáKß6FE/0â½ß=1 + G 1:è G á;åEß6<EåEß�ÞCF21 +E+ /5Rãì,ß6FE/Yß6/Pè6-Qà + 1©R@î=3�92/ ? á.è6/è=1©à¼âxà +ED 1 D 1©à + ß6FE/VßCè=1:<E<2/ G /5W�Þ5/P<EßZàºá + >e nLb:g2n©^ ALb fLf |6k;mSJin:gio:p\J q s ��y b�o;{L`�|=~�b�o f m y `´�4k�pSpa�.�S� D�M��S��)�¡�4���#µ��e nLb:g2n©^ ALb fLf |P{©^2p AL` q nL`©��gao:p:Ja{ |Ck.mSJan�gao�p\J q s �zy bEo.{S`§|=~�b�o f m y ` �PkEpLpa�;�L�S� D�M��S�/ � ªS�6�®�S�L�4� �2�S�.¥2�;²���)�¡�4���#µ��

ÍÄÎ�� �XÚ��� Ú��¬Õ��0Ù=Ý� 9_Û�� Ô$Ñ�ÓBÔ�ÕQ×®Ù=ÚÜÛ�Ý÷ W2Þ5/P<Eß½àIá + â�-Qå2â½ß + á.ß�9N/V<2á:RI7S-0á.è6<EFSà¼Þ ? á.è�1ÄèC/T1.â½á + âxàI-QàæR¼1:è°ßCáÄß6FE/Vá + / ? á.è�è6/ ? /PèC/ + Þ5/Tâ_ìí1©RIß6FEá.å D F0àIß$à¼âã19SàIß°F21\è G /Pèãß6á D àIH./Q1 + /5W�1\-0<SRI/:î=>e ` q nL`©�Egio:p:J � q n¶p;k��5b f o;{�g$�L��;�=�����;�E�:�#�4�\�������� � � ªL�C�®�L�S�P�4/ � ª��:¸ ³C�l�E�;¥������� �S��ð¢��h���������S���N�L�S£;���h���.¥��T�¬£L�;�©��²�¯� + /ÄèC/T1.â½á + à¼â�ß6F21\ßãß6FE/Q` q n©Jéß½7S<2/_à¼â + á.ß_1Q<21:è=1:-Y/Pß6/Pè½àIïP/ G ß½7S<2/.3E9EåEßãá + / G /P/P<2/Pè_è6/T1.â½á + à¼â ß6F21:ß$à ? ß6FE//5W2Þ5/P<Eß½àIá + � q nQà¼â G /TÞCR¼1:è6/ G ßCá89N/�<Ná:RI7L-Yá.è6<EFSà¼Þ:3®ß6FE/ + 1 ? å + Þ5ß½àIá + -81©7Kè=1©à¼â½/ � q n v D���� w > 2 FE/Pè6/Q-Qà D FSß92/ + á8-Y/ + ß½àIá + á ? ß6F21:ß ? 1;Þ5ß�à + ßCFE/Vßí7S<2/Üà +S? /Pè6èC/ G ? á.èãß6FE/ ? å + Þ5ß½àIá + > 2 FE/ + 321 + á.ß6FE/Pè ? å + Þ5ß½àIá + -81©7ß6è=1:<ß6F21:ß /5W�Þ5/P<Eß½àIá + 3aá;9Eß=1©à + à +ED ß6FE/ H�1©RIåE/ v Da��� w A FEáLâZ/Äè6/T1©R®ßí7S<2/Üà¼âÄo4J�g f o.{:ga>��$åEß_ß6FE/Äá + RI7Kß½7S<2/Äô + á Aã+9S7OßCFE/8ß½7S<2/TÞCFE/TÞ6ô./Pè à¼â��=b f o.{:gadÄß6FE/g y � ? á.è6- âZFEá.åSR G è6/ ? /PèQß6áKß6FE/ � q n G 1:ß=1¡Þ5á + â½ß6è6å2Þ5ßCá.èT3 A FSàÂÞCF àÂâô + á A + ß6áV92/_<2á\Rº7S-0á.èC<EFSàÂÞ:> * ß$-81©7Qß6FE/ + 92/_<2áSâ6âxàI9SRI/Vß6áÄ9EåSàæR G 1 + àæRæRIç@ßí7S<2/ G ä�1:-QRiH:1©RIåE/ v g y ma`±� D�� � w 3âxà + Þ5/ÄßCFE/Äß½7L<N/TÞ6FE/TÞCô./Pè G áS/Tâ + á.ß�<2áLâ6âZ/Tâ6â°1 + 7 ? åEè6ß6FE/Pè_ß½7L<N/_à +S? á.èC-81:ß½àIá + ß6F21 + �=b f o;{�ga>2 FE/�<EèCá.9SRI/P- à¼â_ß6FSå2â_ß6FE/81:92â½/ + Þ5/Qá ? â½ß=1:ßZàÂÞQÞ5á +E+ /TÞ5ßZàºá +Æ? èCá.- /5W�Þ5/P<EßZàºá + âVß6F21:ßV1:è6/Qè=1�àÂâZ/ G 1 + G ß6FE/

áEÞPÞ5åEè6è6/ + Þ5/Tâ A FE/Pè6/ ß6FE/P7 1:è6/VßCè=1:<E<2/ G > U + á.ß6FE/Pè_/5W21:-0<SRI/ A á.åSR G 9N/Qß6FE/Äá + / á ? 1 ? å + Þ5ßZàºá + è51©à¼âxà +ED � q nA àIß6F 1 + à + ß6/ D /Pèãá;è°1Q92áSá:RI/T1 + H�1©RIåE/.3 G /P<2/ + G à +ED á + â½á.-Y/ Þ5á + G àIß½àIá + > 2 FE/ + 3�à + ß6F21:ß°ÞP1.âZ/.3 A FE/ + ß6è67;à +EDß6á0ßCè=1:<ß6FE/Tâ½/Ä/5W2Þ5/P<Eß½àIá + âP3 A /ÄÞP1 +E+ á.ß G /TÞCà G / A /PßCFE/Pèãß6FE/P7 A àæRóR�FEá:R G à + ß6/ D /Pè=â á.è�92áSá:RI/T1 + H�1©RIåE/TâP>

ÐÒÑ�Ô �¬Ó»Ù=ÝaÔÖÝ�! #"%$'&�(*)+"-,#.0/�1 Ã32ÖÅNÃVÊ*4LÃ6587SÅ2È©Ê@À¼Ë.ÅYkio4J2c AS{TmanSnL`S`\c:9;4LÀ¼È<4>=;À@?©ÃTÅ¡¿A587SÅ2È©Ê@À¼Ë;Å0kÒ¿.ÅCB0¿EDæÀÂÁðÊ��Ò¾½ÃTÊ07S¾=Å�Á Ê*4SÃ2Ö¾CÁPÊBÃFDæéë�éÅ2Ê�ËG5��ÒË.Å-9;4LÀÌÈ+4KÊ*4LÃ0¿5É.É�DóÀÌÈ5¿.Ê@À¼Ë;ÅOËH5°kÆÁ+7LÈ5È=Ã5ÃIB:Á<J�! #"%$'&�(*)+"-,#.*KL1 Ã32ÖÅNÃ�Ê*4SÃA587SÅ2È©Ê@À¼Ë;Å0�¬b©� AL{©minSnS`L`.c-9;4LÀÌÈ+4M=;À@?©ÃTÅÆ¿N5+7LÅNÈTÊ@ÀÌË.ÅKkX¿;ÅOBK¿PDæÀÂÁðÊ �X¾½ÃTÊ07S¾5ÅEÁ�Ê*4SÃDæÀIÁPÊBËH5ÄÊ*4LÃQ¾íÃ4Á87QDæÊÌÁÄËG5VÁ+7LÈ5È=Ã4Á=Á*5+7�Da¿5É.É�DóÀÌÈ5¿.Ê@À¼Ë;ÅEÁVËG5°kÒÊ@ËKÃ�DóéëQÃTÅ2ÊÌÁVËG5 �#J

Page 60: Functional programming using Caml Light Michel Mauny January 1995

� ��������� �

� ������ �� � !�� �� !#� !

¹ / G /Tâ6Þ5èZàº9N/$à + ß6FSà¼â¬ÞCF21:<Eß6/Pè®ß6FE/�äÖ1\-QR��Nà D FLß�à + <EåEß��Tá.åEßC<EåEß±-0á G /5R�1 + G â½á.-0/�á ? àIß=âa<EèZàº-ØàºßZàºH;/Öá;<2/Pè=1:ßZàºá + âP>� á.è6/ÄÞ5á.-Y<SRº/PßC/_à +S? á.è6-1:ß½àIá + 1\92á.åEß * � ÞP1 + 9N/ ? á.å + G à + ß6FE/QäÖ1:-QR�Nà D FSß_-81 + å21©R� �����,>ä�1:-QR��Nà D FLß F21.âÄ1 + àI-0<N/Pè=1:ß½àIH./Yà + <EåEß��Tá.åEßC<EåEßÄ-0á G /5R,d�1 +Æ* � á.<N/Pè=1:ß½àIá + â½FEá;åSR G 92/Þ5á + âxà G /Pè6/ G 1.â

1Kâxà G /Pç@/��¬/TÞ5ßT3±1 + G à¼âVß6FSå2â G /P<2/ + G / + ßQá + ß6FE/Qá.è G /PèVá ? /PH�1©RIå21:ß½àIá + > * � â 1:è6/Ä<N/Pè ? á.è6-0/ G á + ß6áÆÈ+4S¿.Å2ÅNÃFD ÁA àIß6Fß½7L<N/Tâ°o4J ALn©^ib©JSJi` f 1 + G p\m�gIALn©^abTJSJi` f > 2 FE/Tâ½/_ß½7L<N/Tâ�1:è6/Q¿��5ÁPÊ@¾½¿.ÈTÊ@3\à > /.>�ß6FE/5àIè�è6/P<Eè6/Tâ½/ + ß=1:ß½àIá + à¼â + á.ß1.ÞPÞ5/Tâ6âíàº9SRI/.>2 FEè6/P/ÄÞ6F21 +E+ /5RÂâ_1:è6/V<EèC/ G /5] + / G d

e {�gEc AEo4JÖ�S��)�¡�4��K2ª5¢¬�4�L�±�:�#µ ·;�S£.¥E��� �e {�gEc A.p\m�g$�L��)�¡�;��� K�ªð¢¬�P�S���\�#µ ·;�L£;¥��:� �e {�gEc AS` yLy �L��)�¡�;��� K�ªð¢¬�P�S���\�#µ ·;�L£;¥��:� �2 FE/P7 1:èC/Äß6FE/��Pâ½ß=1 + G 1\è G�� * � ÞCF21 +E+ /5R¼âPdV{:gEc AEoPJà¼â_å2â½å21©RæRI7OÞ5á +E+ /TÞ5ßC/ G ßCá8ß6FE/ ô./P7S92áL1:è G 3i1 + G <Eè½à + ßZà +EDá + ß6á{�gEcBA\p\m�g1 + G {:g�cBAS` ySy å2â½å21©RæRI7O1\<E<2/T1:è=â»á + ß6FE/Äâ6Þ5è6/P/ + >

�ÄÎ=Ï � �®ÙPÛ°×.9���=Ô × ��ÕKÔ�Ý* ß$à¼â + á.ß�<NáLâ6âxàI9SRI/Qß6áÄ<Eè½à + ß°1 + G è6/T1 G /PH./PèC70H�1©RIåE/.>��Eå + Þ5ß½àIá + â43 ? á;èÖ/5W21:-0<SRI/.321\è6/°ß½7S<Sà¼ÞP1©RæRº7 + á;ßÖèC/T1 G 1:9SRI/.3å + RI/Tâ6â_1�âZåSàºß51:9SRI/ØâZß6è½à +ED è6/P<Eè6/Tâ½/ + ß=1:ß½àIá + à¼â G /Tâíà D;+ / G 1 + G è6/T1 G à +ED â½å2ÞCF 1Qè6/P<Eè6/TâZ/ + ß=1\ß½àIá + à¼â ? á\RóRIá A / G 9L71 + à + ß6/Pè6<Eè6/Pß=1\ß½àIá + Þ5á.-Y<EåEß½à +ED ß6FE/ G /TâíàºèC/ G ? å + Þ5ß½àIá + >

¹ / ÞP1©RæRaÉi¾5À¼ÅNÊ@¿��+Dæà Ê��6ÉEÃã1Vß½7S<2/ ? á.è A FSà¼ÞCFKß6FE/Pè6/V1:è6/�à + <EåEß��©á.åEß6<EåEßã<Eè½àI-QàIß½àIH./TâÖàº-Y<SRº/P-Y/ + ß6/ G à + äÖ1:-QR�Nà D FSßT> 2 FE/ -81©à + <Eè½à + ß=1:9SRI/Qßí7S<2/Tâ 1:è6/.dê Þ6F21:è51.Þ5ß6/Pè=âPd®ß½7S<2/Qn©^ib y��ê â½ß6è½à +ED âPd®ß½7S<2/0{:g y o4J�ñ �ê à + ß6/ D /Pè5âPd�ß½7L<N/0oPJEg �ê! áL1:ß½à +ED <Ná:à + ß + åE-Q92/Pè=â4dBß½7S<2/Vk f p�b�ga>

ø#"

Page 61: Functional programming using Caml Light Michel Mauny January 1995

��� ���������� �����������)� � ���%$&��+� $&��%$&

¹ /_ô + á A 1©RæR¬ß6FE/Tâ½/Vß½7S<2/Tâ ? èCá.-§ß6FE/V<EèC/PH.àIá.å2âãÞCF21:<Eß6/Pè5âP> ò ß6è½à +ED âã1 + G ÞCF21:è=1.Þ5ß6/Pè5âBâ½åE<E<Ná.è6ß°1 + á.ß=1\ß½àIá +0? á.è/Tâ6ÞP1:<Sà +ED ß6á U ò ä *½* Þ5á G /Tâ á.è�ß6á G / + á.ßC/Äâ½<2/TÞCà¼1©RBÞ6F21\è=1.Þ5ß6/Pè=â â½å2Þ6F 1;â + / A Ræà + /.de���� �S��)�ƪð¢��:��µ� ��� e� �.M�� 3 � �S��)�ƪð¢��:��µ� ��� e� ��� � �S��)�ƪð¢��:��µ� ����� e� �©J � �S��)�ƪð¢��:��µ� ��x�� e �:{:g y o4J�ñ oTg;^ �©JabXJa` f oPJa`#oPJa{Eo�c�`����S��)� ¥E���N�P�S�§µ �5¥��:�2�4�S� ¦S�S�P¢��,�¬� ���;¦;���4���h�4�i¥E�S²�� �2 FE/ � � � ÞCF21:è=1.Þ5ßC/PèBà¼â å2â½/ G 1;âã1 + /Tâ6ÞP1:<N/�1 + G à¼â å2â½/ ? åSR ? á;è + á + ç@<Eè½à + ß=1:9SRI/Äá.è_â½<2/TÞCà¼1©RBÞ6F21\è=1.Þ5ß6/Pè=â4>

� ? Þ5á.åEè=âZ/.32Þ6F21\è=1.Þ5ß6/PèãÞ5á + â½ß51 + ß5âãÞP1 + 92/ å2â½/ G 1;âÖÞ5á + â½ß=1 + ßã<21:ß6ßC/Pè + âPde k.mSJin:gao�p\J � b � s � M u A�s � D��L��)�ƪð¢��:�§� � �4�¬�#µ ·©¸E�©� �� + ß½7L<N/TâQâ½å2Þ6Fl1;âQn©^ib y ß6F21:ßQF21©H./81 ] + àIß6/ + åE-Q92/PèQá ? Þ5á + â½ß=1 + ßÄ/5RI/P-0/ + ß=âP3 àIßQ-81©7Ò92/Kå2â½/ ? åSRãß6áÆå2â½/Ë.¾��IÉE¿.Ê@Ê@ÃT¾5ÅEÁP3 D 1:ßCFE/Pè½à +ED Þ5á + â½ß=1 + ß=â à + ßCFE/�â61:-Y/V-81:ß=ÞCFSà +ED è6åSRI/.deSf `:g�o.{ A��Ep ` f j�k.mSJan�gao�p\Je � b � u�� ` � u�� o � u�� p � u�� m � u�� � � s � g y ma`e�u A�s � kNb f {S`±�S��;¥�KE�L�S¦E�:���ƪ5¢¬�:�§� � £S�L�;� µ#·©¸E�©� �2 FE/ ]2è=â½ß�è6åSRI/_à¼âãÞCFEáLâ½/ + à ? ß6FE/V1:è D åE-Y/ + ß�-81:ß5Þ6FE/Tâ$á + /_á ? ß6FE/VÞP1.â½/Tâ4> ò à + Þ5/ ß6FE/Pè6/ àÂâ 1ÄßCá.ß=1©R2á.è G /Pè½à +ED á +ÞCF21:è=1.Þ5ß6/Pè5âP3Sß6FE/Äâ½7 + ß=1�Wéá ? ÞCF21:è=1.Þ5ß6/Pè�<21:ßCß6/Pè + â$à¼â�/ + è½à¼ÞCFE/ G A àIß6FO1 �! � � + á.ß=1:ß½àIá + deSf `:g�o.{ A f p ` y ASnSbL{S`�A f `�gSg2` y j�k;mLJan:gio:p:Je � b � � ��"�� s � g y ma`e�u A�s � kNb f {S`±�S��;¥�KS���S¦E�T�BK�ª;�;¥�� KL�2�;�L�E�T�)� ª5¢¬����� � £S�L�;�#µ ·T¸��©� �� ? Þ5á.åEè=â½/.3Eá;è6ç@<21:ß6ß6/Pè + âã1 + G ß6FSà¼â + á.ß=1:ß½àIá + ÞP1 + 92/Ä-ØàóWE/ G 321.âÖà + deSf `:g�o.{ A f `:gLgN` y j�k;mSJin:gio:p\Je � b � � ��"��´u#���� � �%$� s � g y ma`e�u A�s � kNb f {S`±�S��;¥�KS���;�S���©� �Oªð¢¬���§� � £L�S�;� µ#·T¸��T� �

*x+ ß6FE/ + /5WEß âZ/TÞ5ß½àIá + âP3 A / D àIH./Qß6FE/ -0áLâ½ßVÞ5á.-0-Yá + RI7Kå2â½/ G * � <Eè½àI-QàIß½àIH./TâVá + ß6FE/Tâ½/Q<Eè½à + ß=1:9SRI/Qß½7L<N/TâP>U Þ5á.-0<SRI/Pß6/VRæà¼â½ß½à +ED á ? <Eè6/ G /5] + / G * � á;<2/Pè=1:ßZàºá + â�à¼â D àIH./ + à + �����,>

Page 62: Functional programming using Caml Light Michel Mauny January 1995

�����B� � $&�� $" ����ÄÎ�7 ���Ä׬Õ��Ä×� èZà + ß½à +ED á + â½ß=1 + G 1\è G á.åEß6<EåEß�à¼â�<N/Pè ? á.è6-0/ G 9L7ß6FE/ ? á:RæRºá A à +EDY? å + Þ5ßZàºá + âPde � y oPJEgIALn©^ib y �L��)�ƪð¢��:�§� � �©�¬�L�#µ#·©¸E�©� �e � y oPJEgIAL{:g y o4J�ñ$�L��)� ¥E���N�P�S�}� � �T�¬�L��µ ·©¸��T� �e � y oPJEgIA�o4J�g$�S��)�¡�4��� � � �T�¬�S�#µ ·©¸E�©� �e � y oPJEgIA�k f p�b:gB�S��)�¸����S�L�t� � �©���S�#µ#·T¸��©� �� èZà + ß½à +ED à¼â �+7��°Ã©¾íÃIB.3�à > /.>8ßCFE/0/��¬/TÞ5ßÄá ? 1KÞP1©RæRÖßCáO1K<EèZà + ß½à +ED¡? å + Þ5ßZàºá + -81©7 + á.ßV92/Kâ½/P/ + àº-Y-0/ G à¼1:ß6/5RI7id 7.ÁI4LÀÌÅ�= /5W�<SRæà¼ÞCàIß½RI7¶ßCFE/ á.åEß6<EåEßY9Eå ��/PèØàÂââ½á.-Y/Pß½àI-0/Tâ0èC/ L.åSàIè6/ G 3�å + RI/Tâ6âK1Æ<EèZà + ß½à +ED ? å + Þ5ß½àIá + å2â½FE/TâYàIßàI-0<SRæà¼ÞCàºßZRº7.> ��RIå2â½FSà +ED àÂâ G á + / A àIß6FKßCFE/Äk f ma{T^ ? å + Þ5ß½àIá + de k f mi{©^��L��)�¡�;��� K�ªð¢¬�P�S���\� � � �©���S�#µ#·©¸E�©� �e � y oPJEgIAL{:g y o4J�ñ���N` fSf p��P�a�Kk f ma{©^ {:gEc A.p:mEg$�L��¬�:�S���;�P�}�O�T�¬�L��µ G H2 FE/_� y o4JEg+A©Ji` f o4Ji` ? å + Þ5ß½àIá + <Eè½à + ß5âã1 + / A Ræà + /0Þ6F21:è51.Þ5ß6/Pè°1 + G å2âZFE/Tâãß6FE/ÄâZß=1 + G 1:è G á;åEß6<EåEßTde � y oPJEgIATJa` f oPJa`±�S��)� �©���S� � � �©�¬�L�#µ#·©¸E�©� ���RIå2â½FSà +ED à¼â�è6/ L;åSàIè6/ G A FE/ +A è½àIß½à +ED â½ß=1 + G 1©RIá + /V1:<E<SRæà¼ÞP1:ß½àIá + âP3�à +KA FSà¼Þ6Fß6FE/V1:<E<SRæà¼ÞP1:ß½àIá + -1T7Qß6/PèC-Qà + 1:ß6/A àIß6FEá.åEßQ1©RæRÖ<Eè½à + ß½à +ED 92/5à +ED G á + /.> ò ß=1 + G 1©RIá + /é1\<E<SRóà¼ÞP1:ßZàºá + â�âZFEá.åSR G ß6/PèC-Qà + 1:ß6/09S7Ò1KÞP1©RæRÖß6á¡ß6FE/K` q o©g? å + Þ5ß½àIá + ì ? è6á.-�ß6FE/0o:pY-0á G åSRI/:î=3 A FSà¼ÞCF å2â½FE/Tâ_1©RæR±<2/ + G à +ED á.åEßC<EåEßãá + {:g�cBA\p\mEg81 + G {:gEc AS` ySy >

� è½à + ßZà +ED á + ß6FE/�âZß=1 + G 1:è G /PèCè6á.èãÞ6F21 +E+ /5RB{�gEcBAL` yLy à¼â G á + / A àIß6FKß6FE/ ? á:RæRIá A à +ED0? å + Þ5ß½àIá + âPde � y ` ySy ALn©^ib y �L��)�ƪð¢��:�§� � �©�¬�L�#µ#·©¸E�©� �e � y ` ySy AL{:g y o4J�ñ$�L��)� ¥E���N�P�S�}� � �T�¬�L��µ ·©¸��T� �e � y ` ySy A�o4J�g$�S��)�¡�4��� � � �T�¬�S�#µ ·©¸E�©� �e � y ` ySy A�k f p�b:gB�S��)�¸����S�L�t� � �©���S�#µ#·T¸��©� �2 FE/ ? á:RæRIá A à +ED? å + Þ5ßZàºá + <EèZà + ß=â»àIß=â°âZß6è½à +ED 1\è D åE-0/ + ß ? á:RæRºá A / G 9S7 1 + / A Ræà + /0ÞCF21:è=1.Þ5ßC/Pè°ß6á {�gEc AS` yLy 1 + Gß6FE/ + å2â½FE/TâV{:gEc AS` ySy >e � y ` ySy AL`©J�c f oPJa`±�S��)� ¥E���N�P�S�}� � �T�¬�L��µ ·©¸��T� �

Page 63: Functional programming using Caml Light Michel Mauny January 1995

�#� ���������� �����������)� � ���%$&��+� $&��%$&

�ÄÎ�� �aÛ�Õ �Ä×2 FE/Tâ½/Üà + <EåEß°<Eè½àI-QàIß½àIH./Tâ å2â½F¡ß6FE/Äâ½ß=1 + G 1\è G á.åEß6<EåEß°1 + G è6/T1 G ? è6á.-�ß6FE/ÄâZß=1 + G 1:è G à + <EåEßTde y `Sb\cBA f o4Ji`®�S��)� �©���S� � � ¥E�:�2�4�L�§µ ·©¸��T� �e y `Sb\cBAEoPJEgB�S��)� �©���S� � � �4�¬�#µ ·©¸E�©� �e y `Sb\cBA:k f pEb:g$�L��)� �©���S� � � ¸��E�L�S�#µ#·T¸��©� ��$/TÞP1:å2â½/ á ? ßCFE/5àºè + 1:-0/Tâã1 + G ß½7L<N/TâP3Eß6FE/Tâ½/ ? å + Þ5ß½àIá + â G á + á.ß + /P/ G ? åEèCß6FE/Pèã/5WE<SRÂ1 + 1:ß½àIá + >

�ÄÎ�� �L��9_Û0ÛQÔ =ÝtÚÜÛ�� =Ô�ݹ FE/ + <Eè6á D è=1\-8âãF21©H./Qß6áè6/T1 G ? è6á;-�á.è_<Eè½à + ßÄß6áY]ERI/TâP3aàIßVà¼â + /TÞ5/Tâ6âC1:è67Æß6áá.<2/ + 1 + G ÞCRIáLâZ/8Þ6F21 +E+ /5RÂâÜá +ß6FE/Tâ½/_]ERI/TâP>

������� � ����������������������! "������$#����������

� <2/ + à +ED 1 + G ÞCRIáLâíà +ED à¼â�<N/Pè ? á.è6-0/ G A àIß6FKß6FE/ ? á:RæRIá A à +ED0? å + Þ5ß½àIá + âPde p:�a`TJ AEoPJ��L��)� ¥E���N�P�S�}� � �P� K�ªð¢¬�P�S���\�#µ#·T¸��T� �e p:�a`TJ A.p:mEgB�S��)� ¥E���N�P�S�}� � �.�E��K2ªð¢��4�L�±�\�¶µ ·©¸E�©� �e n f pE{S` A�o4JÖ�S��)�¡�4��K2ª5¢¬�4�L�±�:� � � �©���S��µ ·T¸��©� �e n f pE{S` A\p\m�g$�S��)�¡�;��� K�ªð¢¬�P�S���\� � � �©���S�#µ#·©¸E�©� �2 FE/Òp\�i`©J�AEo4J ? å + Þ5ß½àIá + ÞCFE/TÞ6ôEâß6FE/¡/5WLà¼â½ß6/ + Þ5/ á ? àIß=âY]ERI/ + 1:-0/X1:è D åE-0/ + ßT3ã1 + G èC/Pß6åEè + âK1 + / A à + <EåEßÞCF21 +E+ /5Rãá + ß6F21:ßÜ]ERI/ � p\�i`©J A\p\m�gÆÞ5è6/T1:ß6/TâQ1 + / A ]ERI/¡ì,á.è ß6è6å + ÞP1:ß6/Tâ àIß�ßCá ïP/Pè6á Rº/ +ED ß6FÒà ? àIßQ/5WSàÂâZß=â5îÄ1 + Gè6/Pß6åEè + â01 + á;åEß6<EåEß8ÞCF21 +E+ /5R°á + ß6F21:ß ]ERI/.> �Bá;ß6F ? å + Þ5ßZàºá + â ? 1©àæR°à ? <N/Pè6-Qà¼â6âxàIá + â1:è6/ + á.ßâ½å&%éÞCàI/ + ß ? á.èè6/T1 G à +ED á.è A è½àIß½à +ED >'�(O$*) (+)�,.-

ê ä�RIáLâxà +EDV? å + Þ5ß½àIá + â�ÞCRIáLâ½/ãß6FE/5àIèãÞCF21 +E+ /5R�1:è D åE-0/ + ßT> ò à + Þ5/_ß6FE/5àIèÖ9N/PF21©H.àIá.è àÂâ å + â½<2/TÞCàæ]2/ G á + 1©RIè6/T1 G 7ÞCRºáSâ½/ G ÞCF21 +E+ /5R¼âP3a1 + 7Sß6FSà +ED ÞP1 + F21\<E<2/ + à + ß6FSà¼âãÞP1.âZ/ �ê ä�RIáLâxà +ED á + / á ? ß6FE/OâZß=1 + G 1:è G * � ÞCF21 +E+ /5R¼â¡ì6{:g�cBA�o4J¬3�{�gEcBA\p\m�ga3 {�gEc AS` yLy îVF21TH;/ å + <Eè6/ G à¼Þ5ß=1:9SRI//���/TÞ5ß5â �

Page 64: Functional programming using Caml Light Michel Mauny January 1995

�����B� �-����������� � ���E� ���(��� ���

��������� ��� ��������� ��$��� ��������*�������$� "��� ����� ��� �$#���������� ò á.-0/�á ? ß6FE/ ? å + Þ5ßZàºá + â�á + â½ß=1 + G 1:è G à + <EåEß��Tá.åEß6<EåEß$F21©H./ÖÞ5á.èCè6/Tâ½<2á + G à +EDÜ? å + Þ5ßZàºá + â A á.è6ô;à +ED á + Þ6F21 +E+ /5R¼âPde p:mEg.�SmEg+ASnT^ab y �S��)�¡�;��� K�ªð¢¬�P�S���\� � � ªð¢��:�§� � �T�¬�L��µ´·©¸��T� �e p:mEg.�SmEg+AS{�g y oPJEñB�S��)�¡�;��� K�ªð¢¬�P�S���\� � � ¥E���N�4�L�}� � �T�¬�S�¶µt·T¸��T� �e oPJS�LmEgIALn©^ib y �L��)�¡�4��K2ª5¢¬�4�L�±�:� � � ªð¢��:�tµ ·T¸��©� �e oPJS�LmEgIA f oPJa`®�L��)�¡�4��K2ª5¢¬�4�L�±�:� � � ¥E���N�P�S�§µ#·T¸��T� �

��������� ����������*� 2 FE/_/5W�Þ5/P<EßZàºá + �.J2c A.p;k+A:kio f `ãà¼â�è=1©à¼â½/ G A FE/ + 1 + à + <EåEß�á.<2/Pè=1\ß½àIá + ÞP1 +E+ á.ß�Þ5á.-0<SRI/Pß6/V92/TÞP1\å2â½/Vß6FE/_/ + G á ?ß6FE/_]ERI/QF21.â�9N/P/ + è6/T1.ÞCFE/ G >e �.J2c A.p;k+A:kio f `±�S��)�Æ� � �}µ /.�¬²�KE�:¸ K.¸2�;�2�2 FE/°/5W2Þ5/P<Eß½àIá + {:�2{ A�A��;�2{ AL` ySy p y ì��;�N{�AS` ySy p y ? è6á.-§ßCFE/°-0á G åSRI/Q{��N{Sî±à¼â$è=1©à¼â½/ G A FE/ + â½á;-0/°-1 + àI<Eç

åSR¼1:ß½àIá + á ? ]ERI/Tâ»à¼â ? á.è69Sà GEG / + 9S7ß6FE/Äá.<N/Pè=1:ß½à +ED âZ7�â½ßC/P- de p:�a`TJ AEoPJ}�\b � y bSnSb\c�b � y b����L�>4��ª;�.�©�S¢��#� � ªS�6�®�S�L�4� �é¥ �N¥ K�K�!��N¥ K��©�L�N�:� �P�L£:�2�Eª;�L²S�L£:�N�¨�#"i��¥S�2ª5¢ ¸N�.�2���:� ²S�:�i�Sª.�S�:��� �2 FE/ ? å + Þ5ß½àIá + âVß6F21\ß A /�F21©H./Qâ½/P/ + à + ßCFSàÂâVÞCF21:<Eß6/PèV1:è6/0â½å&%KÞCàº/ + ß ? á.è°á;åEè + /P/ G âP> � 1 + 7-0á.è6/Q/5WSà¼â½ß

ì,å2â½/ ? åSR±-81�à + RI7 A FE/ +¡A á.è6ô;à +EDYA àIß6F]ERI/Tâ5î»1 + G 1:è6/ G /Tâ6Þ5è½àI9N/ G à + �����,>ÐÒÑ�Ô �¬Ó»Ù=ÝaÔÖÝ�! #"%$'&�(*)+"%$#.0/�1 Ã32ÖÅNÃ0¿5+7LÅNÈTÊ@ÀÌË.Å n\p\���IA:kio f `ÆÊ@¿'&�ÀÌÅ�=¡Ê09�Ë2ADæÃTÅ2¿;ë�Ã4Á)(xËG50Ê��CÉ�ÃY{�g y o4JEñ�*8¿:Á0¿.¾0= 7LëQÃTÅNÊÌÁ,+¿.ÅCBÒÈ=ËðÉ��:À¼ÅQ=ÆÊ*4Là È5Ë.Å2Ê@éÅ2ÊÌÁ0ËG5KÊ*4LÃ2�¾6ÁPÊ�2�DæÃKË.Å�Ê*4Là ÁðÃ5È=Ë;ÅOB Ë;Å2à J.-�¾=¾½Ë.¾ëQÃPÁ5Áð¿�=.ÃPÁë�7;ÁPÊ �6à Éi¾5ÀÌÅ2Ê@ÃIBOË;Å{:g�cBAL` ySy J�! #"%$'&�(*)+"%$#.*KL1 Ã32ÖÅNÃ8¿ 5+7SÅ2ÈTÊ@ÀÌË.Å nXÊ@¿'&:À¼ÅQ=Æ¿ 2�DæÃTÅN¿.ëQÃ8¿\Á8¿.¾0=�7SëQÃTÅ2ÊV¿;ÅOBYÉi¾5À¼ÅNÊ@À¼ÅQ=ÆË.Å�Ê*4LÃKÁPÊ@¿.ÅCB.¿.¾GBË�7SÊ É 7SÊÖÊ*4SÃÄÅO7Së �6é¾°ËH5 È<4L¿.¾½¿.ÈTÊ@é¾6ÁV¿.ÅCBEDæÀÌÅ2ÃPÁã¿5É;É�Ã5¿.¾=ÀÌÅ�=YÀ¼Å¡Ê*4Là 2ADæà J/-Ö¾5¾íË;¾°ëQÃPÁ5ÁP¿F=.Ã4Á°ë 7.ÁPÊ �CÃ$Éi¾5À¼ÅNÊ@à B0Ë;Å{:g�cBAL` ySy J02143+" - àIß$àÂâ D áSá G <Eè51.Þ5ß½à¼Þ5/°ßCá G /PH./5RIá.<K1V<Eè6á D è=1:-tà + G /5] + à +ED â½-81©RæR ? å + Þ5ß½àIá + âP> U âíà +ED Rº/ ? å + Þ5ß½àIá + G á\à +EDß6FE/ A FEá:RI/ A á.è6ôYà¼âãå2âZå21©RæRº7¡F21:è G /PèãßCá G /P9Eå D 1 + G ß6á0èC/T1 G > ¹ àIß6FÆâ½-81©RæR ? å + Þ5ß½àIá + âP3Ná + /�ÞP1 + ß6è=1;Þ5/Vß6FE/P-1 + G â½/P/ ß6FE/Ä1:è D åE-0/ + ß5âBßCFE/P7 1:è6/ÄÞP1©RæRI/ G á + 1 + G ß6FE/Vè6/TâZåSRºß_ß6FE/P7<Eè6á G å2Þ5/.>

Page 65: Functional programming using Caml Light Michel Mauny January 1995

��� ���������� ���� ������)� � ���%$&��+� $&��%$&

Page 66: Functional programming using Caml Light Michel Mauny January 1995

� ��������� ���

� !�� ' ��� � ��� � � ��� � ' � �

*,+ ß6FE/ + /5WEßB<21:è6ß�á ? ß6FE/Tâ½/_Þ5á.åEè=â½/ + á;ß6/TâP3 A / A àæRæRaàº-Y<SRº/P-Y/ + ßã1Vâ½-81�RóR ? å + Þ5ßZàºá + 1©R2R¼1 +ED å21 D /.> � 1:è=âxà +ED H�1�Róà G<Eè6á D è=1:-8â®á ? ß6FSà¼â R¼1 +ED å21 D /ãè6/ L;åSàºèC/Tâ A è½àIß½à +ED 1 RI/5WLà¼ÞP1©R±1 + 1©RI7SïP/Pèã1 + G 1Ü<21:è=â½/Pè ? á;è�ß6FE/ãR¼1 +ED å21 D /.> �Eá.è$ß6FE/<EåEè6<NáLâ½/á ?ãA è½àIß½à +ED /T1.âxàæRI7Xâ½å2ÞCFX<Eè6á D è=1:-8â43�äÖ1:-ØR �Nà D FLßQ<Eè6á:H;à G /Tâ�1¡â½<2/TÞCà¼1©R G 1:ß51 â½ß6èCå2Þ5ß6åEè6/.dYÁðÊ@¾½Ã5¿.ë Áð>2 FE/5àIèã-81�à + å2â61 D /ãà¼â$ß6áÄ9N/_à + ß6/Pè ? 1.Þ5/ G ß6áÜà + <EåEß_Þ6F21 +E+ /5R¼â�á;è»âZß6è½à +ED âB1 + G ß6áQ9N/°-81\ß=Þ6FE/ G 1 D 1�à + âZßãÁPÊ@¾íÃ5¿.ëÉ�¿;Ê@Ê@ÃT¾5ÅEÁP>

Ï��ÜÎ5Ï �Ü× ��Ô 9 Ýò ß6è6/T1\-8â®92/5RIá +ED ß6áQ1 + 1:92â½ßCè=1.Þ5ß G 1:ß=1_ß½7S<2/.d®ß6FE/5àIèÖ1;Þ5ß6å21©RièC/P<Eè6/Tâ½/ + ß=1:ß½àIá + èC/P-81©à + â�FSà GEG / +? è6á.-�ß6FE/ãå2âZ/PèT>@ á A /PH./Pè©3PàIß®à¼âBâ½ßZàóRæR2<NáLâ6âxàI9SRI/°ßCá°9EåSàæR G âZß6è6/T1:-8â�/5àIß6FE/Pè �ð9L7VF21 + G�� á;è�9L7 å2âxà +ED â½á.-0/�<Eè6/ G /5] + / G ? å + Þ5ßZàºá + âP>����!� #����� ������� ����� �2 FE/0ß½7S<2/{:g y `LbP�Æà¼â 1<21:è=1:-0/PßC/Pè½àIïP/ G ß½7L<N/.> � + /KÞP1 + 9EåSàæR G âZß6è6/T1:-8â á ? à + ß6/ D /Pè5âP3¬á ? Þ6F21\è=1.Þ5ß6/Pè=â á.èVá ?1 + 78á;ß6FE/Pèãß½7L<N/.> ò ßCè6/T1:-8â�èC/TÞ5/5àºH;/�1â½<2/TÞCà¼1©RBâ½7 + ß=1�W�3;RIáLá;ô.à +ED RæàIô./Äß6FE/ á + / ? á.è$Ræà¼â½ß=âP> 2 FE/ /P-0<Eß½7éâZß6è6/T1:-à¼â A è½àIß6ß6/ + de$v ö � w �S��)��³ K���¥E�:�i�;���§µ ·;�S£.¥E��� �U + á + /P-0<Eß½7Kâ½ß6è6/T1\-}<NáLâ6â½/TâCâ½/Tâ�/5RI/P-0/ + ß=âãßCF21:ß°1:è6/ A è½àIß6ß6/ + <Eè6/TÞ5/ G / G 9L7ß6FE/ � � � ì L;åEá.ß6/:îÖÞCF21:è=1;Þ5ß6/PèT>e$v ö �6M�� � D�� ��� � w �S��)�¡�4����¥E�:�i�;���§µ ·;�S£.¥E��� �÷ RI/P-0/ + ß=â ß6F21:ßã1:è6/ + á;ßã<Eè6/TÞ5/ G / G 9S7 �C� � 1:è6/QÁ+7 �ðÁðÊ@¾½Ã5¿.ë ÁBß6F21:ßã1:è6/V/5WE<21 + G / G à + ß6FE/V/ + ÞCRIáLâíà +ED âZß6è6/T1:- de$v ö �6M�� v ö;� D������ � w � �� � w �S��)�¡�4����¥E�:�i�;���§µ ·;�S£.¥E��� �eSf `:gt{¶j v ö �T�\b �an�� � w o4J v ö�{®� �T�Tc�`�k¬� � w �S��)� ¥E���N�P�S��¥��:�a�.���}µ#·.�S£;¥��:� �2 FSå2âP32â½ßCè6/T1:-)Þ5á + ÞP1:ß6/ + 1\ß½àIá + ÞP1 + 9N/ G /5] + / G 1.âPd

�.ø

Page 67: Functional programming using Caml Light Michel Mauny January 1995

��� �-�������� ������ �.� "���� �M�����E� �� ���� ��

eSf `:gt{�g y `SbP�.ASn\p\JanLb:g#{lgtj v ö�{®� g � w �S�¥E���a�.��� K�ª;�P�±ª;�L���#³6�h¥E���a�;���}� � ³6�´¥��:�i�;���&� � ³6�´¥��:�i�;��� µt·T¸��T� ��$åSàæR G à +ED â½ß6è6/T1\-8â_à + ß6FSà¼â A 1T7ÆÞP1 + 92/Kå2â½/ ? åSR A FSàæRI/ ßC/Tâ½ß½à +ED 1¡<21:è=âíà +ED¡? å + Þ5ß½àIá + á.è G /5] + à +ED 1RI/5WLà¼ÞP1©R1 + 1©RI7SïP/Pèì,ß=1:ô;à +ED 1.â 1:è D åE-0/ + ß�1¡â½ß6è6/T1\- á ? Þ6F21:è51.Þ5ß6/Pè=â 1 + G è6/Pß6åEè + à +ED 1¡â½ß6è6/T1:- á ? ß6á.ô./ + âðî=> ò ß6èC/T1:-Þ5á + ÞP1:ßC/ + 1:ß½àIá + B.ËTÃ4Á°Å2Ë.Ê�È5Ë5É��ãâZåE92â½ß6è6/T1:-âPd®ß6FE/P701:è6/°âxàI-0<SRI7<EåEß$à + ß6FE/Vâ61:-0/_â½ß6è6/T1:-¡> ò à + Þ5/Qìí1.â A / A àæRóRâ½/P/ R¼1:ß6/PèPîãâ½ß6èC/T1:-)-81:ß5Þ6FSà +ED F21.â_1 G /TâZß6è6å2Þ5ß½àIH./Q/��¬/TÞ5ß°á + â½ß6èC/T1:-8âÜìíâ½ß6è6/T1\-8âã1:è6/ <EFL7Eâxà¼ÞP1©RæRI7 �5/T1:ß6/ + � 9L7â½ß6èC/T1:-�-81:ß=ÞCFSà +ED î=3S<21:è=âxà +ED v ö�gB�¡g � w A àæRóR�à + ? 1;Þ5ßÖ<21\è=â½/_g8á + RI7á + Þ5/.d�ß6FE/_]2è5â½ß�á�ÞPÞ5åEè6èC/ + Þ5/Äá ? g A àæRóR92/QÞ5á + â½åE-0/ G 3N1 + G ß6FE/ÄâZ/TÞ5á + G áEÞPÞ5åEè6è6/ + Þ5/ A àæRóR�92/ /P-0<Eß½789N/ ? á;è6/_àIß=â�<21:è=âíà +EDA àæRæR¨9N/Ä<N/Pè ? á;è6-0/ G >

*x+ ßC/Pè ? 1;ÞCà +ED â½ß6è6/T1:-â A àIß6F 1 + à + <EåEßVÞ6F21 +E+ /5RBÞP1 + 9N/ G á + / A àIß6FKß6FE/ ? å + Þ5ß½àIá + de {�g y `SbP�.A.p.kIASnT^abTJSJa` f �L��)�¡�4��K2ª5¢¬�4�L�±�:� � � ªð¢��:��¥��:�i�;��� µt·T¸��T� �è6/Pß6åEè + à +ED 1¡â½ß6è6/T1:- á ? ÞCF21:è=1;Þ5ß6/Pè=â A FSà¼ÞCFz1:èC/0è6/T1 G ? è6á.- ßCFE/éÞCF21 +E+ /5R»1\è D åE-0/ + ßT> 2 FE/0/ + G á ? âZß6è6/T1:-A àæRæR Þ5á\à + ÞCà G / A àIß6F¡ß6FE/V/ + G á ? ß6FE/_]ERI/�1;â6â½áEÞCàÂ1\ß6/ G ß6á0ß6FE/ÄÞCF21 +E+ /5R,>

*x+ ß6FE/�âC1:-0/ A 1©7.3Lá + /ÄÞP1 + 9EåSàæR G ß6FE/QÞ6F21\è=1.Þ5ß6/Pèãâ½ß6èC/T1:-�1.â6âZá�ÞCà¼1:ß6/ G ßCá81QÞ6F21:è51.Þ5ß6/Pè°â½ßCè½à +ED å2âxà +ED de {�g y `SbP�.A.p.kIAS{�g y o4JEñB�S��)� ¥E���N�P�S�}� � ª5¢¬����¥E���a�;���§µ ·©¸E�©� �eSf `:gt{¶jt{:g y `LbP�(A\p;k+AS{:g y oPJEñ �\b �an����S�¥ �ƪð¢��:�t¥E���a�.���§µ ·;�L£;¥��:� �

����!��� � ��$� � � � $� �������� � �!���������$���ò ß6è6/T1\-�/5WE<Eè6/Tâ6âxàIá + â¡1:è6/Æâ½åE9E-QàIß6ß6/ G ßCá Dæ¿����XÃ�?T¿�D 7S¿.Ê@ÀÌË.Å23»à > /.>�ß6FE/P7¶1\è6/Æ/���/TÞ5ßZàºH;/5Rº7h9EåSàæR G á + RI7 A FE/ +è6/ L;åSàIè6/ G > 2 FSàÂâ à¼â�å2â½/ ? åSRaà + ß6F21:ß�àIßã1©RæRIá A â ? á.è�ß6FE/_/T1.â½7Y-81 + àI<EåSR¼1:ß½àIá + á ? �=à + ß6/Pè=1;Þ5ß½àIH./ � â½ß6è6/T1:-â®RæàIô./Vß6FE/â½ß6èC/T1:- 9EåSàæRºß ? è6á.- ß6FE/â½ß=1 + G 1:è G à + <EåEßT> * ? ßCFSàÂâ A 1.â + á.ßÄßCFE/8ÞP1.â½/.3�à > /.>Qà ? â½ß6è6/T1:-â A /PèC/ÄàI-0-Y/ G àÂ1\ß6/5RI7Þ5á.-0<SRI/Pß6/5RI7KÞ5á.-0<EåEß6/ G 3S1V<Eè6á D è=1:-&/PH�1©RIå21:ß½à +ED �©{:g y `Sbð�(A\p;kIALn©^ib©JSJi` f {�gEcBA�o4J � A á.åSR G è6/T1 G /PH./Pè67Sß6FSà +EDåE<Qß6áV1 + / + G ç@á ? çÌ]ERI/ãá + â½ß=1 + G 1:è G à + <EåEß�9N/ ? á.èC/ D àºH;à +ED Þ5á + ß6è6á:RLßCá°ß6FE/�è6/TâZß±á ? ßCFE/B<Eè6á D è=1:- > �EåEè6ß6FE/PèC-0á.è6/.3R¼1:ïP7K/PH�1�Rºå21\ß½àIá + á ? â½ß6è6/T1\-8âã1©RæRIá A â ? á.è°ßCFE/V-81 + àI<EåSR¼1:ß½àIá + á ? à + ] + àIß6/8â½ß6èC/T1:-8âP> U â_1 + /5W21:-0<SRI/.3 A /QÞP1 +9EåSàæR G ßCFE/_à + ] + àIß6/Qâ½ß6è6/T1\-)á ? à + ß6/ D /Pè=âP3�å2âxà +ED âxà G /Ä/��¬/TÞ5ß=â�ßCáØâZFEá A <Eè6/TÞCà¼â½/5RI7 A FE/ + Þ5á.-0<EåEß=1\ß½àIá + â�áEÞPÞ5åEèTdeSf `:g y `Sn o4J�gN{�A:k y p©��J je v ö �\|Z� y o4J�gIAEoPJEg�J��K� y o4J�gIASnT^ab y � � � k f ma{T^�{:g�cBA\p\mEgB�J¬�¬�e oPJEgN{�A:k y p©� |ZJ+C�D;�� w �L��4���;¥�K.¸S�2��� � �4�¬� � � �4���´¥��:�i�;��� µt·T¸��T� �eSf `:g�oPJEg2{�j o4JEg2{ A�k y pT��M �L��4���;¥��Æ�P�¬�h¥��:�a�.���}µ#·.�S£;¥��:� �¹ / + á.ß½à¼Þ5/Kß6F21:ß + áÆ<Eè½à + ß½à +ED á�ÞPÞ5åEèCè6/ G 1 + G ß6F21:ßQß6FE/<Eè6á D è=1\- ß6/Pè6-Øà + 1\ß6/TâPd0ßCFSàÂâYâ½FEá A âVß6F21\ß + á + /8á ?ß6FE/Q/5RI/P-0/ + ß=â_F21©H./Q92/P/ + /PH:1©RIå21:ß6/ G 1 + G ß6F21\ß°ß6FE/ à + ] + àIß6/8â½ßCè6/T1:-�F21.â + á.ßV92/P/ + 9EåSàæRIßT> ¹ / A àæRæRÖâ½/P/ à +ß6FE/ + /5WEßÄâ½/TÞ5ß½àIá + ß6F21:ß_ß6FE/Tâ½/0âxà G /Pç@/��¬/TÞ5ß=â A àæRæRÖáEÞPÞ5åEèVá + G /P-1 + G 3aà,> /.> A FE/ + ßC/Tâ½ß=â A àæRóRB9N/ + /P/ G / G 9S7 1-81:ß5Þ6FSà +EDQ? å + Þ5ß½àIá + á + â½ß6è6/T1:-âP>

Page 68: Functional programming using Caml Light Michel Mauny January 1995

����� � �5�.� "���� #�� ���&� � � ��� �E� �� ����� �� ���

Ï��ÜÎ 7 �Ü× ��Ô 9 9�×¬Ó �YÙPÛ�; 9_Û � Õ?9 �¬ÝaÔ �¬Ý2 FE/Kâ½7 + ß=1�W ? á.èQ9EåSàæR G à +ED â½ß6èC/T1:-8âÄÞP1 + 92/å2â½/ G ? á;èÄ<21:ß6ßC/Pè + ç@-81:ß=ÞCFSà +ED á�H;/PèÄß6FE/P- > @ á A /PH./Pè©3¨âZß6è6/T1:--81:ß5Þ6FSà +ED à¼â -0á.è6/ÄÞ5á.-Y<SRº/5W ßCF21 + ß6FE/Vå2â½å21©R®<21:ß6ß6/Pè + -1:ß=ÞCFSà +ED >

�����.� � ��$� � � � �4�$�$#����� � ��� ������ �$� ��a/Pßãå2â_â½ß=1\è6ß A àIß6F 10âxàI-0<SRI/Q/5W�1\-0<SRI/.deSf `:ghJi` q gtjlk;mSJin:gio:p\J v ö � q w s q �S��±� � �)�#³6�´¥��:�i�;���&� � ³6��µ ·T¸��©� �2 FE/�Ja` q g ? å + Þ5ß½àIá + è6/Pß6åEè + â ß6FE/$]2è=â½ß�/5RI/P-0/ + ßÖá ? àIß=âBâZß6è6/T1:-�1:è D åE-Y/ + ßT3.1 + G ? 1�àóR¼â¨à ? ß6FE/_â½ß6è6/T1:-tà¼â /P-0<Eß½7ideSf `:gt{¶j v ö �6M � � D�� ��� w �L�¥ �¡�4����¥E�:�i�;���§µ ·;�S£.¥E��� �e Ji` q gt{®�L��)�¡�4���#µ��

e Ji` q gt{®�L��)�¡�4���#µ��e Ji` q gt{®�L��)�¡�4���#µ��e Ji` q gt{®�L�>4��ª;�.�©�S¢��#� � ªS�6�®�S�L�4� ���i�:��¥�� K\¸N�S�.�S�\�a�¹ /ÒÞP1 + âZ/P/ ? èCá.-�ßCFE/Ò<Eè6/PH;àºá;å2âK/5W21:-0<SRI/TâKß6F21\ßKß6FE/Òâ½ß6è6/T1:-�<21\ß6ß6/Pè + v ö � q w -81\ß=Þ6FE/TâÆ¿;Å ÀÌÅ2ÀÌÊ@À¼¿ DÁPà =;ë�éÅ2Ê�á ? ß6FE/8â½ßCè6/T1:- > ò å2ÞCFX1<21:ß6ß6/Pè + -Qå2â½ßV92/Qè6/T1 G 1;â �5ß6FE/0â½ß6è6/T1\- A FEáSâ½/ ]2è=â½ßV/5RI/P-0/ + ßV-81:ß=ÞCFE/Tâq � > ��åEè6ß6FE/Pè6-Yá.è6/.3Ná + Þ5/8â½ß6èC/T1:-�-1:ß=ÞCFSà +ED F21.âVâ½å2ÞPÞ5/P/ G / G 3®ß6FE/0â½ß6èC/T1:- 1:è D åE-Y/ + ß_F21.â_92/P/ + ÉO4��©ÁðÀÌÈ5¿�D@D �ëQËFB.À 2ÖÃIBÄ1 + GKG áS/Tâ + á.ßãÞ5á + ß51©à + 1 + 70RIá +ED /Pèãß6FE/V<21:è6ß ß6F21:ßãF21.â»92/P/ + èC/TÞ5á D.+ àIïP/ G 9S78ßCFE/VJa` q g ? å + Þ5ß½àIá + >

* ?±A /°Þ5á.-0/_921.ÞCô0ß6á ß6FE/ãà + ] + àIß6/Qâ½ß6è6/T1:-&á ? à + ß6/ D /Pè=âP3 A / ÞP1 + â½/P/_ß6F21:ß�ß6FE/VÞP1©RæR¼â�ß6áVJa` q gQ<Eè6á:H.á.ô;/ãß6FE//PH�1�Rºå21\ß½àIá + á ? ß6FE/ + /TÞ5/Tâ6âC1:è67K<21:è6ß�á ? ß6FE/Qâ½ß6è6/T1:-¡de Ji` q g�o4J�gN{®�8Ja` q g§o4JEg2{®�Ji` q g�o4J�gN{®�L������§�)�­�P�¬��µ�2 FSå2âP3.â½å2ÞPÞ5/Tâ6âíàºH;/°ÞP1©RæR¼â�ß6á Ji` q gVè6/P-0á:H./BßCFE/B]2è5â½ß�/5RI/P-0/ + ß5â®á ? ß6FE/ãâ½ßCè6/T1:-tå + ß½àæREàIß�92/TÞ5á;-0/Tâ®/P-0<Eß½7.> 2 FE/ + 3Ja` q g ? 1©àæR¼â A FE/ + 1\<E<SRóàI/ G ß6áKß6FE/0/P-Y<Eßí7Æâ½ß6è6/T1\- 3¬âxà + Þ5/.3�à + ß6FE/ G /5] + àºßZàºá + á ? Ja` q ga3aß6FE/Pè6/ à¼â + áOâZß6è6/T1:-<21:ß6ßC/Pè + ß6F21:ß�-81:ß5Þ6FE/Tâã1 + à + àIß½à¼1©RBâ½/ D -Y/ + ßãá ? ß6FE/V/P-Y<Eßí7Kâ½ß6èC/T1:- >

* ß�à¼âãá ? Þ5á.åEè=â½/ <2áLâCâxàI9SRº/Qß6á0â½<N/TÞCà ? 7Æâ½/PH./Pè=1©R±â½ßCè6/T1:-�<21:ß6ß6/Pè + âã1.â$à + deSf `:ghJi` q gtjlk;mSJin:gio:p\Je v ö � q w s qe�u�v ö w s y bEo.{S`}|5~EbEo f m y `#�:`P�E�EgS���;�¬�S��±� � �)�#³6�´¥��:�i�;���&� � ³6��µ ·T¸��©� �

Page 69: Functional programming using Caml Light Michel Mauny January 1995

��� �-�������� ������ �.� "���� �M�����E� �� ���� ��

äÖ1.âZ/Tâã1:è6/Vß6èZàº/ G à + ß6åEè + 3 ? è6á.-)ßCá.<8ßCá092á.ßCß6á.- >ò ßCè6/T1:- <21:ß6ßC/Pè + Þ5á.-0<Ná + / + ß=âÄ1:èC/ + á.ßÄèC/Tâ½ß6è½à¼Þ5ß6/ G ßCá L;åEá.ß6/ G <21:ßCß6/Pè + â ì@à + ß6/ + G / G ß6áK-81:ß5Þ6FXâZß6è6/T1:-

/5RI/P-0/ + ß=â5î=3a9EåEßÄÞP1 + 9N/Ø1�RÂâZá ? å + Þ5ß½àIá + ÞP1©RæRÂâØìíÞ5á.è6èC/Tâ½<2á + G à +ED ß6á + á + ç@ß6/PèC-Qà + 1©R¼âP3aà + ß6FE/ D è=1:-Y-81:è_ß6/Pè6-QàIç+ á:RIá D 7Nî=>��Eå + Þ5ß½àIá + â_1:<E<N/T1:è½à +ED 1.âãâ½ßCè6/T1:-)<21:ßCß6/Pè + Þ5á.-0<Ná + / + ß=â°1\è6/_à + ß6/ + G / G ß6áY-81:ß=ÞCF â½åE92â½ß6èC/T1:-8â�á ?ß6FE/0â½ß6èC/T1:-�1:è D åE-0/ + ß©d�ß6FE/P7O1:èC/�ÞP1©RæRI/ G á + ß6FE/Q1.Þ5ß6å21©RBâ½ß6è6/T1\- 1:è D åE-0/ + ßT321 + G ß6FE/P7Æ1:è6/ ? á:RæRIá A / G 9S7 1<21:ß6ßC/Pè + A FSà¼ÞCFÒâ½FEá.åSR G -81:ß=ÞCF ß6FE/Qè6/TâZåSRºß_á ? ß6FSà¼âVÞP1©RæR,> ��á.èã/5W21:-0<SRI/.3Nà ?ÖA / G /5] + /81Y<21:è=âZ/Pè°è6/TÞ5á D.+ àIï5à +ED1 + á + /P-Y<Eßí7Kâ½/ L;åE/ + Þ5/Qá ? ÞCF21:è=1.Þ5ß6/Pè5â � b � deSf `:gt{L`�� ASblje f `:g y `Ln�{S`��#jhk;mLJan:gio:p:Je v ö � � b � �Ò{S`�� f w s � b ��rSrífe u�v ö w s vxwe oPJ k;mSJin:gio:p\J v ö � � b � �Æ{S`�� f w s � b �ErLr½f �S�¥2��� K��)�Òªð¢¬����¥E���a�.���}� � ª5¢¬�����E�.¥E��µ ·©¸E�©� �A /Æå2â½/ G ß6FE/Æè6/TÞ5åEè=âxàIH./5RI7 G /5] + / G ? å + Þ5ß½àIá + {S`��zà + âíà G / ß6FE/Òâ½ß6è6/T1:- <21:ß6ßC/Pè + á ? ß6FE/¡]2è=â½ßKè6åSRI/.> 2 FSàÂâG /5] + àIß½àIá + â½FEá.åSR G 9N/Äè6/T1 G 1.âPd

ê à ? ßCFE/ØâZß6è6/T1:-�à¼â + á.ß_/P-0<Eß½7 1 + G à ? àIß=â»]2è=â½ß_/5RI/P-0/ + ßV-1:ß=ÞCFE/Tâ � b � 3a1:<E<SRI7Ò{S`��ß6áß6FE/ è6/Tâ½ß_á ? ß6FE/â½ß6è6/T1:-¡3.RI/Pß f 92/ ß6FE/Vè6/Tâ½åSRIß_á ? ß6FSà¼â°ÞP1©RæR¨1 + G è6/Pß6åEè + � b �ErSríf 3

ê á.ß6FE/Pè A à¼â½/.3 ? 1©àæRBìxè=1©à¼â½/��Nb y {L` A:k2bEo f m y `Sî �1 + G {L`��0â½FEá;åSR G 9N/Vè6/T1 G à + ß6FE/ âC1:-0/ A 1©7ì,/5W2Þ5/P<Eß�ß6F21:ßT3Sâxà + Þ5/_àºß è6/TÞ5á D.+ àIïP/Tâ$<2áLâCâxàI9SRº7K/P-Y<Eßí7â½/ L.åE/ + Þ5/Tâá ? � b � 3.àIß + /PH./Pè ? 1©àæR¼â5î=>��/Tâ6â�á.<N/Pè=1:ß½àIá + 1©RæRI7.3 A /ÄÞP1 + è6/T1 G àIß 1;âPd��P1 + á + ç@/P-0<Eß½7Kâ½/ L;åE/ + Þ5/Äá ? � b � â½ß=1:è6ß5â A àIß6FÆ1 + � b � 3�1 + G àÂâ? á:RæRºá A / G 9S7K1Q<2áLâCâxàI9SRº7K/P-Y<Eßí7Kâ½/ L;åE/ + Þ5/Qá ? � b � >

U + á.ß6FE/Pè�/5W21:-0<SRI/ àÂâ»ß6FE/°èC/TÞ5á D.+ àIß½àIá + á ? 1 + á + ç@/P-0<Eß½78â½/ L;åE/ + Þ5/Vá ? � b � ? á:RæRIá A / G 9S781 � � � 3;á.èã1 � � �1©RIá + /.deSf `:gt{L`�� ASb A � j�k;mLJan:gio:p:Je v ö�{S`��BASb f � � � � � w s f��Bv � � �½we�u�v ö � � � � w s v � � �½w �S�¥2��� K�� KE£ � ª5¢¬����¥E���a�;���}� � ª5¢¬�:�#�E�;¥���µ ·©¸E�©� �@ /Pè6/.3.á.<N/Pè=1:ß½àIá + 1�RóRI7.3Sá + Þ5/°1 + � b � F21;â®92/P/ + è6/TÞ5á D.+ àIïP/ G 3.ßCFE/�]2è=â½ß�-81\ß=Þ6FSà +ED è6åSRI/�à¼âBÞCFEáLâ½/ + > U + 7 ? åEèCß6FE/Pè-Qà¼â½-81\ß=Þ6F«ì,/5àIß6FE/Pè ? è6á;- {S`��BALbá.è ? è6á.- ß6FE/QR¼1.â½ß � � � î A àæRæRãè=1©à¼â½/K1��Nb y {L` AS` ySy p y /5W2Þ5/P<Eß½àIá + 3B1 + G ß6FE/A FEá:RI/<21:è=âxà +EDÆA àæRæR ? 1©àæR,> � + ß6FE/á.ß6FE/Pè F21 + G 3®à ? ß6FE/Ø]2è=â½ß�ÞCF21:è=1;Þ5ß6/PèVà¼â + á.ß01 + � b � 3${L`��BALb A àæRóR_è=1©à¼â½/�Nb y {L` A:k2bEo f m y `E3L1 + G ßCFE/�â½/TÞ5á + G èCåSRº/Yì v ö � � � � w s � � 6î A àæRóR®92/ÄßCè½àI/ G >2 FSàÂâ 9N/PF21TH;àIá.è à¼âÄß½7S<Sà¼ÞP1©Rãá ? <Eè6/ G à¼Þ5ß½àIH./K<21:è=â½/Pè5âP> � èC/ G àÂÞ5ßZàºH;/K<21:è=âxà +ED à¼âQè6/TÞ5åEè=âxàIH./Pç G /TâCÞ5/ + ß0<21\è=âxà +ED

A àIß6F�á + /¡RIáLá;ôLç,1:FE/T1 G ßCá.ô./ + > *,+ á;ß6FE/Pè A á.è G âP3ã1¤<Eè6/ G à¼Þ5ß½àIH./Ò<21:è5â½/Pèà¼âK1Xâ½/PßKá ? ì,<2áLâCâxàI9SRº7�-QåEß6å21©RæRI7è6/TÞ5åEè=âíàºH;/:îÖ<Eè6áEÞ5/ G åEè6/TâP3 A FSà¼Þ6FÆ1:è6/Äâ½/5RI/TÞ5ß6/ G 1.ÞPÞ5á.è G à +ED ß6á0ß6FE/Äâ½F21\<2/Äá ? ìí1\ßÖ-YáLâ½ßPî�ß6FE/_]2è=âZßãß6á.ô./ + >�����.��� � � ��� � �$�������������������� ��$� � � �����'�$��*�� � à + G à +ED â$à + â½ß6è6/T1\-�<21:ß6ß6/Pè + â®áEÞPÞ5åEèãâ½/ L;åE/ + ß½à¼1©RæRI7.3;à + Þ5á + ß6è=1;â½ß A àIß6F09Sà + G à +ED â à + è6/ D åSRÂ1\èB<21:ß6ßC/Pè + âP3 A FSà¼ÞCFÞP1 + 92/ÄßCFEá.å D FSß»1;â�á�ÞPÞ5åEèCè½à +ED à + <21:è=1©RæRI/5R,> ò ß6è6/T1:- -81:ß=ÞCFSà +ED à¼â D å21\è=1 + ß6/P/ G ß6á09N/Ä<2/Pè ? á.èC-0/ G ? è6á.-�RI/ ? ßß6á è½à D FLß©> ��á.èB/5W21:-0<SRI/.3EÞ5á.-0<EåEßZà +ED ß6FE/Vâ½åE-&á ? ß6FE/°/5RI/P-0/ + ß=â$á ? 1 + à + ß6/ D /Pèãâ½ß6èC/T1:-§Þ5á.åSR G 92/ G /5] + / G 1.âPd

Page 70: Functional programming using Caml Light Michel Mauny January 1995

����� �������� "�� #���� ������ �E� �� ���� �� �#"eSf `:g y `Sn#{:g y `LbP�(AL{©m\�´J j�k;mLJan:gio:p:Je v ö �6M���|P{:g y `Sbð�(AL{©m.��J¬�¤�� w s ¤�e�u�v ö � q ��|P{:g y `Sbð�(AL{©m.��|ZJBC q �S� � w s ��e�u�v ö w s XJ��S�¥E���a�.��� KL¥S� � �Æ�4��� � � �P�¬��¥E���a�;���}� � �4�¬�#µ ·©¸E�©� �e {�g y `SbP�.AS{Tm.� M v ö �6M � � D�� ��� � �� � ��� w �L��)�¡�4���#µ����2 FE/Æ{:g y `Sbð�(AL{©m.� ? å + Þ5ß½àIá + å2â½/Tâ àIß=â ]2è=âZßØ1\è D åE-0/ + ß01.â01 + 1.ÞPÞ5åE-QåSR¼1:ß6á.è0FEá\R G à +ED ß6FE/ â½åE-�Þ5á;-0<EåEß6/ Gâ½á ? 1:èT> 2 FE/8ÞP1©RæR�|P{:g y `Sbð�(AS{Tm.��|ZJBC q �L�Yå2â½/Tâ q A FSà¼ÞCF A 1.â 92á;å + G à + ß6FE/8â½ßCè6/T1:-�<21:ß6ß6/Pè + Þ5á.-Y<2á + / + ßáEÞPÞ5åEè6è½à +ED 1\ßãß6FE/_RI/ ? ß á ? ßCFE/ÄÞP1©RæR >

'�(O$*)#( )�,.- â½ß6èC/T1:-8â®<21:ß6ßC/Pè + â�1:è6/�RI/ D 1�Riá + RI7 à + ß6FE/ k.mSJin:gao�p\JØ1 + G �¬b:g2n©^ØÞ5á + â½ß6è6å2Þ5ß=â4> 2 FE/ f `:g01 + Gá.ß6FE/Pè ? á.è6-8âã1\è6/Äè6/TâZß6è½à¼Þ5ß6/ G ß6áå2â½å21©R�<21:ß6ß6/Pè + â4> �EåEèCß6FE/Pè6-0á.èC/.3218âZß6è6/T1:-�<21:ß6ß6/Pè + ÞP1 +E+ á.ßV1:<E<N/T1:èãà + âxà G /1 + á.ßCFE/Pèã<21:ß6ß6/Pè + >

Ï��ÜÎ�� � 9 �.9N Ô$×¬Ô �®Ù��BÔA� Õ 9 �¬ÝaÔ �¬Ýò à + Þ5/z1¤<21\è=â½/Pèà¼â 1 ? å + Þ5ß½àIá + RæàIô./X1 + 7lá;ß6FE/Pè ? å + Þ5ßZàºá + 3_àIß ÞP1 + 92/ <21:è=1:-0/PßC/Pè½àIïP/ G á.è92/Òå2â½/ G 1.âK1<21:è=1\-0/Pß6/PèT> � 1:è=1:-0/PßC/Pè=âaå2â½/ G á + Rº7Üà + ß6FE/�è½à D FSß6ç@F21 + G âxà G /ãá ? â½ß6è6/T1:-Yç@-81:ß=ÞCFSà +ED è6åSRI/Tâ$âxàI-�åSR¼1:ßC/ ÀÌÅ 4SÃT¾5À¼Ê@ÃIB¿.Ê@Ê@¾5À �<7LÊ@Ã4Á0á ? 1:ß6ßCè½àI9EåEß6/ D è51:-0-81:è5âP> � 1\è=1:-0/Pß6/Pè5âQå2â½/ G 1;â0<21:è5â½/Pè=â à + â½ß6è6/T1\-�<21:ßCß6/Pè + â01©RæRIá A)? á.èß6FE/àI-0<SRI/P-0/ + ß=1:ß½àIá + á ? 4LÀ ='4Lé¾ �½Ë.¾GB.ÃT¾$<21:è=â½/Pè5âP> ¹ / A àæRæR¬å2â½/°ßCFE/ + /5W�ß$/5W�1\-0<SRI/Vß6áV-0á.ß½àIH:1:ß6/_ß6FE/�à + ßCè6á G å2Þ5ßZàºá +á ? <21:è=1:-Y/Pß6/Pè½àIïP/ G <21:è=â½/Pè5âP>��� ��� ����� � ���� ����� * �4 � � � $���$# � � �$�� ����� $� " "��!�� �$/ ? á;è6/89EåSàæR G à +ED 1¡<21:è5â½/Pè ? á.è01:è½àIß6FE-0/PßZàÂÞY/5WE<Eè6/Tâ6âxàIá + âP3 A / + /P/ G 1RI/5WSà¼ÞP1©R 1 + 1©RI7SïP/Pè01:9SRI/Kß6á è6/TÞ5á D.+ àIïP/1:è½àIß6FE-Y/Pß½à¼ÞVá.<N/Pè=1:ß½àIá + âã1 + G à + ßC/ D /Pè°Þ5á + â½ß51 + ß5âP> �a/Pßãå2â»]2è=â½ß G /5] + /01Qß½7L<N/ ? á.è�ß6á;ô./ + âPde gL�;�i`�gEp �N`©J�je ������� u������ ��� u������ � � u������ u � � � u ��� �e�u���� � p.k&oPJEgB�S��<�����h�L�"!��ð�§²��©¸N�P�±�.²�¯ò ô;àº<E<Sà +ED 9SR¼1 + ô â½<21;Þ5/Tâ�à¼â�<N/Pè ? á;è6-0/ G 9S7ß6FE/Q{T�abSnL`S{ ? å + Þ5ß½àIá + G /5] + / G 1.âPdeSf `:g y `Sn#{©�ibSnL`S{lj�k;mLJan�gao:p:Je v ö � � �2u � ��g �2u � �TJ � � {©�ibSnL`S{4A w s }|©�e�u�v ö w s |©���L�¥P�±�EªL�\¥��Òªð¢��:��¥��:�i�;���&� � �©���S��µ ·©¸E�©� �2 FE/ÄÞ5á + H./Pè=âíàºá + á ? 1 G à D àºß ìíÞCF21:è=1.Þ5ßC/PèPî®à + ß6áQàIß=â»à + ßC/ D /PèãH�1�RºåE/ à¼â G á + / 9L7adeSf `:g�oPJEg+A.p;k+A.c2o©ñaoTg#jhk.mSJan�gao�p\Je � M � � � � � bS{#n#s §|To4JEg+A.p.kIASnT^ab y n��´s}|To4JEg+A.p.kIASnT^ab y � M � �e�u A�s y bEo.{S`§|=~�b�o f m y ` �5J2p.gtb¶cNo©ñio©g��;���L��4��� K��:¸BK�²S�P�¬�S�}�Òªð¢��:��� � �P�¬��µ ·T¸��©� �

Page 71: Functional programming using Caml Light Michel Mauny January 1995

��� �-�������� ������ �.� "���� �M�����E� �� ���� ��

2 FE/ ��bL{ � ô;/P7 A á.è G 1©RæRIá A â ? á.è + 1:-Qà +ED 1<21:ß6ßC/Pè + d à + ß6FSà¼âÄÞP1.â½/.3aßCFE/�H:1:è½à¼1:9SRI/¡n A àæRæRÖ9N/092á.å + G ß6áKß6FE/1.Þ5ß6å21�R G à D àIß_-81:ß=ÞCFE/ G 9S7 � M � � � � � > � 1:ß6ß6/Pè + 9EåSàóRIß A àIß6FÒbS{01:è6/VÞP1©RæRº/ G ¿�DæÀÌ¿:Á�É�¿;Ê@Ê@ÃT¾5ÅEÁP>��á.èÄßCFE/8è6/TÞ5á D.+ àIß½àIá + á ? à + ß6/ D /Pè=âP3 A /K1©RIè6/T1 G 7 ? /P/5Rãß6FE/ + /P/ G ? á.èQ1 <21\è=1:-0/Pß6/PèZàºïP/ G <21:è=âZ/PèT> *x+ ßC/ D /Pèè6/TÞ5á D;+ àºßZàºá + àÂâ G á + /°9S7ß6FE/�o4JEg2`:ñ2` y 1 + 1©RI7SïP/Pè G /5] + / G 9N/5Rºá A > * ß$à¼â�<21:è=1:-Y/Pß6/Pè½àIïP/ G 9S7K1 + åE-0/Pè½à¼Þ_H:1©RIåE/è6/P<Eè6/TâZ/ + ß½à +ED ß6FE/VH�1�RºåE/Qá ? ß6FE/V]2è=âZß G à D àIß=â á ? ß6FE/ + åE-�9N/PèTdeSf `:g y `Sn o4J�gN`�ñN` y J j�k;mSJin:gio:p\Je v ö � � M � � � � � bS{�n±��|To4J�gN`:ñ2` y | D©M��©J1C�o4J�gIA\p;kIA\cNoTñao©g#nE�L� y w s ye�u�v ö w s XJ��S��4���E�5�±�©� �­�P�¬�#� � ªð¢¬����¥E���a�.���}� � �P�¬��µ ·T¸��©� �e oPJEg2`:ñN` y M�|P{:g y `Sbð�(A.p.kIAL{:g y o4J�ñ���D �� � 3i�;���L��)�¡�4���#µ�� ����� 6¹ / 1:èC/ + á A è6/T1 G 7¤ß6á A è½àIß6/Kß6FE/YRI/5WLà¼ÞP1©RÄ1 + 1©RI7SïP/PèT3$ß=1:ô;à +ED 1ÒâZß6è6/T1:- á ? ÞCF21:è=1;Þ5ß6/Pè=âP3�1 + G è6/PßCåEè + à +ED 1â½ß6èC/T1:- á ? ß6á.ô./ + â4> = /Pß6åEè + à +ED 1Æß6á;ô./ + â½ß6è6/T1\- A FSà¼Þ6F A àæRæRÄ92/¡/5W�<SRIá.èC/ G 9S7�ß6FE/¡<21:è=â½/PèQà¼â1Xâíàº-Y<SRº/.3è6/T1.âZá + 1:9SRI78/ %KÞCàº/ + ßV1 + G à + ß6åSàIß½àIH./ A 1©70á ? Þ5á.-0<NáLâxà +ED 1�Rº/5WSà¼ÞP1©RB1 + 1©RI7LïP/PèV1 + G 1Q<21\è=â½/PèT>eSf `:g y `Sn f ` q ` y {¶j¤��b�gNn©^§{ o©g.^e v ö � � | � �O{©�abLnS`L{4A w s v ö � ��� �B� f ` q ` y { we�u�v ö � � � � �O{©�abLnS`L{4A w s v ö � ��� �B� f ` q ` y { we�u�v ö � � C � �O{©�abLnS`L{4A w s v ö � � � ����� f ` q ` y { we�u�v ö � � s � �O{©�abLnS`L{4A w s v ö � ����� � � � f ` q ` y { we�u�v ö � � � � �O{©�abLnS`L{4A w s v ö � ����� � � � f ` q ` y { we�u�v ö � ��� � �O{©�abLnS`L{4A w s v ö � ����� � f ` q ` y { we�u�v ö � � M � � � � � bL{�n®�¶|©oPJEg2`:ñN` y |©oPJEg+A.p;k+A.c2o©ñaoTg�n��S� JÖ�Ò{©�abLnS`L{4A we s v ö � ����� J�� f ` q ` y { w �S��2� � �T� �Òªð¢¬����¥E���a�.���}� � �L�"!��ð��¥��:�a�.���§µ ·T¸��©� �¹ /Ä1.âCâ½åE-0/Vß6FE/Pè6/Üà¼â + áQRI/T1 G à +ED â½<21.Þ5/Üà + ß6FE/_à + <EåEßT>

õ á A 3®RI/Pßå2âQ/5W�1\-Qà + / ß6FE/ RÂ1 +ED å21 D /Kß6F21\ß A / A 1 + ßQß6áÒèC/TÞ5á D.+ àIïP/.> ¹ / â½F21©RæR F21©H./à + ß6/ D /Pè=â43�à + ]EW1:è½àIß6FE-Y/Pß½à¼ÞVá.<N/Pè=1:ß½àIá + âã1 + G <21:è6/ + ß6FE/TâxàIïP/ G /5W�<Eè6/TâCâxàIá + âP> 2 FE/ ��õ � ? á.è6-)á ? ß6FE/ D è=1:-0-81\è�à¼âPd� q � y rLr j � q � y C � q � y

u � q � y s � q � yu � q � y � � q � yu � q � y � � q � yu | � q � y �u������

2 FE/VH:1©RIåE/Tâ°Þ5á.-Y<EåEß6/ G 9L7Yß6FE/V<21:è=â½/Pè A àæRæR�92/0¿��ðÁðÊ@¾½¿.È©Ê®Á �:Å2Ê@¿\ÇØÊ@¾½Ã5ÃPÁ�ì,9S7éÞ5á + ß6è51.â½ß A àºßCFÒÈ=Ë.ÅNÈT¾½ÃTÊ@ÃÜÁ �:ÅNÊ@¿:Ç�3A FSà¼ÞCFKà¼âãßCFE/_à + <EåEßVâ½ß6èZà +ED á.è°â½ß6èC/T1:-Kî=> ò å2ÞCF ß6è6/P/Tâ»92/5RIá +ED ß6áQß6FE/ ? á:RæRIá A à +ED ß½7L<N/.de gL�;�i`�b:g y `S`«je � JEg#p.k&oPJEge�u � f ma{«p;ktb�g y `L`���b:g y `S`e�u�� o4JSmi{lp;k b:g y `S`���b�g y `L`e�u�� m f g´p;ktb�g y `L`���b:g y `S`e�u�� o �#p.k b�g y `S`�#b:g y `L`®�S��<�����h�L�:�i�S�h²��©¸N�P�±�.²�¯

Page 72: Functional programming using Caml Light Michel Mauny January 1995

����� ��� ���� "�� #���� ������ �E� �� ���� �� ���2 FE/ � q � y D è51:-0-81:è»àÂâ 1:-Q9Sà D åEá.å2âP> 2 áK-81:ô;/VàIßÄå + 1:-Q9Sà D åEá.å2â43 A / A àæRæR»1 G á.<Eß°ßCFE/0å2â½å21©R�<Eè6/TÞ5/ G / + Þ5/Tâ? á.èÄ1:è½àIß6FE-0/PßZàÂÞYá.<N/Pè=1:ß6á.è5â°1 + G 1.â6â½åE-0/Yß6F21:ßÄ1©RæRÖá;<2/Pè=1:ßCá.è=âV1.â6âZá�ÞCà¼1:ß6/Qß6áKßCFE/QRI/ ? ßT>õãá A 3�ß6áKå2â½/8âZß6è6/T1:--81:ß5Þ6FSà +ED ? á;èÖ<21\è=âxà +ED 3 A /_-�å2âZßBß=1:ô;/ãà + ß6á01.ÞPÞ5á.å + ßÖßCFE/ ? 1.Þ5ß�ß6F21\ßB-81:ß5Þ6FSà +ED è6åSRI/Tâã1\è6/ ÞCFEáLâ½/ + 1.ÞPÞ5á.è G à +EDß6á ß6FE/°9N/PF21©H.àIá.è�á ? ß6FE/ ]2è=â½ß�Þ5á.-0<2á + / + ß�á ? /T1.ÞCF8-1:ß=ÞCFSà +ED è6åSRI/.> 2 FSàÂâ à¼â$<Eè6/ G à¼Þ5ß½àIH./Ä<21\è=âxà +ED 3L1 + G 3Lå2âíà +EDA /5RæRºç@ô + á Aã+ ßC/TÞ6F + à L;åE/TâP3�àIßQà¼âQ/T1;â½7XßCáOèC/ A è½àIß6/ß6FE/ D è=1:-Y-81:è�1\92á:H./Yà + â½å2ÞCFl1 A 1©7Òß6F21\ß A è½àIß½à +ED ß6FE/Þ5á.è6èC/Tâ½<2á + G à +ED <Eè6/ G à¼Þ5ß½àIH./Ä<21\è=â½/Pè�92/TÞ5á.-Y/Tâãß6èZàºH;à¼1©R,> 2 FE/Tâ½/Vß6/TÞCF + à L;åE/Tâ_1:è6/ G /Tâ6Þ5è½àI92/ G à + � �,3E1 + G Þ5á + âxà¼â½ßà + 1 GEG à +ED 1 + á + ç@ß6/PèC-Qà + 1©R ? á.èã/T1.ÞCFK<Eè6/TÞ5/ G / + Þ5/ RI/PH./5R,3i1 + G è6/P-0á:H;à +ED Rº/ ? ß6ç@è6/TÞ5åEè5âxàIá + > ¹ /Vá.9Eß=1©à + d� q � y rLr j � m f g

u�� m f g C � q � yu�� m f gts � q � y

� m f g rLr j g�p©�u g�p©� � � m f gu g�p©� � � m f g

g�p©� rLr j �����u | � q � y �

¹ FSàæRº/ è6/P-0á:H.à +ED RI/ ? ß6ç@èC/TÞ5åEè=âxàIá + 3 A / ? á.è D á.ß±1:9Ná.åEß�Rº/ ? ßB1.â6âZá�ÞCà¼1:ß½àIH;àIßí7 á ? á.<N/Pè=1:ß6á.è5âP> 2 FSà¼â�à¼â + á.ß�1ã<EèCá.9SRI/P- 31.â$RIá +ED 1.â A /V9EåSàæR G Þ5á.èCè6/TÞ5ß°1:92â½ßCè=1.Þ5ß�ß6è6/P/TâP>

ò à + Þ5/0â½ß6èC/T1:-�-1:ß=ÞCFSà +ED 921.â½/Tâ»àIß=âVÞCFEá:à¼Þ5/Tâ_á + ß6FE/ ]2è=âZß Þ5á.-Y<2á + / + ß°á ? â½ß6è6/T1:- <21:ß6ß6/Pè + â43 A /�ÞP1 +E+ á.ßâ½/P/ ß6FE/ D è=1:-Y-81:èã1:92á:H./Q1.âã1Q<21\è=â½/PèT> ¹ / + /P/ G 1 ? åEè6ß6FE/Pèãß6è51 + â ? á.è6-81:ßZàºá + 3 ? 1.Þ5ß6á;è½à +ED Þ5á.-0-0á + <Eè6/5]EW�/Tâá ?�D è=1:-Y-81:èBèCåSRº/TâÜì@RI/ ? ß6ç ? 1;Þ5ß6á.èPî=> ¹ /Vá;9Eß=1©à + d� q � y rLr j � m f g �2`S{�g�� q � y

�N`S{�g�� q � y rSr j C � m f g �N`L{:g�� q � yu s � m f g �N`L{:g�� q � yu | ��J2p.g;^¬oPJEñ ���

� m f g rLr j g�p©� �2`S{�g � m f g�N`S{�g � m f g rSr j�� gEpT� �N`L{:g � m f g

u �� gEpT� �N`L{:g � m f gu | ��J2p.g;^¬oPJEñ ���

g�p©� rLr j �����u | � q � y �

õ á A 3 A /0ÞP1 + â½/P/0ß6FSà¼â D è=1\-0-81:èV1.âV1K<21\è=â½/PèQì + á.ßC/�ßCF21:ß°ßCFE/0á.è G /PèVá ? è6åSRI/TâV9N/TÞ5á.-0/TâÜàI-0<2á.èCß=1 + ßT3¬1 + G/P-0<Eß½7<Eè6á G å2Þ5ßZàºá + âã-Qå2â½ß°1\<E<2/T1:è�R¼1.âZßPî=> 2 FE/�âZF21:<2/ á ? ß6FE/ <21:è=â½/Pè�à¼âPdf `�g y `Ln#` q � y j

f `�g y `Sn y `S{�gN` q � y � j�k.mSJan�gao�p\Jv ö � � ��� � �8��m f g � � y `L{:g2` q � y � w s �

u�v ö � ����� �����0��m f g � � y `S{�gN` q � y � w s �

Page 73: Functional programming using Caml Light Michel Mauny January 1995

� � �-�������� ������ �.� "���� �M�����E� �� ���� ��

u�v ö w s �

o4J k.mSJan�gao�p\J v öX��m f gt`BD�� y `L{:gN` q � y � w s �

b©J�c¤��m f g jf `�g y `Sn y `S{�g:�Em f g � j�k.mSJan�gao�p\J

v ö � ����� � ���Æb:g�p©� � � y `S{�g:��m f g � w s �

u�v ö � ����� �Òb:gEpT� � � y `S{:g���m f g � w s �

u�v ö w s �

o4J k.mSJan�gao�p\J v ö#b:g�p©�&`BD�� y `L{:g:�Em f g � w s �

b©J�c�b:g�p©�§jhk.mSJan�gao�p\Jv ö � ����� J w s � J�ghJ

u�v ö ����� �$�O` q � y `®� � ��� � w s �`¹ /$å2â½/ G L;åE/Tâ½ß½àIá + -81:èCô�â A FE/Pè6/B<21:è51:-0/Pß6/Pè=â43P9Sà + G à +ED âB1 + G è6/Tâ½åSRIß=â®â½ß½àæRæR2F21TH;/�ß6á°1:<E<N/T1:èT> �a/Pß®å2â±Þ5á + âíà G /Pèß6FE/¡` q � y ? å + Þ5ßZàºá + déÞCRI/T1:èZRº7.3�1.âQâ½áSá + 1.âQ`+DYà¼âQè6/TÞ5á D;+ àºïP/ G 3 A /8-Qå2â½ß 92/Kè6/T1 G 7Òß6áÆ9EåSàæR G ß6FE/YRº/ ? ß6-0áSâ½ßâ½åE9Eß6èC/P/Äá ? ß6FE/ è6/Tâ½åSRIßT> 2 FSà¼â Rº/ ? ß6-0áSâ½ß°â½åE9Eß6èC/P/Äà¼â /5àIß6FE/PèVè6/Tâ½ß6èZàÂÞ5ßC/ G ßCáK`BDÜàIß=âZ/5R ? 3Nà + ÞP1.â½/ y `S{�gN` q � y G áS/Tâ+ á.ßV/ + Þ5á.å + ß6/PèÄ1 + 7 á;<2/Pè=1:ßCá.èT3Ná.èãàIß_à¼âVßCFE/�ßCè6/P/Qè6/P<Eè6/Tâ½/ + ß½à +ED ß6FE/81 GEG àIß½àIá + ì,á.èVâ½åE9Eß6è=1.Þ5ßZàºá + îãá ? `BDY1 + Gß6FE/0/5WE<Eè6/Tâ6âíàºá + àI-0-0/ G à¼1:ßC/5Rº7 ? á:RæRIá A à +ED ß6FE/81 GEG àIß½àIH./á.<2/Pè51:ß6á.èT> 2 FE/Pè6/ ? á;è6/.3 y `L{:gN` q � y -Qå2â½ßV92/8ÞP1�RóRI/ GA àIß6F `BDQ1.â_1 + à + ß6/Pè6-0/ G à¼1:ß6/Qè6/TâZåSRºß©3i1 + G 1.ÞPÞ5åE-QåSR¼1:ß6/Qâ½åE9Eß6è6/P/Tâ 9EåSàæRIß ? è6á;-)àIß=â»à + ß6/PèC-0/ G à¼1:ß6/Qè6/Tâ½åSRIßT3Nß6FE/ß6è6/P/QÞ5á + â½ß6èCå2Þ5ß6á.èVÞ5á.è6è6/Tâ½<Ná + G à +ED ß6áß6FE/ á.<2/Pè=1\ß6á.èV1 + G ß6FE/ RÂ1;â½ß°/5WE<Eè6/Tâ6âíàºá + / + Þ5á.å + ß6/Pè6/ G > 2 FE/Q92á G 7 á ?` q � y 9N/TÞ5á.-0/TâPdf `�g y `Ln#` q � y j

f `�g y `Sn y `S{�gN` q � y `+D�jhk;mLJan�gao:p:Jv ö � � ��� � �8��m f gt` � � y `S{�gN` q � y | � f ma{§|P`+D��=` �2�S�h` w s #`

u�v ö � ����� �����0��m f g�` ��� y `L{:gN` q � y | � o4JSmi{§|4`BD��=` �N�L�h` w s #`u�v ö w s #`+D

o4J k.mSJan�gao�p\J v öX��m f gt`BD��¶| y `S{:g2` q � y `+D;��` � w s #` �õ á A 3S` q � y èC/TÞ5á D.+ àIïP/TâB1_<Eè6á G å2Þ5ß�`+D_ì,9S7ã�Em f g2î=3.1 + G 1\<E<SRóàI/Tâ | y `L{:gN` q � y `+D.��ßCáVß6FE/�è6/Tâ½ß®á ? ß6FE/ãâ½ßCè6/T1:- >U ÞPÞ5á.è G à +ED ß6áß6FE/01 GEG àIß½àIH./0á;<2/Pè=1:ßCá.è°/ + Þ5á;å + ß6/PèC/ G ì@à ? 1 + 7Nî=32ßCFSàÂâ ? å + Þ5ß½àIá +ÒA àóRæRã1:<E<SRI78��m f g A FSà¼ÞCF A àæRóRè6/Pß6åEè + â½á.-0/Q` �2> 2 FE/ + ß6FE/V<Eè6áEÞ5/Tâ6âãÞ5á + ß½à + åE/Tâ A àIß6F�� f mi{¬|P`+D��=` �2�V1.âÖà + ß6/Pè6-Y/ G àÂ1\ß6/Äè6/TâZåSRºß©> *,+ ß6FE/V/ + G 310Þ5á.èCè6/TÞ5ß½RI78921�RÂ1 + Þ5/ G ßCè6/P/ A àæRæR¨9N/V<Eè6á G å2Þ5/ G ì,å2âíà +ED ß6FE/VR¼1.â½ß è6åSRI/Äá ? y `S{:g2` q � y î=>¹ àIß6FKß6FE/ÄâC1:-0/ÄÞ5á + âxà G /Pè=1\ß½àIá + âãá + �Em f gK1 + G y `L{:g:�Em f ga3 A /ÄÞP1 + Þ5á.-0<SRI/Pß6/ ß6FE/Ä<21:è5â½/PèT3Sá.9Eß=1©à + à +ED deSf `:g y `Sn#` q � y je f `:g y `Ln y `L{:g2` q � y `+D�jhk.mSJin:gao�p\Je v ö � � � �����0��m f g�` ���l| y `S{:g2` q � y | � f mi{§|4`BD��=` �N�L�S�h` w s #`e u�v ö � ����� � � �0�Em f g�` � �l| y `S{�gN` q � y | � oPJSmi{§|4`BD��5` �N�L�S��` w s �`e u�v ö w s #`+De oPJ#k;mLJan�gao:p:J v öX�Em f g `+D��¶| y `S{�gN` q � y `+D.��` � w s �` �ee bTJ2c¤�Em f gtje f `:g y `Ln y `L{:g���m f gt`+D�jhk.mSJin:gao�p\Je v ö � ����� � � �Æb�gEp©��` � �l| y `S{�g:�Em f g | � m f g)|P`+D��5` �2�S�L�«` w s �`e u�v ö � ����� �Òb:g�p©�&` � �l| y `L{:g:�Em f g)| � o �)|P`+D��=` �2�S�S�l` w s #`

Page 74: Functional programming using Caml Light Michel Mauny January 1995

����� ��� ���� "�� #���� ������ �E� �� ���� �� � �

e u�v ö w s #`+De oPJ#k;mLJan�gao:p:J v ö#b�gEp©�§`+D��¶| y `S{�g:�Em f g#`+D.��` � w s �` �ee bTJ2c�b�gEpT�&jlk;mSJin:gio:p\Je v ö � ��� � J w s � J�g´Je�u�v ö � � � �B�Æ` q � y `®� � ��� � w s �`±�S�� � �a� �Æ�L�"!¬�5��¥E���a�.���}� � �L�:�i�S�hµ ·©¸E�©� ��a�L�E�)�Æ�L�"!¬�5��¥E���a�.���}� � �L�:�i�S�hµ ·©¸E�©� ��S�L��� �Æ�L�"!¬�5��¥E���a�.���}� � �L�:�i�S�hµ ·©¸E�©� �U + G A /ÄÞP1 +K+ á A ß6è67Yá.åEèã<21:è=âZ/PèTde ` q � y | f ` q ` y |4{�g y `SbP�.A.p.kIAS{�g y o4JEñ �N| D C � C� ����i�;s�3����i�;�S�¬�S��)�¡�S���a�L�´µ��a�4�i�S¥ G �2�S�L¥ G �2�S�S¥ G��©��� �����T�¬� � H ���N�L�E� G��©�¬� ����©��� � H�H ���©���56 �� H

��� ����� � � $� � � �$�4$ "��� ����4�$���� ���#���$���$� � �4�'��$� � � �$� *,+ ß6FE/ã<Eè6/PH;àIá.å2â�/5W21:-0<SRI/.3Sß6FE/ã<21:è5â½/Pè=â y `L{:g2` q � y 1 + G y `L{:g���m f gVß=1\ô./ã1 + 1:92â½ßCè=1.Þ5ß�â½7 + ß=1©WQß6è6/P/V`+Dã1;â�1:è6çD åE-0/ + ßB1 + G <21;â6â®àIß G á Aã+ ß6áVßCFE/ãè6/Tâ½åSRIßBßCFEè6á.å D FQè6/TÞ5åEè=âíàºH;/ ÞP1©RæR¼âBâZå2Þ6F81;âÄ| y `S{�gN` q � y | � f ma{�|4`BD��5` �N�L�S�S>*@?®A /_â½/P/°â½å2ÞCF8<21\è=â½/Pè=â$1.â + á + ç@ßC/Pè6-Qà + 1©R¼â ì �2`S{:g � q � y ? è6á.-�ßCFE/ D è51:-0-81:èB1\92á:H./:î¬ß6FSà¼â$<21:è=1:-Y/Pß6/PèÖ1.Þ5ß5â�1.â1 + à + FE/Pè½àIß6/ G 1:ß6ß6è½àI9EåEß6/Vá ? ß6FE/ + á + ç@ß6/PèC-Qà + 1©R,> ò 7 + ßCFE/TâxàIïP/ G 1\ß6ß6è½àI9EåEß6/Tâ�1:è6/Äâíàº-QåSR¼1:ß6/ G 9S7ß6FE/Vè½à D FSßãF21 + Gâxà G /Tâ á ? âZß6è6/T1:-�-81:ß5Þ6FSà +ED è6åSRI/TâP>��� ����� ���!#��4�� � $���4 ��� $ "��$ *,+ ß6FE/ G /5] + àIß½àIá + á ? ` q � y 3 A /8-81©7 + á.ß½à¼Þ5/Kß6F21:ßQß6FE/K<21\è=â½/Pè=â` q � y 1 + G �Em f g¤á + ß6FE/Ká + /KF21 + G 1 + Gy `L{:g2` q � y 1 + G y `S{�g:�Em f g á + ß6FE/0á.ßCFE/PèÄF21 + G F21©H./0/5W21.Þ5ß½RI7Òß6FE/8âC1:-0/8â½ßCè6å2Þ5ß6åEè6/.> 2 á /P-Y<EF21.âxàIïP/Kß6FSà¼ââxàI-QàæR¼1:è½àIß½7.3Eà ?BA / G /5] + /Ä<21\è=â½/Pè=â ? á.è°1 GEG àºßZàºH;/0ì,è6/TâZ<¬>±-QåSRIß½àI<SRæà¼ÞP1:ß½àIH./:î°á;<2/Pè=1:ßCá.è=â$9L7adeSf `:gtb\cScLp\� j�k;mLJan�gao:p:Je v ö � ������� w s }|Ck.mSJin:gao�p\J | q �½�a�ls � f ma{¬| q �í�a�S�e�u�v ö � ����� � � w s §|Ck.mSJan�gao�p\J�| q �½�i�hs � o4JSmi{¬| q �½�i�S�e bTJ2c¤�Em f gEp\��j´k.mSJin:gao�p\Je v ö � ����� � � w s §|Ck.mSJan�gao�p\J�| q �½�i�hs � m f g¨| q �½�a�L�e�u�v ö � ����� w s }|Ck;mLJan�gao:p:J)| q �í�a�hs � o �¨| q �í�a�L���S��S²L²S�=� �Æ�S�"!��ð��¥��:�i�;���&� � �S���a�S�����L�:�i�S��� � �S���a�S��µ#·T¸��T� ��a�L�E�L�5� �Æ�S� !¬�5��¥E���a�;���}� � �L�:�a�L�����L�:�a�L�#� � �L�:�a�L�hµ ·©¸E�©� �A /ÄÞP1 + è6/ A èZàºßC/Äß6FE/Q` q � y <21:è5â½/Pè°1.âPdeSf `:g y `Sn#` q � y je f `:g y `Ln y `L{:g2` q � y `+D�jhk.mSJin:gao�p\Je v ö¶b.cScLp\� k$�Ø��m f gt` ���¶| y `L{:g2` q � y |Ck |4`+D��5` �N�S�L�h` w s #`e u�v ö w s #`+De oPJ#k;mLJan�gao:p:J v öX�Em f g `+D��¶| y `S{�gN` q � y `+D.��` � w s �` �ee bTJ2c¤�Em f gtj

Page 75: Functional programming using Caml Light Michel Mauny January 1995

� � �-�������� ������ �.� "���� �M�����E� �� ���� ��

e f `:g y `Ln y `L{:g���m f gt`+D�jhk.mSJin:gao�p\Je v ö­��m f gEp:�#k$�Òb:g�p©�&` � �¶| y `S{�g:��m f g}|Ck�|4`BD��=` �N�L�S�h` w s #`e u�v ö w s #`+De oPJ#k;mLJan�gao:p:J v ö#b�gEp©�§`+D��¶| y `S{�g:�Em f g#`+D.��` � w s �` �ee bTJ2c�b�gEpT�&jlk;mSJin:gio:p\Je v ö � ��� � J w s � J�g´Je�u�v ö � � � �B�Æ` q � y `®� � ��� � w s �`±�S�� � �a� �Æ�L�"!¬�5��¥E���a�.���}� � �L�:�i�S�hµ ·©¸E�©� ��a�L�E�)�Æ�L�"!¬�5��¥E���a�.���}� � �L�:�i�S�hµ ·©¸E�©� ��S�L��� �Æ�L�"!¬�5��¥E���a�.���}� � �L�:�i�S�hµ ·©¸E�©� �õ á A 3 A /Vß=1:ô./Ä1 G H:1 + ß=1 D /_á ? ß6FE/Tâ½/Äâíàº-ØàóR¼1:èZàºßZàº/Tâ à + á.è G /Pè ß6á G /5] + /01 D / + /Pè=1�R±<21:è=â½/Pè ? á.è»Rº/ ? ß6ç,1.âCâ½á�ÞCà¼1:ßZàºH;/á.<N/Pè=1:ß6á.è5âP> * ß=â + 1:-0/ à¼â f `�kSg+ASbS{L{.pEnÄ1 + G à¼â�<21\è=1:-0/Pß6/PèZàºïP/ G 9S7é1 <21:è=âZ/Pè ? á.è�á.<N/Pè=1:ß6á.è5âB1 + G 1 <21:è=âZ/Pè ? á.è/5WE<Eè6/Tâ6âxàIá + âPdeSf `:g y `Sn f `�kSg+ASbS{L{.pEn�p:�tg2` y ��je f `:g y `Ln y `L{:g�`+DXj´k.mSJin:gao�p\Je v ö«p\� k$� gN` y �&` � �l| y `L{:g)|6k�|P`+D��5` �2�S�L�h` w s �`e u�v ö w s #`+De oPJ k;mSJin:gio:p\J v ö�g2` y ��`BD��l| y `S{�gt`+D.��` � w s �` ���S��2�T¸N��KE�;¥L¥E��ª&�G�³C�h¥��:�i�;���&� � ³C£ �)³6£t� � ³C£ H � � G�³C��¥E���a�;���}� � ³6£ H � � ³6�h¥E���a�.���}� � ³6£�µ ·©¸E�©� �õ á A 3 A /ÄÞP1 + èC/ G /5] + /8` q � y 1;âPdeSf `:g y `Sn#` q � y {�g y j f `:kSg+ASbL{S{.pEn�b.cLcSp:�l��m f gt{�g ye bTJ2c¤�Em f g {�g y j f `:kSg+ASbL{S{.pEnÆ�Em f gEp\� b:gEpT��{:g ye bTJ2c�b�gEpT�&jlk;mSJin:gio:p\Je v ö � ��� � J w s � J�g´Je�u�v ö � � � �B�Æ` q � y `®� � ��� � w s �`±�S�� � �a� �Æ�L�"!¬�5��¥E���a�.���}� � �L�:�i�S�hµ ·©¸E�©� ��a�L�E�)�Æ�L�"!¬�5��¥E���a�.���}� � �L�:�i�S�hµ ·©¸E�©� ��S�L��� �Æ�L�"!¬�5��¥E���a�.���}� � �L�:�i�S�hµ ·©¸E�©� �U + G A /ÄÞP1 +K+ á A ß6è67Yá.åEè G /5] + àIß½àIH./Q<21:è=â½/Pè©de ` q � y | f ` q ` y |4{�g y `SbP�.A.p.kIAS{�g y o4JEñ �N| D C � C� ����i�;s�3����i�;�S�¬�S��)�¡�S���a�L�´µ��a�4�i�S¥ G �2�S�L¥ G �2�S�S¥ G��©��� �����T�¬� � H ���N�L�E� G��©�¬� ����©��� � H�H ���©���56 �� H� 1:è=1\-0/Pß6/Pè½àIïP/ G <21:è=âZ/Pè=â�1:è6/_å2â½/ ? åSR ? á.è G /5] + à +EDD / + /Pè=1©R¬<21:è=âZ/Pè=â�â½å2Þ6F 1;â f `:kLgIALbS{S{\p�nVß6F21:ßãÞP1 + 92/Vå2âZ/ GA àIß6F G à �¬/Pè6/ + ß�à + â½ß=1 + Þ5/TâP> U + á.ß6FE/Pè /5W�1:-Y<SRº/ á ? 1Äå2âZ/ ? åSR D / + /Pè=1©R¬<21:è5â½/Pè�à¼âãßCFE/Q{�gNb y <21:è=âZ/Pè G /5] + / G 1.â4deSf `:g y `Sn#{:g2b y � j�k;mLJan�gao:p:Je v ö¤� q �l|P{:gNb y �¬� f w s q�rLr½fe�u�v ö w s vxw �L�¥E�L�:� �4G�³C�h¥��:�a�.��� � � ³C£ H � � ³C��¥E���a�.���}� � ³C£��E�.¥E��µ ·T¸��©� �

Page 76: Functional programming using Caml Light Michel Mauny January 1995

����� ��� ���� "�� #���� ������ �E� �� ���� �� ��ø2 FE/Q{:g2b y <21:è5â½/Pè$àºßC/Pè=1:ß6/Tâ$ïP/Pè6á0á;èÖ-Yá.è6/_ß½àI-0/Tâ$àIß=â�1:è D åE-Y/ + ß$� 1 + G èC/Pß6åEè + â�ß6FE/ Ræà¼â½ß°á ? è6/Tâ½åSRIß=âP> ¹ /Äâ½ß½àæRæRF21©H./Qß6á92/8ÞP1:èC/ ? åSR®à + å2âxà +ED ß6FE/TâZ/ D / + /Pè=1©RB<21:è=âZ/Pè=âã9N/TÞP1:å2â½/0á ? ß6FE/Q<Eè6/ G à¼Þ5ß½àIH./ + 1:ß6åEè6/ á ? <21\è=âxà +ED > �Eá.è/5W21:-0<SRI/.3N{�gNb y � A àæRæR + /PH./Pè�â½å2ÞPÞ5/Tâ6â ? åSRæRI78ß6/PèC-Qà + 1:ß6/�à ? �0F21.â�1Vè6åSRI/ ? á;è�ß6FE/ã/P-0<Eß½7�âZß6è6/T1:-�<21:ßCß6/Pè + d®ß6FSà¼âè6åSRI/ A àóRæR�-81:ô./VßCFE/Äâ½/TÞ5á + G èCåSRº/ á ? {:g2b y å2â½/5RI/Tâ6â ���� ��� � ����� � ���� ��� $ "���� ����� �����!���$� � � � � $� � ������������!�U â01 + /5W21:-0<SRI/Æá ? <21:è=âíà +ED¤A àIß6Fh<21:è=1:-0/PßC/Pè½àIïP/ G <21:è=â½/Pè=â43 A / â½F21©RæRV9EåSàæR G 1Æ<21\è=â½/Pè ? á.èQß6FE/KR¼1 +ED å21 D /����������� ì�� �� î����L3 A FSà¼Þ6F à¼âãô + á Aã+ ß6á09N/ + á + Þ5á + ß6/5WEß6ç ? è6/P/.>��àIè=âZßT3;Rº/Pß_å2â G /5] + /Q1Qß½7L<N/ ? á.è�ß6FSà¼â°1©RI<EF21:9N/PßTde gL�;�i`�gEp �N`©J�j u�� u�� �L��<�����h�L�"!��ð�§²��©¸N�P�±�.²�¯� àIH./ + 1 + à + <EåEß°á ? ß6FE/ ? á.è6- � � � 3Eß6FE/_à G /T1 ? á;è»1Ø<21:è=â½/PèãèC/TÞ5á D.+ àIï5à +ED àºß»àÂâ4d

ê ]2è=â½ßT3:ß6á è6/TÞ5á D.+ àIïP/_ß6FE/°â½/ L;åE/ + Þ5/ � A àIß6F81Ü<21:è=â½/Pè cYì ? á.è 9�Ë.¾GB B.Ã32ÖÅNÀ¼Ê@ÀÌË.ÅEî¬èC/Pß6åEè + à +ED à +S? á.è6-1:ß½àIá +à + á.è G /PèãßCá�9EåSàæR G 1Q<21:è=âZ/Pèãè6/TÞ5á D.+ àIï5à +ED á + RI7 � �ê ß6FE/ + ß6á0è6/TÞ5á D.+ àIïP/ � �ê 1 + G ß6á0å2â½/VßCFE/V<21:è=â½/Pèã9EåSàæRIßÄ1:ß�ß6FE/Ü]2è=â½ß°â½ßC/P<Kß6áQè6/TÞ5á D.+ àIïP/ÄßCFE/�â½/ L;åE/ + Þ5/ � >

2 FE/ G /5] + àIß½àIá + á ? cØà¼â°1;â ? á\RóRIá A âPdeSf `:g y `Sn c¶j´k.mSJin:gao�p\Je v ö � � c f w s |Ck;mLJan�gao:p:J v ö � w s ��\b2�.� rLr½fe�u�v ö � � � c f w s |Ck;mLJan�gao:p:J v ö � � w s �� �±�.� rLr½fe�u�v ö w s vxw �L�¦S²��¡�L�"!��ð��¥��:�a�.��� � � G5�S� !¬�5��¥E���a�;���}� � ¥��:�N�P�S� H �E�.¥E��µ ·©¸E�©� �2 FE/ m ? å + Þ5ß½àIá + ì ? á;è 9�Ë.¾GBE7;ÁP¿F=.Ã4îB9EåSàæR G âV1Ø<21:è=â½/Pè°âZ/ L.åE/ + ÞCà +ED 1 Ræà¼â½ß_á ? <21\è=â½/Pè=âPdeSf `:g y `Sn m�j´k.mSJin:gao�p\Je � rSr � f s |Ck;mLJan�gao:p:J v ö�� q �¶| m¶� f � f w s q���f �e�u�v,w s }|Ck.mSJin:gao�p\J v ö w s �S�.���S�¦;� �5G�³C��¥E���a�.���}� � ¥E���N�4�L� H ���;¥��t� � ³C��¥��:�a�.���}� � ¥E���N�P�S�§µ ·©¸E�©� �2 FE/ m ? å + Þ5ß½àIá + 9EåSàóR G âP3 ? è6á.-�1VRæà¼â½ß_á ? <21:è=â½/Pè=â����í3 ? á.è���� �! " $#±3E1Qâxà +ED RI/Q<21:è=â½/Pè

k;mLJan�gao:p:J v ö%�'&�('&N�) * � .�+��,-(�, w s v (.&E�) * � .�/(�, wA FSà¼ÞCFKà¼âãßCFE/Äâ½/ L.åE/ + ÞCà +ED á ? <21:è=âZ/Pè=â0���í> 2 FE/Ä-81�à + <21\è=â½/Pè à¼âPdeSf `:g j�k;mLJan�gao:p:J v ö c f � � � �¶| m f � y w s y �L�¦��¡�S� !¬�5�&¥��:�i�;���&� � ¥��:�N�P�S�§µ ·T¸��©� �e v ö � ��� � � � � � � � � � � � � � � � w �S��)� ¥E���N�P�S�§µ �P�L£S£ �e v ö � � w �S��)� ¥E���N�P�S�§µ ���

Page 77: Functional programming using Caml Light Michel Mauny January 1995

� � �-�������� ������ �.� "���� �M�����E� �� ���� ��

*x+ ß6FE/ <EèC/PH.àIá.å2âQ<21\è=â½/PèT3 A /Kå2â½/ G 1 + à + ß6/Pè6-0/ G à¼1:ßC/KRæà¼â½ß0á ? <21:è=â½/Pè5â à + á.è G /PèYß6áÆ9EåSàóR G ß6FE/ â½/TÞ5á + G<21:è=âZ/PèT> ¹ /ÄÞP1 + èC/ G /5] + / c A àIß6FEá;åEß°å2âxà +ED âZå2Þ6FÆ1 RæàÂâZßTdeSf `:g je f `:g y `Ln c Ly j�k;mSJin:gio:p\Je v ö � �¶| c�|6k;mSJin:gio:p\J v ö Ly�y � � w s y � �\b��;�S�Ò� w s ¤�e u�v ö � � �¶| c�|6k;mSJin:gio:p\J v ö Ly�y � � � w s y � � ���;�S�Ò� w s ¤�e u�v ö w s Sye oPJ k;mSJin:gio:p\J v ö§| c)|Ck.mSJan�gao�p\J v ö w s ��S�;�L� ��� � � ��§{:g y w s �{�g y �S�¦��¡�S� !¬�5�&¥��:�i�;���&� � ¥��:�N�P�S�§µ ·T¸��©� �e v ö � ��� � � � � � � � � � � � � � � � w �S��)� ¥E���N�P�S�§µ �P�L£S£ �e v ö � � w �S��)� ¥E���N�P�S�§µ ���

@ /Pè6/.3 cØàÂâ -81 G /ÜRIá�ÞP1©R®ß6á 321 + G ß51:ô./Tâã1.â»<21:è=1:-0/PßC/Pè Ly ì ? á.è 9�Ë.¾GBK¾½Ã5È=ËI=.Å2À �PÃT¾Cî A FEáLâZ/Và + àIß½à¼1©RBH�1©RIåE/ÜàÂâß6FE/Q<21:è=âZ/Pè A àIß6FX1 + /P-0<Eß½7OâZß6è6/T1:-�<21:ß6ß6/Pè + > 2 FSà¼âV<21:è51:-0/Pß6/PèÄ1.ÞPÞ5åE-QåSR¼1:ß6/Tâ à + ß6/Pè6-0/ G à¼1:ßC/0è6/Tâ½åSRIß=âP3®1 + Gà¼â G /5RæàIH./Pè6/ G 1:ß ß6FE/Ä/ + G á ? <21\è=âxà +ED ß6FE/Üà + àIß½à¼1©RÖâZ/ L.åE/ + Þ5/ � > U ? ß6/Pè°ÞCFE/TÞCô.à +EDY? á.è ß6FE/V<Eè6/Tâ½/ + Þ5/Qá ? � 3�àºß»àÂâå2â½/ G ß6áQ<21:è=â½/Vß6FE/Qâ½/TÞ5á + G â½/ L;åE/ + Þ5/ � >Ï��ÜÎ � � � ��×��QÔ � �¬Ô�9 �éÙPÛ�;U â½åE-0-81:èC78á ? ß6FE/ÄÞ5á + âZß6è6å2Þ5ß=â�á:H./Pèãâ½ßCè6/T1:-8â�1 + G á ? <EèZàº-ØàºßZàºH;/Tâãá:H./Pèãâ½ß6èC/T1:-8â$à¼â D àIH./ + à + �����,>

U + 1©RIß6/Pè + 1:ß½àIH./ß6áK<21:è=âxà +EDÆA àIß6FXâZß6è6/T1:-8â 1 + G â½ßCè6/T1:- -1:ß=ÞCFSà +ED 1:è6/0ßCFE/KnLbP� fLf ` q 1 + G nLbP� f �NbLnSn<Eè6á D è=1:-8âP>

U�G /Pß=1©àæRI/ G <Eè6/Tâ½/ + ß=1:ß½àIá + á ? â½ßCè6/T1:-8âa1 + G â½ß6è6/T1:-�-81:ß=ÞCFSà +ED�? á\RóRIá A à +ED �5<Eè6/ G à¼Þ5ß½àIH./�<21:è=âxà +ED � â½/P-81 + ß½à¼ÞPâÞP1 + 9N/ ? á.å + G à + ��� �,3 A FE/Pè6/�1�RºßC/Pè + 1:ß½àIH./Äâ½/P-1 + ßZàÂÞPâ 1:è6/ D àIH./ +¡A àIß6FOâ½á;-0/°<NáLâ6âxàI9SRI/ àI-0<SRI/P-0/ + ß51:ß½àIá + âP>ÐÒÑ�Ô �¬Ó»Ù=ÝaÔÖÝ�! #"%$'&�(*)+" /���.0/ 1 Ã02�Å2Ã0¿ØÉ�¿.¾CÁðé¾ 5PË.¾QÊ*4LÃ�Dó¿;Å�=�7S¿F=;Ã8ËG5 Éi¾½Ã02$Çé¿.¾5ÀÌÊ*4LëQÃTÊ@ÀÌÈ8Ã4Ç6Éi¾½ÃPÁ5ÁPÀ¼Ë.Å�Á =.éÅ2ÃT¾½¿.Ê@ÃIB ���KÊ*4SÃ=.¾½¿.ëQëQ¿.¾��� q � y rLr j �����

u C � q � y � q � yu s � q � y � q � yu � � q � y � q � yu � � q � y � q � y

� ÁðÃÊ*4Là DæÃPÇ:À¼È5¿�D�¿.ÅN¿�D � �PÃT¾65PË.¾0¿.¾5ÀÌÊ*4LëQÃTÊ@ÀÌÈ ÃPÇCÉi¾½ÃPÁ5ÁðÀÌË.Å�Á =.À*?TéÅX¿ �6Ë�?©Ã J��#4LÃK¾½Ã4Á87QDæÊãËG58Ê*4Là ÉE¿.¾CÁðé¾�ë 7;ÁðÊ �CÃÊ*4LÃ0ÀÌÅ2Ê@ÃG=.é¾°¾½Ã4Á87QDæÊ@À¼ÅQ=A5P¾íË;ë)Ê*4LÃ0Ã�?T¿�D 7S¿.Ê@À¼Ë;ÅOËH5�Ê*4LÃQ¿.¾5À¼Ê*4Së�éÊ@À¼ÈYÃPÇ6Éa¾íÃ4Á=ÁPÀÌË.Å +�À JÂà J_ÀÌÊÌÁÄÊ��CÉ�ÃQë 7.ÁPÊ��6Ã��

g�p��N`TJ�s oPJEg�! #"%$'&�(*)+" /���.*K -�Å2¾5À¼È<4 Ê*4LÃ8Ê��CÉEÃVg�p��N`TJ�¿��6Ë ?TÃ�9�À¼Ê*4Æ¿KÈ=Ë.Å�ÁðÊ@¾I7SÈTÊ@Ë.¾ ��� � ��� p;k�{:g y oPJEñ 5PË.¾QÀ@B.éÅ2Ê@À 2Öé¾6Á +¿.ÅCBKÃTÅ2¾5ÀÌÈ+4KÊ*4Là DæÃPÇ:À¼È5¿�D¬¿.ÅN¿�D � �ðé¾;5ðË.¾QÀÌÊBÊ@Ë¡¾íÃ5È5Ë =.ÅNÀ �PÃVÀ*B.ÃTÅNÊ@À 2�ÃT¾CÁ �+7SÀ@DæÊC5ð¾½Ë.ë�¿�D ÉO4L¿ �6éÊ@À¼È DæÃTÊ@Ê@é¾6Á2(�74É.É�é¾ÄË.¾DæË�9�ÃT¾½È5¿:ÁPà *�J¬ÃTÅQ=.Ê*48ËH5ÄÀ@B.éÅ2Ê@À 2Öé¾6ÁVëQ¿#� �Cà DæÀ¼ëQÀÌÊ@à B�J

Page 78: Functional programming using Caml Light Michel Mauny January 1995

� ��������� � �

� !´��� � ���$��� ' � ����������� � ��� � � ' � ���#�"! '����� � ���B�"!#�$���

ò á ? 1\èT3 A /8F21©H./å2â½/ G äÖ1:-QR��Nà D FLßØà + 1 + à + ß6/Pè=1;Þ5ß½àIH./ A 1T7.> * ß àÂâY1©R¼â½áÒ<2áSâ6âxàI9SRI/ ß6áÆ<Eè6á D è=1:- à + äÖ1:-QR�Nà D FSßãà + 1Q921:ß=ÞCFEç@á.è½àI/ + ß6/ G A 1©7id A èZàºßZà +ED â½á.åEè5Þ5/ÄÞ5á G /Üà + 1 ]ERI/.3NF21©H.à +ED àIßVÞ5á.-0<SàæRI/ G à + ß6á81 + /5W�/TÞ5åEß51:9SRI/<Eè6á D è=1:- 3�1 + G /5W�/TÞ5åEßZà +ED ß6FE/8<EèCá D è=1:- á.åEß=âxà G /Ká ? ß6FE/¡äÖ1:-ØR �ià D FLßQ/ + H.àIè6á + -Y/ + ßT> *x+ ßC/Pè=1.Þ5ß½àIH./å2â½/YàÂâD è6/T1\ß ? á.è$Rº/T1\è + à +ED ß6FE/_R¼1 +ED å21 D / 1 + G L;åSàÂÞCô;Rº7KßC/Tâ½ß½à +EDQ+ / A�? å + Þ5ßZàºá + âP> ��1:ß=ÞCF8å2âZ/ãà¼â�-0á;è6/ Þ5á + H./ + àI/ + ßãß6áG /PH./5RIá.< RÂ1\è D /Pèã<Eè6á D è=1:-8â43LßCF21:ßãâ½FEá.åSR G 9N/Äå2â61:9SRI/ A àIß6FEá.åEß_ô + á A RI/ G D /Vá ? äÖ1:-ØR �ià D FLßT>

õ á.ß6/ ? á.è � 1.ÞCà + ß6áLâ½F�å2âZ/Pè=âPd¡921:ß=ÞCF¶Þ5á.-0<SàæR¼1:ß½àIá + à¼â + á.ß81©H�1©àæR¼1:9SRI/Æà + ßCFE/Oâ½ß=1 + G 1©RIá + /ÒäÖ1\-QR �Nà D FSß1:<E<SRæà¼ÞP1:ß½àIá + > * ßãè6/ L;åSàºèC/Tâãß6FE/ � � ¹ / + H.àIè6á + -Y/ + ß ìíâ½/P/Vß6FE/Qä�1:-QR �Nà D FSßã-81 + å21©R@î=>Ï_Ï°Î5Ï �Ü× 9 Û�� 9N=ÚÜÛ�Ô Õ �¬Ú�;��.9N Ýò ß=1 + G 1�Rºá + /Ä<Eè6á D è=1:-8â$1:è6/ÄÞ5á.-0<NáLâ½/ G á ? 1Qâ½/ L;åE/ + Þ5/Äá ? <EFEè=1.â½/Tâ43�Þ5á + ß=1�à + / G à + á + /Vá.èãâ½/PH;/Pè=1©R¬ß6/5WEßB]ERI/TâP>� FEè51.â½/TâV1:è6/Qß6FE/0â61\-0/01.âV1:ß_ß6á.<SRI/PH./5R,dV/5WE<Eè6/Tâ6âxàIá + âP3�H�1©RIåE/ G /TÞCR¼1:è=1:ß½àIá + â43¬ß½7L<N/ G /TÞCRÂ1\è=1:ß½àIá + âP3�/5W�Þ5/P<EßZàºá +G /TÞCR¼1:è=1:ßZàºá + âP3¬1 + GÆG àIè6/TÞ5ß½àIH./TâP> ¹ FE/ + /5W�/TÞ5åEß½à +ED ß6FE/0â½ß51 + G ç,1©RIá + /Q<Eè6á D è51:-)<Eè6á G å2Þ5/ G 9L7¡ß6FE/�Þ5á.-Y<SàóRI/PèT31©RæR�<EFEè=1.â½/TâV1:èC/Ä/5WE/TÞ5åEß6/ G à + á.è G /PèT> 2 FE/QH�1©RIåE/TâVá ? /5W�<Eè6/TâCâxàIá + âV1 + GÆG /TÞCR¼1:è6/ G D RIá.921©R�H�1:èZàÂ1\9SRº/Tâ 1:è6/ + á.ß<Eè½à + ß6/ G 32FEá A /PH./PèT> U â½ß=1 + G ç,1�Rºá + /Ä<Eè6á D è=1:-�F21.â�ß6áQ<N/Pè ? á;è6-�à + <EåEß 1 + G á.åEß6<EåEß /5W�<SRæà¼ÞCàIß½RI7.>@ /Pè6/ÜàÂâ_1â61:-0<SRI/Ä<EèCá D è=1:-¡3Eß6F21:ßã<EèZà + ß=â_ß6FE/ + åE-Q9N/Pè°á ? ÞCF21:è=1.Þ5ß6/Pè5â°1 + G ß6FE/ + åE-Q92/Pè_á ? Ræà + /Tâ_á ? àIß=â

â½ß=1 + G 1:è G à + <EåEßT3�RóàIô./ ß6FE/ n�� + àæW åEß½àæRóàIß½7.>f `�gtn©^ib y {�j y `:k M��S�f `�g f oPJa`L{�j y `:k M��S�g y � ^�o f `zg y mi`lcSpf `�g�n�j o4JS�LmEg+ASn©^ib y {�gEc AEo4J o4Jn©^ib y { r j �CnT^ab y { C:D��o©k�nlj � �TJ � g;^i`©J f o4Ji`S{ r j � f oPJa`S{ CEDh` f {L`§|©�

cSp:Ja` oTg;^ �.J2c A.p;k+A:kio f `¶s � y o4JEg+AEoPJEg �Cn©^ib y {®�� y o4J�gIAL{:g y o4J�ñ��hn©^ib y bSn:g2` y { �X�a�� y o4JEg+AEoPJEg � f oPJa`L{®�� y o4J�gIAL{:g y o4J�ñ�� f oPJa`L{ ��TJ±�a�` q o©g#M

� �

Page 79: Functional programming using Caml Light Michel Mauny January 1995

� � ���������� �� ���#�. ������� ������� � ���& "�� � �����J����� �� "����E�"�� #��� �.��.� ���

�S�2 FE/ oPJS�Sm�gIALn©^ab y ? å + Þ5ß½àIá + è6/T1 G âVßCFE/ + /5WEß�ÞCF21:è=1;Þ5ß6/Pè ? è6á.- 1 + à + <EåEß0Þ6F21 +E+ /5R°ì,FE/Pè6/.3${:g�cBAEoPJ¬3aß6FE/

ÞCF21 +E+ /5R Þ5á +E+ /TÞ5ß6/ G ß6áXâ½ß51 + G 1:è G à + <EåEßPî=> * ß0è=1©à¼â½/TâY/5W�Þ5/P<EßZàºá + �;J�cBA\p;kIA�kao f ` A FE/ + èC/T1.Þ6FSà +ED ßCFE/K/ + Gá ? ß6FE/Q]ERI/.> 2 FE/K` q o©g ? å + Þ5ß½àIá + 1\92á.è6ß5â_ß6FE/Q<Eè6á�Þ5/TâCâP> * ß=â 1:è D åE-Y/ + ß à¼âVß6FE/0/5WSàIß�â½ß51:ß6å2â á ? ß6FE/Q<Eè6á�Þ5/TâCâP>äÖ1©RæRæà +ED ` q o©gQà¼â°1:92âZá:RIåEß6/5RI7 + /TÞ5/Tâ6â61:è67ß6á0/ + âZåEè6/Ä<Eè6á;<2/Pè å2â½FSà +ED á ? ß6FE/Äá.åEßC<EåEß°Þ6F21 +E+ /5RÂâ4>U â6â½åE-Y/Äß6FSà¼â <Eè6á D è=1\-�à¼â�à + ]ERI/8n.p\mLJEg Ì� f > 2 áÞ5á.-0<SàæRI/QàIßT3iâíàº-Y<SRº7¡è6å + ßCFE/0nSbð� f n0Þ5á.-0-1 + G ? è6á.-ß6FE/ÄÞ5á.-Y-81 + G à + ßC/Pè6<Eè6/Pß6/PèTdnSbð� f n�s.ptn.p:mSJ�gtn.p:mSJEg Ì� f2 FE/ Þ5á.-Y<SàóRI/Pè<Eè6á G å2Þ5/Tâ81 + /5WE/TÞ5åEß=1:9SRI/ ]ERº/ n\p\mSJ�ga>���á.ålÞP1 +�+ á A è6å + n\p\mSJ�g A àºßCF�ß6FE/KFE/5RI<lá ? ß6FE/� ÞP1:-ØRºèCå + � Þ5á.-0-81 + G dnSbð� f y mSJ n.p\mLJEgtö#n\p\mSJ�g� ¼� f2 FSà¼â_â½FEá.åSR G G à¼â½<SR¼1©7 â½á.-0/PßCFSà +ED RæàIô./.d SM���n©^ib y bSn:g2` y { � D f oPJa`S{ � + G /Pè � + àóW¬3¬ßCFE/8n.p\mLJEg]ERI/8ÞP1 + 1.Þ5ß6å21©RæRI7Æ92/0/5WE/TÞ5åEß6/ GÒG àIè6/TÞ5ßZRº7.3��íå2âZß_RóàIô./1 + 7¡á.ß6FE/Pè � + àæW­Þ5á.-0-1 + G 31.â$à + d � n.p:mSJEg ö�n\p\mLJEg� ¼� f2 FSà¼âÄ1�RÂâZá A á;è6ô�â_å + G /Pè � ò ç�� �Vò 3a<Eè6á:H.à G / G ß6FE/Y/5W�/TÞ5åEß=1\9SRº/Ø]ERº/Yà¼â D àIH./ + /5W�ß6/ + âíàºá + 6` q `�> 2 F21:ß à¼âP3aà ?A /ÄÞ5á.-0<SàæRI/n\p\mLJEg� ¼� f 1.â ? á:RæRºá A â4dnSbð� f n�s.ptn.p:mSJ�g� C` q `ln.p:mSJEg Ì� fA /ÄÞP1 + è6å + n\p\mLJEg� 6` q ` G àºèC/TÞ5ß½RI7.3i1.âÖà + dn.p:mSJ�g� C` q `�ö¶n.p\mLJEg Ì� fò /P/ÄßCFE/Vè6/ ? /PèC/ + Þ5/Ä-81 + å21©R ? á.èã-0á.èC/_à +S? á.è6-1:ß½àIá + á + nSbð� f n�>

Ï_Ï°Î 7 � �¬Ú�;��.9N Ý ÙPÛ�ÝiÔ��VÔ �.9N � =Ô�Ý* ßÜà¼âÄ<NáLâ6âxàI9SRI/Kß6áÆâ½<SRæàºßQá + /<Eè6á D è=1:-�à + ßCáOâ½/PH./Pè51©R»â½á;åEè=Þ5/Q]ERI/TâP3Bâ½/P<21\è=1:ß6/5RI7ÒÞ5á.-0<SàæRI/ G > 2 FSàÂâ A 1©7.3aRIáEÞP1©RÞCF21 +ED /Tâ G á + á;ß_àº-Y<SRº7¤1 ? åSRæRBè6/TÞ5á.-Y<SàóR¼1:ßZàºá + á ? ß6FE/0<Eè6á D è=1:- > �a/PßÄå2â àæRæRIå2â½ß6è=1:ßC/8ß6F21\ß°á + ß6FE/Q<Eè6/PH.àIá.å2â/5W21:-0<SRI/.> ¹ /Äâ½<SRæàIß�àIß$à + ß A á -0á G åSRI/TâPd$á + /_ß6F21:ß àº-Y<SRº/P-Y/ + ß=â»à + ßC/ D /PèãÞ5á.å + ßC/Pè=â � 1 + á.ß6FE/Pè�ß6F21\ßB<2/Pè ? á.èC-8âß6FE/Ä1.Þ5ßCå21©R¨Þ5á.å + ß½à +ED > @ /Pè6/_à¼âãßCFE/_]2è=â½ßãá + /.3�n\p\mLJEgN` y ¼� f d| �#n\p\mSJ�gN` y Ì� f ���gS�.�a`�n\p\mLJEgN` y j����mEg2b � f ` �2b f$r o4JEg� �S�f `�ghJa` o4J¬oTg#j� �Nb f j oPJ¬oTg �L�f `�g�o4Jin y nljtn �Nb f öSs#n �Nb f C:D��S�f `�g y `Lb.ctnljtn �Nb f �S�@ /Pè6/_à¼âãß6FE/ÄâZá.åEè=Þ5/ ? á.è�ß6FE/ -81©à + <Eè6á D è51:- 3;à + ]ERI/°��b�o4J ¼� f >

Page 80: Functional programming using Caml Light Michel Mauny January 1995

����� � � �� ����" "�� �M���E����� � "� � � ���(��� � "| �X�¬bEo4J Ì� f ���f `�gtn©^ib y {�j#n.p\mLJEg2` y A�A©Ji` M��S�f `�g f oPJa`L{�j#n.p\mLJEg2` y A�A©Ji` M��S�g y � ^�o f `zg y mi`lcSpf `�g�n�j o4JS�LmEg+ASn©^ib y {�gEc AEo4J o4Jn.p:mSJEg2` y A AEoPJan y nT^ab y {®�o©k�nlj � �TJ � g;^i`©J�n\p\mLJEgN` y A�AEo4Jin y f oPJa`S{¶` f {L`§|©�

cSp:Ja` oTg;^ �.J2c A.p;k+A:kio f `¶s � y o4JEg+AEoPJEg}|4n.p:mSJ�gN` y A A y `Sb\c´nT^ab y {E�¬�� y o4J�gIAS{�g y o4JEñ �hn©^ib y bLn:g2` y { �X���� y o4JEg+AEoPJEg}|4n.p:mSJ�gN` y A A y `Sb\c f o4Ji`S{E�¬�� y o4J�gIAS{�g y o4JEñ � f oPJa`S{ ��TJ±���` q o©g#M

�S�õ á.ß½à¼Þ5/Qß6F21:ß_è6/ ? /PèC/ + Þ5/TâVß6áYà G / + ß½àæ]2/Pè=â G /5] + / G à + -Yá G åSRI/Kn.p:mSJEg2` y Ì� f 1:èC/�<EèC/5]EW�/ G A àIß6FÒßCFE/ + 1\-0/Äá ?ß6FE/ -0á G åSRI/.3 n\p\mLJEgN` y 321 + G 9L7#A AKì,ß6FE/��CRIá +ED G 1;â½F � âZ7L-Q92á\R d ß A áYå + G /Pè=â6Þ5á.è6/QÞ6F21\è=1.Þ5ß6/Pè=âðî=> *@?�A / F21 GâxàI-0<SRI7 / + ß6/Pè6/ G Ji` M23 ? á.è»à + âZß=1 + Þ5/.3Nß6FE/�Þ5á.-Y<SàóRI/Pè A á.åSR G F21©H./Ä1.â6âZåE-0/ G Ja` à¼â°1 + à G / + ßZàó]2/Pè G /TÞCR¼1:èC/ Gà + ß6FE/ÄÞ5åEèCè6/ + ß -0á G åSRI/.3a1 + G à¼â6âZåE/ G 1 + �5å + G /5] + / G à G / + ß½àæ]2/Pè � /Pè6è6á.è©>

ä$á.-0<SàæRæà +ED ß6FSà¼â <Eè6á D è=1\-}èC/ L.åSàIè6/Tâ ß A á0Þ5á.-Y<SàóR¼1:ßZàºá + â½ß6/P<2â43E<SRIå2âãá + /Ü] + 1©R¬Ræà + ô.à +ED â½ßC/P<¬>nSbð� f n�sSn#n.p:mSJ�gN` y Ì� fnSbð� f n�sSnX��b�o4J Ì� fnSbð� f n�s.p���b�o4J�n\p\mLJEgN` y " p¤�¬bEo4J " p= å +E+ à +ED ß6FE/V<Eè6á D è=1:-&à¼â G á + /�1.â$92/ ? á.è6/.dnSbð� f y mSJ«��bEoPJ�ö#n.p:mSJEg2` y Ì� f2 FE/ sLnãá.<EßZàºá + ß6áVnSbP� f nÖ-Y/T1 + â �4Þ5á.-0<SàæRI/Öá + Rº7 � � ß6F21\ßaà¼âP3:ß6FE/ÖÞ5á;-0<SàæRº/PèBâZFEá.åSR G + á;ß±1:ß6ß6/P-Y<E߬ß6á_<Eè6á G å2Þ5/�1â½ß=1 + G ç,1©RIá + /�/5W�/TÞ5åEß=1\9SRº/�<Eè6á D è=1:- ? è6á.-�ß6FE/ D àIH./ + ]ERI/.3.9EåEß�âxàI-0<SRI7�1 + á;9 �í/TÞ5ß®Þ5á G /$]ERI/_ì@]ERI/Tâ$n\p\mLJEgN` y " pN3��b�o4J " pEî=> 2 FE/�] + 1©RSRæà + ô;à +ED <EF21.âZ/Tâ¬ß=1\ô./Tâaß6FE/$ß A á " p ]ERI/Tâ®1 + G <Eè6á G å2Þ5/Tâ®ß6FE/$/5W�/TÞ5åEß=1\9SRº/���b�o4J¬> � 9 �½/TÞ5ß]ERI/Tâã-Qå2â½ß�9N/VRæà + ô./ G à + ßCFE/Vè½à D FLß�á.è G /PèTd ? á.è�/T1.Þ6F D Rºá;921©Raà G / + ß½àæ]2/PèT3Nß6FE/V-0á G åSRI/ G /5] + à +ED àIßã-Qå2â½ßãÞ5á.-0/92/ ? á.è6/VßCFE/Ä-0á G åSRI/Tâãß6F21\ßãå2â½/_àIßT>

� è6/5]EWSà +ED 1©RæR°/5W�ßC/Pè + 1©Rãà G / + ß½àæ]2/Pè=â09S7¤ß6FE/ + 1:-0/Ká ? ß6FE/5àIè G /5] + à +ED -0á G åSRI/Kà¼â8âZá.-0/Pß½àI-0/TâQßC/ G àºá;å2âP>2 FE/Pè6/ ? á.è6/.3Nß6FE/äÖ1:-ØR �Nà D FSßÄÞ5á.-0<SàæRI/PèÄ<Eè6á:H;à G /Tâ_1-0/TÞCF21 + à¼â½- ß6á0á;-QàIßVß6FE/°�apLc\m f ` A�AQ<21:è6ß à + /5WEß6/Pè + 1©Rà G / + ßZàó]2/Pè5âP> 2 FE/ â½7Eâ½ß6/P-&-81©à + ß=1©à + âã1_Ræà¼â½ßãá ? � G / ? 1:åSRIß � -0á G åSRI/TâP32ÞP1©RæRI/ G ß6FE/VÞ5åEè6è6/ + ß½RI70á.<N/ + / G -0á G åSRI/TâP31 + G A FE/ + /PH./Pè àIßB/ + Þ5á.å + ß6/Pè=â�1 + à G / + ß½àæ]2/Pè A àºßCFEá.åEß�ß6FE/B�apLc\m f ` A�Aã<21\è6ßT3©àIßBâ½/T1:è=ÞCFE/Tâ�ßCFEè6á.å D F ß6FE/ãá.<N/ + / G-0á G åSRI/TâP3Sß6á_] + G á + /ãßCF21:ß G /5] + /Tâ$ß6FSà¼â®à G / + ßZàó]2/Pè©> ò /T1:è5Þ6FE/ G -Yá G åSRI/Tâ�1©R A 1T7Eâ�à + ÞCRIå G /Vß6FE/ã-0á G åSRI/°9N/5à +EDÞ5á.-0<SàæRI/ G ìíâ½/T1:è5Þ6FE/ G ]2è=âZßPî=321 + G âZá.-0/_RæàI9Eè=1:è67K-0á G åSRI/Tâ_á ?±D / + /Pè51©R±å2â½/.> *,+ 1 GEG àIß½àIá + 32ß A á G àIè6/TÞ5ß½àIH./Tâ_1:è6/<Eè6á:H;à G / G ß6á81 GEG 1 + G ß6á0è6/P-0á:H./_-0á G åSRI/Tâ ? è6á;-}ßCFE/_Róà¼â½ß_á ? á.<2/ + / G -0á G åSRº/Tâ4d

ê e p\�i`©J}�6�apSc:m f `2���L�BßCáØ1 GEG �apLc\m f `Và +K? è6á + ß�á ? ß6FE/_RæàÂâZß �ê e n f p�{S`��C�apLc\m f `2�a�S��ß6á0è6/P-0á:H./��apLc\m f ` ? è6á;-}ßCFE/VRæà¼â½ßT>

�Eá;è�à + â½ß=1 + Þ5/.3 A /ÄÞP1 + èC/ A è½àIß6/ÄßCFE/ã�¬bEoPJ Ì� f ]ERI/Q1:92á:H./Ä1.â4d

Page 81: Functional programming using Caml Light Michel Mauny January 1995

��� ���������� �� ���4�. ������� ������� � ���& "�� � �����J����� �� "����E�"�� #��� �.��.� ���

e p:�a`TJ}�\n\p\mSJ�gN` y ���L�f `�gtn©^ib y {�j�Ja` M��S�f `�g f oPJa`L{�j�Ja` M��S�g y � ^�o f `zg y mi`lcSpf `�g�n�j o4JS�LmEg+ASn©^ib y {�gEc AEo4J o4Jo4Jin y nT^ab y {®�o©k�nlj � �TJ � g;^i`©J§oPJan y f oPJa`S{cSp:Ja`

oTg;^ �.J2c A.p;k+A:kio f `¶s � y o4JEg+AEoPJEg}| y `Lb.ctn©^ib y {E���� y o4JEg+AS{�g y oPJEñ �hn©^ab y bLn:gN` y { �Ò�a�� y o4JEg+AEoPJEg}| y `Lb.c f oPJa`L{E���� y o4JEg+AS{�g y oPJEñ � f o4Ji`S{ ��©J����` q o©g#M

�S�U ? ß6/Pè�ß6FE/ e p\�i`©J}�:n.p:mSJEg2` y � G àºèC/TÞ5ß½àIH./.3Eß6FE/_à G / + ß½àæ]2/PèãJa` 1:åEß6á.-81\ß½à¼ÞP1©RæRº7è6/Tâ½á\RºH;/Tâ�ß6án\p\mSJ�gN` y { A�A©Ji` >

* ? ß A á -0á G åSRI/TâP3ÖâC1T7¡�ipSc�D1 + G �apSc �N3 G /5] + /K92á.ß6Fl1 D RIá.921�RÖH�1�RºåE/¡ki3 ß6FE/ + k­à + 1ÆÞCRæàI/ + ß-0á G åSRI/n f o;`TJEg¤è6/Tâ½á:RIH./TâYß6á �apLc D A�A:kÒà ? �apLc DéàÂâYá.<N/ + / G 9EåEß + á.ßÄ�apSc �N3Bá;è0à ? �apLc DKF21;â09N/P/ + á;<2/ + / G -Yá.è6/è6/TÞ5/ + ß½RI7Kß6F21 + �ipSc �N> � ß6FE/Pè A à¼â½/.3NàIß_è6/Tâ½á:RIH./Tâ ß6áÄ�apLc��BA�A:ki>��Eá;è�à + â½ß=1 + Þ5/.3aß6FE/ ß A á0â½7Eâ½ß6/P- -0á G åSRI/TâQo4J�g1 + G k f pEb:gK92á;ß6F G /5] + /Qß6FE/Üà + ]EW¡à G / + ß½àæ]2/Pè C2> �$á.ß6F¡-0á G åSRº/TâQo4JEgé1 + G k f p�b:gé1:èC/Äá.<N/ + / G 9S7 G / ? 1:åSRIßT39EåEß o4J�g¤Þ5á.-0/TâÜ]2è=â½ßT> @ / + Þ5/.3 q C��­àÂâØå + G /Pè=â½ß6áSá G 1;âÄßCFE/à + ß6/ D /Pè1 GEG àIß½àIá + 3Öâíà + Þ5/#C¡à¼â0èC/Tâ½á:RIH./ G ß6áo4J�gIA�A�CN>��$åEßV1 ? ßC/Pèãß6FE/ G àIè6/TÞ5ßZàºH;/ e p\�a`TJ}�4k f pEb:g¬�a�S�ð3S-0á G åSRI/Qk f pEb:gKÞ5á.-0/Tâ»]2è=â½ßT3a1 + G ßCFE/Và G / + ßZàó]2/Pè%Cà¼âãèC/Tâ½á:RIH./ G ß6á0k f pEb:g+A A�C2>

Ï_Ï°Î�� � �0ÝN× �.9ãÓ ×®Ù=ÚVÛò á.-0/ D RIá.921©R¼â G /5] + / G à + 10-Yá G åSRI/81:èC/ + á.ß à + ß6/ + G / G ß6á92/Qå2â½/ G á.åEß5âxà G /�á ? ß6FSà¼â_-0á G åSRI/.> 2 FE/ + 3NàIß àÂâD áSá G <Eè6á D è=1:-0-Qà +ED â½ß½7;Rº/ + á;ßÖßCá�/5WE<2á;è6ß�ß6FE/P-�á.åEß=âxà G /Vá ? ßCFE/V-0á G åSRI/.32âZá�ßCF21:ß�ß6FE/ Þ5á;-0<SàæRº/PèVÞP1 + ÞCFE/TÞ6ôß6FE/P7Æ1:è6/ + á.ßVå2â½/ G à + 1 + á.ß6FE/PèV-0á G åSRI/.> U R¼â½á23aá + /0-81©7 A à¼â½FÒß6áK/5WE<2á;è6ßÄ1 G 1:ß=1Yß½7L<N/81:92â½ß6è51.Þ5ß½RI7.3aß6F21:ßà¼âP3 A àIß6FEá.åEßã<EåE9SRæà¼ÞCàIï5à +ED ß6FE/Qâ½ß6è6å2Þ5ßCåEè6/Vá ? ß6FE/Äß½7S<2/.> 2 FSà¼â / + â½åEè6/Tâ ß6F21:ßãá;ß6FE/Pèã-0á G åSRI/TâVÞP1 +E+ á.ßã9EåSàæR G á.èà + â½<2/TÞ5ß á.9 �½/TÞ5ß=â á ? ß6F21:ß_ß½7L<N/ A àºßCFEá.åEß D á:à +ED ß6FEè6á.å D FÆá + / á ? ßCFE/ ? å + Þ5ß½àIá + âVá + ß6F21:ß_ß½7L<N/�/5WE<2á;è6ß6/ G à +ß6FE/ G /5] + à +ED -0á G åSRI/.> 2 FSà¼â FE/5RI<2â�à + A è½àIß½à +ED ÞCRI/T1 + 3 A /5RóRIç,â½ßCè6å2Þ5ß6åEè6/ G <Eè6á D è=1\-8âP>2 FE/ A 1©7°ß6á G á_ß6F21:ßaà + äÖ1:-QR��Nà D FLß®à¼â®ß6á A è½àIß6/Ö1 + /5WE<SRóà¼ÞCàIß$à + ß6/Pè ? 1.Þ5/.3:á;è¬á.åEß6<EåEß�âxà D.+ 1:ß6åEèC/.3.â½<2/TÞCà ? 7.à +ED

ß6FEáLâZ/à G / + ß½àæ]2/Pè=âYß6F21:ß81\è6/8H;à¼âxàI9SRI/ ? è6á.- ß6FE/Ká.åEß=âxà G /.> U RæR°á.ß6FE/PèØà G / + ß½àæ]2/Pè=â A àæRæR è6/P-1©à + RºáEÞP1©R°ßCáÒß6FE/-0á G åSRI/.> �Eá;è D RIá.921©R�H�1©RIåE/TâP3Nß6FE/5àIèVß½7L<N/Tâã-Qå2â½ß 92/ D àºH;/ + 9S7KF21 + G > 2 FE/Üà + ß6/Pè ? 1.Þ5/Üà¼â°Þ5á + ß=1©à + / G à + 1Ø]ERI/A FEáLâZ/ + 1:-0/_à¼âãßCFE/V-0á G åSRI/ + 1:-0/.3 A àIß6F¡/5W�ßC/ + âxàIá + Ì� f oS>@ /Pè6/_à¼â ? á.è$à + â½ß=1 + Þ5/�1 + à + ß6/Pè ? 1.Þ5/ ? á.è�ß6FE/0n.p\mLJEg2` y -0á G åSRI/.32ßCF21:ßã1:92â½ß6è=1;Þ5ß=â�ß6FE/Vß½7S<2/Qn.p:mSJ�gN` y d

| �#n\p\mSJ�gN` y Ì� f o �E�gS�.�a`�n\p\mLJEgN` y �L� | �#bTJ�b �i{:g y bSn�g�gS�.�a`����Nb f mi`¤Ja` r o4JEg�s �n.p:mSJEg2` yb©J�cto4Jin y r n.p:mSJ�gN` y s �mSJ�o©gb©J�c y `Lb.c r n.p:mSJ�gN` y s o4J�g$�S�

Page 82: Functional programming using Caml Light Michel Mauny January 1995

����� ����� �&�.� "� ��.�)��� ���*x+ ßC/Pè ? 1;Þ5/TâÄ-Qå2â½ßQ9N/éÞ5á.-Y<SàóRI/ G â½/P<21:è=1:ßC/5Rº7.> @ á A /PH./PèT3®á + Þ5/ß6FE/à + ß6/Pè ? 1.Þ5/ ? á.èQ-0á G åSRI/ �)F21.â 9N/P/ +

Þ5á.-0<SàæRI/ G 3¬1 + 7K-0á G åSRº/ ß6F21:ß_å2â½/Tâ���ÞP1 + 92/ àI-0-0/ G à¼1:ßC/5Rº7ÆÞ5á.-0<SàæRI/ G 3¬/PH./ + à ? ß6FE/VàI-0<SRI/P-0/ + ß=1:ß½àIá + á ?�´àÂâ + á.ßã7;/Pß°Þ5á.-0<SàæRI/ G á.è /PH./ + + á.ß�7./Pß A è½àIß6ß6/ + >�ä$á + âxà G /PèTdnSbð� f n�sSn#n.p:mSJ�gN` y Ì� f onSbð� f n�sSnX��b�o4J Ì� fnSbð� f n�sSn#n.p:mSJ�gN` y Ì� fnSbð� f n�s.p���b�o4J�n\p\mLJEgN` y " p¤�¬bEo4J " p2 FE/ àº-Y<SRº/P-Y/ + ß=1\ß½àIá + ��b�o4J ¼� f Þ5á.åSR G 92/ÆÞ5á.-0<SàæRI/ G 9N/ ? á;è6/Æn\p\mSJ�gN` y Ì� f > 2 FE/ á + RI7�è6/ L;åSàIè6/P-0/ + ß ? á.èÞ5á.-0<SàæRæà +ED �¬bEo4J Ì� f àÂâ ß6FE/V/5WSà¼â½ß6/ + Þ5/Qá ? n.p:mSJEg2` y " oL3Sß6FE/ÄÞ5á.-Y<SàóRI/ G à + ßC/Pè ? 1;Þ5/Äá ? ßCFE/0n.p:mSJ�gN` y -0á G åSRº/.>

ÐÒÑ�Ô �¬Ó»Ù=ÝaÔÖÝ�! #"%$'&�(*)+" /O/C.0/�� Ë;ëãÉ�DóéÊ@ðÊ*4SÃãn.p:mSJEg8È5Ë.ëQë�¿;ÅOB�� À¼Ê�Á 4LË 7�D B �CÃ_¿��+DæÃãÊ@ËQË5ÉEÃT¾½¿.Ê@Ã_Ë.Å0ÁPÃF?©ÃT¾½¿�D 2�DæÃPÁ +%=;À@?©ÃTÅ0Ë;ÅÊ*4LÃQÈ5Ë.ëQë�¿;ÅOB�DóÀÌÅ2Ã'J��VÀÌÅ2Ê �${:�2{ A ALn.pT�S��bTJ2c A f oPJa`8ÀÂÁ ¿.ÅÆ¿.¾5¾½¿#�0ËG5VÁPÊ@¾5À¼ÅQ=:Á +±È=Ë;Å2Ê@¿.ÀÌÅ2ÀÌÅ�=YÊ*4LÃQÈ=Ë.ëQëQ¿.ÅCB � DæÀÌÅ2ÿ.¾0=�7SëQÃTÅNÊÌÁÄÊ@ËKÊ*4LàÉi¾½ËTÈ5ÃPÁ5Á<J

Page 83: Functional programming using Caml Light Michel Mauny January 1995

�#� ���������� �� ���4�. ������� ������� � ���& "�� � �����J����� �� "����E�"�� #��� �.��.� ���

Page 84: Functional programming using Caml Light Michel Mauny January 1995

� �#K� �����

� ����� � � ' ! ' ')( ��� � � '

���

Page 85: Functional programming using Caml Light Michel Mauny January 1995
Page 86: Functional programming using Caml Light Michel Mauny January 1995

� ��������� ���

� � � % � � � ����� � ��� �� � � '

¹ /_<Eè6/Tâ½/ + ß�à + ß6FSà¼âÖÞCF21:<Eß6/Pè�1QâxàI-0<SRI/_RÂ1 +ED å21 D /.d U ò �Òì U ò -1©RæR ��1 +ED å21 D /:î5> 2 FSàÂâ R¼1 +ED å21 D /�à¼â$921.âxà¼ÞP1©RæRI7ß6FE/��Eç,ÞP1©R¼Þ5åSRIå2â0ìxß6FE/Q<EåEè6/5RI7 ? å + Þ5ß½àIá + 1©R�ô./Pè + /5RBá ? äÖ1:-QR@îã/ + è½à¼ÞCFE/ G A àIß6FX1KÞ5á + G àºßZàºá + 1©R»Þ5á + âZß6è6å2Þ5ßT> 2 FE/Þ5á + G àIß½àIá + 1©R�-Qå2â½ß°9N/81Kâ½<N/TÞCàÂ1�RÖÞ5á + â½ß6è6å2Þ5ß©3a92/TÞP1:å2â½/Yá.åEè_R¼1 +ED å21 D / A àæRæRÖ9N/8â½åE9E-QàIß6ßC/ G ßCá ÞP1©RæRºç@9S7Sç@H�1©RIåE/.dß6FSå2âP3Eß6FE/ÄÞ5á + G àºßZàºá + 1©R ÞP1 +E+ á.ßã92/Q1 ? å + Þ5ß½àIá + >

U ò �h<Eè6á D è51:-8âÄ1\è6/89EåSàæRIßåE< ? è6á.- + åE-�9N/Pè=âP3�H:1:è½à¼1:9SRI/TâP3 ? å + Þ5ßZàºá + 1©Rã/5W�<Eè6/TâCâxàIá + âì��Eç,1:92â½ßCè=1.Þ5ß½àIá + â5î531:<E<SRæà¼ÞP1:ß½àIá + â1 + G Þ5á + G àIß½àIá + 1©R¼âP> U + U ò ��<Eè6á D è=1:-"Þ5á + âxà¼â½ß=âQá ? 1 D RIá.921©R G /TÞCR¼1:è=1:ß½àIá + á ? 1 + à G / + ß½àæ]2/PèD /Pß6ßZà +ED 92á.å + G ßCáVß6FE/°H:1©RIåE/°á ? 1 + /5WE<Eè6/Tâ6âxàIá + > 2 FE/ã<Eè½àI-QàIß½àIH./ ? å + Þ5ß½àIá + â$ß6F21:ß�1:è6/°1©H�1�àóR¼1:9SRI/Ä1:èC/ã/ L.å21�RóàIß½792/Pß A /P/ +Æ+ åE-Q9N/Pè=âV1 + G 1:è½àIß6FE-0/PßZàÂÞØ9Sà + 1\è67 á.<N/Pè=1:ß½àIá + â4> 2 FE/0Þ5á + Þ5è6/Pß6/0â½7 + ß=1©W á ? UÄò �¤/5WE<Eè6/Tâ6âxàIá + â ÞP1 +92/ G /Tâ6Þ5è½àI92/ G ìí1\-�9Sà D åEá;å2âxRI72îÖ1;âPd

� q � y rSr j �����u ��� � � �u �;oTk¬� � q � y �Pg;^a`TJ±� � q � y �\` f {S`�� � q � y �4kioE�u �N|��� q � y �;���u � ��� ��� � � � �� P� � q � y

1 + G ß6FE/Äâ½7 + ß51©Wéá ? G /TÞCR¼1:è=1\ß½àIá + â$à¼â D àºH;/ + 1.âPd� `Sn f�rSr j�� f `:g¬� ��� � ��� � �i`2� � q � y ���4�

u � q � y ���4�U è½àIß6FE-0/Pß½à¼ÞV9Sà + 1:èC7Ká.<2/Pè=1\ß½àIá + â A àóRæR�92/ A è½àIß6ß6/ + à + <EèC/5]EW <2áLâxàIß½àIá + 1 + G A àóRæR�92/5RIá +ED ß6á0ß6FE/ÄÞCR¼1.âCâ ��� � � � >2 FE/ �0â½7S-�9Ná:R A àæRæR�<SRÂ1©7ß6FE/ÄèCá:RI/Vá ? ßCFE/QäÖ1:-QR¬ô./P7 A á.è G k;mLJan�gao:p:J¬>

¹ /°â½ß=1:èCß�9L7 G /5] + à +ED ß6FE/°1:92â½ßCè=1.Þ5ßBâ½7 + ß51©W�á ? U ò �¡/5W�<Eè6/TâCâxàIá + â�1 + G á ? UÄò �¡ß6á.<SRI/PH./5Ra<EFEè=1.â½/Tâ4> 2 FE/ +A / G /5] + /Ò1 <21:è=â½/PèYà + á;è G /Pè0ß6á¤<Eè6á G å2Þ5/­1\92â½ß6è=1.Þ5ßâ½7 + ß=1©W�ß6è6/P/Tâ ? è6á.- ß6FE/OÞ5á + Þ5èC/Pß6/Oâ½7 + ß=1©Wlá ? UÄò �<Eè6á D è=1:-8âP>

Ï 7ÜÎ5Ï � ��� 9��0ÝN× �.9ãÓ ×}ÝC�0Û_×.9�Ñ�× �¬Ô�ÔÖݹ /0/ + Þ5á G /H�1:è½à¼1:9SRI/ + 1:-0/TâÜ9L7 + åE-Q92/Pè5âP> 2 FE/TâZ/ + åE-Q92/Pè=âÜè6/P<Eè6/Tâ½/ + ßÄß6FE/ �4À¼ÅCB.À¼ÅQ=PB;ýÉiÊ*4Ká ? H�1:è½à¼1:9SRI/TâP>�Eá;è�à + â½ß=1 + Þ5/.3EßCFE/ ? å + Þ5ß½àIá + á ? q è6/PßCåEè + à +ED q ì,ß6FE/ U ò �Æà G / + ß½àIß½7 ? å + Þ5ß½àIá + î A àæRæR±92/ è6/P<Eè6/Tâ½/ + ß6/ G 1.âPd �i{¬|�� q ��� � b y D;�

�.ø

Page 87: Functional programming using Caml Light Michel Mauny January 1995

��� �������� �� �� �B� �� ��* �E�� #� ��� �.��� � $ �%�&�

U + G ß6FE/ U ò �X1\<E<SRóà¼ÞP1:ßZàºá + ? å + Þ5ß½àIá +¡A FSà¼Þ6F A á;åSR G 9N/ A èZàºßCß6/ + à + ä�1:-QR,d|Ck.mSJin:gao�p\J#k s }|Ck.mSJan�gao�p\J q s lk�| q �S�L�A á.åSR G 9N/Vè6/P<Eè6/Tâ½/ + ß6/ G 1;âPd �i{¬|��4k¬��� �i{¬|�� q ��� �L�B| � b y � � � b y D.�S�S�1 + G â½FEá;åSR G 9N/VH.àI/ A / G 1.â»ß6FE/Äß6èC/P/.d

�i{ �a{�4k��

� q � �S�� b y � � b y D

����� ������ � ���

��� � ���� b y Jéâ½FEá;åSR G 92/VèC/T1 G 1.â �P1 + á�ÞPÞ5åEè6èC/ + Þ5/°á ? ß6FE/ãH�1\è½à¼1:9SRI/V92á.å + G 9S7Qß6FE/ãJEß6FK1:92â½ß6è51.Þ5ß½àIá +0+ á G /°/ + Þ5á;å + çß6/Pè6/ G A FE/ +ÆD á:à +ED ß6á A 1:è G ß6FE/ è6áSá.ß°á ? ß6FE/�1:92âZß6è=1.Þ5ß°âZ7 + ß=1©W ß6èC/P/ � > *x+ á;åEè°/5W21:-0<SRI/.3 A FE/ +ÆD á:à +ED? è6á.-� b y �Yß6á0ß6FE/Vè6áSá.ßT3Sß6FE/ � + G 1:92â½ßCè=1.Þ5ß½àIá +K+ á G / A /_/ + Þ5á.å + ßC/Pèãà + ß6è6á G å2Þ5/Tâãß6FE/8�4k¬�VH:1:è½à¼1:9SRI/.>2 FE/ + åE-Q92/Pè=â / + Þ5á G à +ED H�1\è½à¼1:9SRI/Tâ à + 1:92â½ß6è=1;Þ5ß�â½7 + ß51©WXß6è6/P/Tâ á ?�? å + Þ5ß½àIá + 1©R°/5WE<Eè6/Tâ6âíàºá + â01:è6/8ÞP1�RóRI/ G� �_/ �$è6åSà � + & + åE-Q92/Pè=â � > 2 FE/�ÞCF21:è=1;Þ5ß6/Pè=â�ß6F21\ß A /Ä1:ß6ß=1.ÞCFKß6á81\92â½ß6è=1.Þ5ßZàºá + + á G /Tâ°âxàI-0<SRI7Æâ½/Pè6H./Q1.â G áEÞ5åEç

-0/ + ß=1:ß½àIá + d®ß6FE/P7 A àæRæR + á.ß�92/_å2â½/ G 9L701 + 7Qá ? ß6FE/°â½/P-1 + ßZàÂÞ 1 + 1©RI7�âZ/TâBßCF21:ß A / A àæRæR�<N/Pè ? á.è6-§á + ß6FE/_ß6è6/P/TâP>2 FE/Vß½7S<2/Äá ? UÄò �¤1:92â½ßCè=1.Þ5ß°â½7 + ß=1©W8ß6èC/P/Tâ$à¼â G /5] + / G 9L7ade gL�;�i`�bS{ f j � p\Ji{:g p;k o4JEge u � b y p.k�o4J�ge u-� p\J�c#p;ktbL{ f ��bS{ f ��bL{ fe u �S� p.ktbS{ f �#bL{ fe u �a{¶p.kt{:g y o4J�ñ �#bS{ fee bTJ2chg�p\��ASbS{ f j � `Ln f p.k {�g y o4JEñ ��bL{ f �S��<�����h�.¥S� ²E�T¸N�P�±�;²¨¯�<�����h�L�5�.KE�;¥L�#²E�T¸N�P�±�;²¨¯

Ï 7ÜÎ 7 � 9 �¬Ý�ÙPÛ�; � � � Õ �¬Ú�; �.9 Ýõ á A�A /VÞ5á.-0/ ß6áQß6FE/V<Eè6á.9SRI/P-�á ? G /5] + à +ED 1YÞ5á + Þ5è6/Pß6/Äâ½7 + ß=1©W ? á.è U ò �Ò<EèCá D è=1:-âÖ1 + GKG /TÞCRÂ1\è=1:ß½àIá + âP>2 FE/ÖÞCFEá:à¼Þ5/ãá ? ß6FE/ãÞ5á + Þ5è6/PßC/»1;â½<2/TÞ5ß�á ? ßCFE/Ö<EèCá D è=1:-âaà¼â�âxàI-0<SRI701ã-1:ß6ß6/Pè®á ? ß=1.âZß6/.> 2 FE/�á + / A /ÖÞCFEáSáLâ½/

FE/Pè6/Qà¼â ÞCRºáSâ½/0ß6áKß6FE/â½7 + ß=1©WÆá ? �Eç,ÞP1©R¼Þ5åSRIå2âYì,/5W2Þ5/P<EßÄß6F21:ß A / A àæRæRÖå2â½/Yß6FE/ �C¿.È &©Á8Dæ¿:ÁI4ØÞCF21:è=1;Þ5ß6/PèV92/TÞP1:å2âZ/ß6FE/Pè6/à¼â + á � � � á + á.åEèQô./P7S92áL1:è G â5î=> ¹ / A àæRæR°å2â½/KßCFE/ÒÈF7S¾=¾5À¼ÃIBKH./Pè5âxàIá + â á ? / L;å21©Ræàºß½7l1 + G 1:è½àIß6FE-Y/Pß½à¼Þ? å + Þ5ß½àIá + âP> ¹ / A àæRæRÖ1©R¼â½á0å2âZ/�1 Éi¾½Ã32BÇ + á;ß=1:ß½àIá + ì��1ÜRÂ1 �Nà¼â½<aî ? á.èãß6FE/5àIèV1:<E<SRæà¼ÞP1:ß½àIá + > ¹ / A àæRóR A è½àIß6/�� C�| CD �N� � à + âZß6/T1 G á ? �E| D C��2� C � > 2 FE/ �\oTk�*& g;^i`©J���«` f {L` ��� � Þ5á + â½ßCè6å2Þ5ß A àæRæRã92/ A è½àIß6ß6/ + �:o©k�*&g;^i`©J���«` f {L` ���Xkao � 3±1 + G A àóRæRãè6/Pß6åEè + ß6FE/0g;^i`©JÒ<21:è6ß A FE/ + �*&�àÂâ G à �¬/Pè6/ + ß ? è6á.- �Æì � 1.Þ5ß=â_ßCFLå2â 1.â? 1©R¼âxàIßí7Yà + U ò �XÞ5á + G àºßZàºá + 1©R¼â5î=>

�������������������������! #"%$� �$'&%��()�*�!+�,.-/,102�435"%6*7 8%�97:�<;:=?>�@A7:�)$�"%(#�B"2C%$�DE�?F�7.G.7:CH�IC%�JC%���LKM��F��1�I�*7:F?��G�C%"%�?�IC%KJ�B�*C2$?D�N�OEF?��G:F�6*G:6#&C%��"%KJ&�,

Page 88: Functional programming using Caml Light Michel Mauny January 1995

� � � � � ���� ����������� � � ���& "�� � ���

�.���.� � � ���������������� �� "�� 2 FE/ÄÞ5á + Þ5èC/Pß6/�1.âZ<2/TÞ5ßãá ? U ò �Ò<Eè6á D è=1:-8â A àæRæR�92/Ä/5àIß6FE/Pè G /TÞCR¼1:è=1:ßZàºá + â�á ? ß6FE/ ? á.è6- d

f `:g À*B.ÃTÅNÊ@À 2�ÃT¾ �i`KÃPÇCÉi¾½ÃPÁ5ÁðÀÌË.Å��á.èTd

ÃPÇ6Éa¾íÃ4Á=ÁPÀÌË.Å��A FSà¼ÞCF A àæRæR¨9N/Äå + G /Pè=âZß6áLá G 1;âPd

f `:g�oTg �i`KÃPÇCÉi¾½ÃPÁ5ÁðÀÌË.Å �2 FE/�ß6á.ô;/ + â¬<Eè6á G å2Þ5/ G 9S7Äß6FE/$RI/5WSàÂÞP1�R�1 + 1©RI7SïP/Pè A àæRæRiè6/P<Eè6/TâZ/ + ß�ß6FE/�ô./P7 A á.è G â f `:ga3 �a`�3Eo©k�1 + G ` f {L`E3TßCFE/ �9Sà + G /PèT3.ßCFE/ G á.ßT3:<21\è6/ + ßCFE/Tâ½/TâP3©à + ßC/ D /Pè=âP34à G / + ß½àæ]2/Pè=â43�1\è½àIß6FE-0/Pß½à¼Þ$á.<2/Pè51:ß½àIá + â®1 + G ß6/Pè6-Qà + 1:ß½à +ED â½/P-Qà¼Þ5á:RIá + âP>¹ /Vè6/På2âZ/ÄFE/Pè6/V-0áSâ½ßãá ? ßCFE/�Þ5á G /Vß6F21:ß A / G /PH./5RIá.<N/ G à + Þ6F21:<EßC/Pè � �Qá.è�à + ßCFE/Ä1 + â A /Pè=â$ß6áQàIß=â�/5WE/Pè=ÞCà¼â½/TâP>

ò ô;àI<E<Sà +ED 9SRÂ1 + ô â½<21.Þ5/TâPdeSf `:g y `Sn#{©�ibSnL`S{lj�k;mLJan�gao:p:Je v ö � � �2u � ��g �2u � �TJ � � {©�ibSnL`S{4A w s }|©�e�u�v ö w s |©���L�¥P�±�EªL�\¥��Òªð¢��:��¥��:�i�;���&� � �©���S��µ ·©¸E�©� �2 FE/Vß½7S<2/Äá ? ß6á.ô./ + âÖàÂâ D àIH./ + 9L7ade gL�;�i`�gEp �N`©J�j � � � u � � u � � ���� u ����� u ��� � u � � �e u � ~ u�� � � u � � � � u ~ � u � � ��� �e u ��� � p;k o4JEg u ��� � � � p.k {�g y o4JEñB�S��<�����h�L�"!��ð�§²��©¸N�P�±�.²�¯*,+ ß6/ D /Pè5âPdeSf `:g�oPJEg+A.p;k+A.c2o©ñaoTg#jhk.mSJan�gao�p\Je � M � � � � � bS{#n#s §|To4JEg+A.p.kIASnT^ab y n��´s}|To4JEg+A.p.kIASnT^ab y � M � �e�u A�s y bEo.{S`§|=~�b�o f m y ` �5J2p.gtb¶cNo©ñio©g��;���L��4��� K��:¸BK�²S�P�¬�S�}�Òªð¢��:��� � �P�¬��µ ·T¸��©� �eSf `:g y `Sn o4J�gN`�ñN` y J j�k;mSJin:gio:p\Je v ö � � M � � � � � bS{�n±��|To4J�gN`:ñ2` y | D©M��©J1C�o4J�gIA\p;kIA\cNoTñao©g#nE�L� y w s ye�u�v ö w s ��� � JÖ�S��4���E�5�±�©� �­�P�¬�#� � ªð¢¬����¥E���a�.���}� � �L�"!��ð�§µ ·©¸E�©� �¹ /Qè6/Tâ½ßCè½à¼Þ5ß U ò �¤à G / + ß½àæ]2/Pè=âVß6á92/0Þ5á.-Y<2áLâ½/ G á ? RIá A /Pè=ÞP1;â½/VRI/Pß6ß6/Pè5âP3aß6FE/Q/5à D FLß_]2è5â½ß°9N/5à +ED âxà D.+ àæ]iÞP1:ß½àIH./.>U + /5W�<SR¼1 + 1:ßZàºá + 1:9Ná.åEßãß6FE/0o:cE`©JEg ? å + Þ5ßZàºá + ÞP1 + 92/ ? á.å + G à + ß6FE/ÄÞ6F21\<Eß6/Pè G / G àÂÞP1\ß6/ G ß6áQß6FE/Ä1 + â A /Pè=â�ß6á/5WE/Pè=ÞCà¼â½/Tâ ìíÞCF21:<Eß6/Pè � �.î=> 2 FE/ ? å + Þ5ßZàºá +OD àºH;/ + FE/Pè6/ à¼âVâxRæà D FLßZRº7 G à ��/PèC/ + ßV1 + G ßC/Tâ½ß=â»àºß5âãè6/TâZåSRºß_à + á.è G /Pè_ß6áâ½/P/ A /Pß6FE/Pè�àIß à¼â°1 ô./P7 A á.è G ì f `�ga3 �i`E3� * � 6îBá;è + á;ßTdeSf `:g�o�c�`TJEgIA �Sm�k#j���b��2` AL{:g y o4J�ñ�� � � �S��S²��ð��� KE£.�.¸ �K¥E�:�2�4�L�§µ � �

eSf `:g y `Sn o:cE`©J�g f `TJ j�k;mSJin:gio:p\J

Page 89: Functional programming using Caml Light Michel Mauny January 1995

��� �������� �� �� �B� �� ��* �E�� #� ��� �.��� � $ �%�&�

e v ö � � b � � � "�� bS{�n±�e |©oTk f `©J� \j �hg;^i`©J}o:cE`©JEg f `©Je ` f {S` �a`:ñio4Je {S`�gIATJEg;^�ASnT^ab y o:cE`©J�gIA �LmEk f `©J§n®�e o:cE`©J�g)|4{TmanSn f `©J¬�e `©J2c2��{ w s #{e�u�v ö w s |x��b�gNnT^�{©m � AS{�g y o4JEñ o:c�`TJEg+A �Sm�k#M f `©Je oTg;^ � f `:g��«s � � �e u � �i`2�«s � �e u �;oTk¬�«s � ~e u �4g.^a`TJ±�«s � � �e u �\` f {L`2�«s � � � �e u �4kioE�«s l~ �e u {�s ��� � � � {����S��S²��ð���)�Æ�4�¬�´� � ªð¢��:��¥��:�a�.���}� � �S�"!��ð�§µ ·T¸��©� �U è6/T1.â½á + 1\9SRº/ÜRI/5WLà¼ÞP1©RB1 + 1©RI7SïP/Pè A á.åSR G å2â½/Q1QF21.â½FKß=1\9SRº/ ß6áQè6/TÞ5á D.+ àIïP/ ô./P7 A á.è G â ? 1;â½ß6/PèT>

� è½àI-QàIß½àIH./Bá;<2/Pè=1:ßZàºá + â¬1:è6/�è6/TÞ5á D.+ àIïP/ G 9S7_ß6FE/ ? á:RæRIá A à +ED ? å + Þ5ß½àIá + 3 A FSàÂÞCF01©R¼â½á G /Pß6/TÞ5ß5âNàæRóRI/ D 1�R2á.<2/Pè=1\ß6á.è=â1 + G / + G â á ? à + <EåEß©deSf `:g#p:�a` y jlk;mSJin:gio:p\Je v ö � � C �2u � s �2u � � ��u � ���2u � j � bL{#n w s ��� � ��� |,��b��2` AL{:g y o4J�ñ1D¶n��e�u�v ö �5n w s �� y ` ySy AS{�g y oPJEñ � �\fSf `�ñNb f n©^ib y bLn:g2` y r ���e � y ` ySy AS`TJ2c f o4Ji`�|Pn©^ab y A�kEp y A y `Sb.c�nE�¬�e y b�o;{S` |5~�b�o f m y `�� � �h�ab y {�o4JEñ��;�e�u�v ö w s X� y ` ySy AS`©J�c f o4Ja`´� �LJa` q �a`Ln:g2`.c�`TJ2c�p.k&oPJS�LmEg¬�a�e y bEo.{S`}|5~EbEo f m y `#� � �´�ib y {Eo4J�ñ¬�.���S��5�¨�©� �Òª5¢¬�:�#¥E�:�i�;���}� � �S� !¬�5�§µ ·©¸��T� �2 FE/RI/5WSàÂÞP1�RÜ1 + 1�Rº7SïP/Pè0F21.â ß6FE/ âC1:-0/ â½ß6èCå2Þ5ß6åEè6/K1.â ß6FE/Ká + / D àIH./ + à + ÞCF21:<Eß6/Pè�� �¡/5W2Þ5/P<Eß8ßCF21:ß Rº/T1 G à +ED9SR¼1 + ôEâ°1:èC/Äâ½ô.àI<E<N/ G >eSf `:g y `Sn f ` q ` y {:g y jt{©�abLnS`L{�{:g y �e �¬b:g2n©^�{�g y o©g;^e v ö � � | � �O{©�abLnS`L{4A w s v ö � � � �$� f ` q ` y {:g y we�u�v ö � � � � �O{©�abLnS`L{4A w s v ö � � � �$� f ` q ` y {:g y we�u�v ö � � ��� � �Æ{©�ibSnL`S{4A w s v ö � � � � �� � f ` q ` y {:g y we�u�v ö � � � �O{©�abLnS`L{4A w s v ö � � ��� � f ` q ` y {:g y we�u�v ö � � � � �O{©�abLnS`L{4A w s v ö � � � ���!� � f ` q ` y {�g y we�u�v ö � � M � � � � � bL{�n®�e |©oPJEgN`�ñN` y |©oPJEgIA\p;k+A.cNoTñaoTg�n��S�¤g�p��$�e {T�abSnL`S{4A w s v ö �½g�p��B� f ` q ` y {:g y we�u�v ö � � b � � ��"�� bL{�n®�e |4{L`:gIATJEg.^ ASnT^ab y o�c�`©J�gIA �SmEk´M n±�Òo:cE`©J�g:D;��gEp �$�e {©�ibSnS`L{4A w s v ö �½g�p��B� f ` q ` y {:g y we�u�v ölp\�i` y g�p��$�Ò{T�abSnL`S{4A w s v ö �½gEp �$� f ` q ` y {:g y we �L�

Page 90: Functional programming using Caml Light Michel Mauny January 1995

� � � � � ���� ����������� � � ���& "�� � �#"�2� � �T� �Òªð¢¬����¥E���a�.���}� � �L�"!��ð��¥��:�a�.���§µ ·T¸��©� �2 FE/_RI/5WSàÂÞP1�RÖ1 + 1©RI7LïP/Pè è6/Pß6åEè + âã1Yâ½ß6è6/T1:- á ? ß6á.ô;/ + â�ß6F21:ßãßCFE/V<21:è=â½/Pè A àóRæR�è6/TÞ5/5àIH./�1;âÖ1\è D åE-0/ + ßT> �.���.��� � � $ "����2 FE/Ü] + 1©R¨á;åEß6<EåEß°á ? á.åEè°<21\è=â½/Pè A àæRóRB9N/�1:92âZß6è=1.Þ5ßVâ½7 + ß=1�Wéß6èC/P/Tâãá ? ß½7S<2/YbL{ f á.èãgEp:� ASbL{ f > 2 FSàÂâ àI-0<SRæàI/Tâß6F21:ß A / A àæRæR G /Pß6/TÞ5ßKå + 92á.å + G à G / + ß½àæ]2/Pè=â¡1:ß8<21\è=â½/Pç@ß½àI-0/.> *,+ ß6FSà¼âKÞP1.âZ/.3 A / A àæRæR�è51©à¼â½/ ß6FE/��SJ �2p\mLJ2c/5W2Þ5/P<Eß½àIá + G /5] + / G 1.âPde ` q nL`©�Egio:p:J �LJ �2p:mSJ�c�p;k�{:g y oPJEñ$�L�/ � ªS�6�®�S�L�4�:>P�¬£L�;�©��²�²E�T¸N�P�±�;²¨¯¹ /Ä1©R¼â½á + /P/ G 1 ? å + Þ5ß½àIá + A FSà¼ÞCF A àæRæR¨Þ5á.-0<EåEß6/VßCFE/°9Sà + G à +ED G /P<Eß6F2â�á ? H�1:è½à¼1:9SRI/TâP> 2 F21:ß ? å + Þ5ßZàºá + âxàI-0<SRI7RIáLá;ô�â ? á.è_ß6FE/0<NáLâxàIß½àIá + á ? ß6FE/Q]2è5â½ßVá�ÞPÞ5åEèCè6/ + Þ5/0á ? 1H�1:è½à¼1:9SRI/ + 1:-0/ à + 1YRæà¼â½ßT> * ß A àæRæRÖè=1©à¼â½/ �LJ ��p\mSJ�cYà ?ß6FE/Pè6/_à¼â + á8â½å2ÞCF áEÞPÞ5åEè6è6/ + Þ5/.>eSf `:g ��o4J�cNo4J�ñIA\c�`©��g;^ { y ^2p#je#f `�g y `Ln���o4J�c«J jhk;mLJan:gio:p:Je vxw s y b�o;{L`§| �LJ �2p:mSJ�c�{E�e u g rSríf s #o©k�{¶jhg#g;^i`©J � b y J�` f {S` ��o4J2c}|ZJ+C�D;� fe oPJ �¬oPJ2cED y ^�pe �L�£S�P�¬²L�4�S��KE²��C�®�P¢ �¡¥��:�N�P�S�}� � ¥E���N�P�S�����;¥E� � � �;¥L�tµ ·T¸��©� �¹ / 1©R¼â½á + /P/ G 1 D RIá.921©R°/ + H.àIè6á + -0/ + ß©3ÖÞ5á + ß=1©à + à +ED¤+ 1:-0/TâQá ? 1©RIè6/T1 G 7�9Ná.å + G à G / + ß½àæ]2/Pè=âP> 2 FE/ D Rºá;921©R/ + H.àIè6á + -Y/ + ß0Þ5á + ß=1©à + â <Eè6/ G /5] + / G + 1\-0/Tâ ? á.è ß6FE// L.å21©RæàIß½7z1 + G 1:èZàºßCFE-0/Pß½à¼Þ ? å + Þ5ßZàºá + âP> ¹ /è6/P<Eè6/Tâ½/ + ßß6FE/ D Rºá;921©Ri/ + H.àIè6á + -0/ + ßã1.â$1Vè6/ ? /Pè6/ + Þ5/Vâxà + Þ5/°/T1;Þ6F UÄò � G /TÞCR¼1:è=1\ß½àIá +8A àóRæR±1:å D -Y/ + ß àºß A àIß6FK1 + / Al+ 1\-0/.>eSf `:g�oPJ¬oTgIAS`TJ �#j v � Ci���4�\s2�a�T� �2���4� � ���T�Tja� w �S��4���S��K2�ð���)� ¥��:�N�P�S�§�E�.¥E��µ � ����� ���T� ����� ��� ����� ��� �Pµ ���eSf `:g�ñ f p'�ab f AS`TJ �#j y `�k�o4J�o©g+AS`©J �$�L��a���S£L�;� K��ð�����¡¥E���N�P�S�����;¥E�l�i�©¸tµl�a�T¸ � ����� ���T� ��� � � ������� ��� �Pµ���¹ / + á A�D àIH./Æ1Ò<21:è5âxà +EDÒ? å + Þ5ß½àIá +h? á;è U ò �#<EèCá D è=1:-âP> � RÂ1 + ô�âK1:ßYß6FE/ 9N/ D à +E+ à +ED á ? ß6FE/Æâ½ß6è½à +ED 1:è6/â½ô;àI<E<2/ G >eSf `:g y `SnlgEp:� j�k;mLJan:gio:p:Je v ö � ��� � � � ��� � � � o:c � � � �$�O` q � y `L{S{Eo�p\J `®� � � � ���!� w s � `Ln f |©o:c �5`��e uhv ö#` q � y `L{S{Eo�p\J `®� � � � ���!� w s � `Ln f |:�;oTg¬���5`E�ee bTJ2c�` q � y `S{L{Eo�p\J j�k;mLJan�gao:p:Je v ö}|4` q � y �,ñ f p �ab f AL`©J �i�«` w s �`ee bTJ2c�` q � y�y ^2p�je f `:g y `Sn y `S{:g�`BD¤j�k;mSJin:gio:p\Je v ö�|Pb:g�p©� y ^2pN��` � �l| y `S{�g)| �S� |4`+D��5` �N�S�L�«` w s �`e uhv ö w s �`BD

Page 91: Functional programming using Caml Light Michel Mauny January 1995

"�� �������� �� �� �B� �� ��* �E�� #� ��� �.��� � $ �%�&�

e oPJ#k;mLJan:gio:p:Je v ö ��� � � �� � � ��� � � � o�c � � � ��� �l|4` q � y |©o:c rSr y ^2p2�S�h` w s �i{¬|To:c �=`E�e u�v ö§|Pb:gEpT� y ^2p2�h`+Da�l| y `S{�g `BD;�h` � w s �` �ee bTJ2c�b�gEpT� y ^2p�j�k.mSJan�gao�p\Je v ö � ��� � ��� o:c w s e |Cg y � ��o4J�cNo4J�ñIA\c�`©��g;^ o:c y ^�p oTg;^ �SJ �2p:mSJ2c�{#s e � y o4JEg+AS{�g y oPJEñ � �LJ �2p:mSJ�c � ��o:cE`©JEgio©kio;` y r ���e � y o4JEg+AS{�g y oPJEñ#{®�K� y o4J�gIA©Ji` f o4Ji`¬|T���e y b�o;{S` |5~�b�o f m y `�� � �h�ab y {�o4JEñ��;�L�e uhv ö � ����� J w s � p\Ji{:ghJe uhv ö � � ~��l|4` q � y�y ^�pN��`+Da� � � �� � �l|4` q � y�y ^�pN��` ���e ��� � � �B�l|4` q � y¶y ^2p2�h` �� �6~ � w s � p:J2c±|4`+D��5` � �5` N�e uhv ö � ��� �B�l|4` q � y¶y ^2p2�h`®� � ��� � w s �`®�L��S�=� �Æ�S� !¬�ð� ¥E�:�i�;���}� � �S�=�(K��;¥S�´µt·T¸��T� �� � �a�i�\¥S¥��S�P� �Æ�S� !¬�5��¥E���a�;���}� � �.¥S�#µ ·©¸E�©� �� � �a� �¡¥��:�N�P�S�����;¥��#� � �S� !¬�5��¥E���a�;���}� � �.¥S�#µ ·©¸E�©� ��S�L��� �¡¥��:�N�P�S�����;¥��#� � �S� !¬�5��¥E���a�;���}� � �.¥S�#µ ·©¸E�©� �2 FE/8Þ5á;-0<SRI/Pß6/0<21:è=âZ/PèVß6F21:ß A / A àæRóR�å2â½/0è6/T1 G âÄ1Kâ½ß6èZà +ED 3±Þ5á + H./Pè6ß=â»àIßVà + ß6áO1Kâ½ßCè6/T1:- 3¬1 + G <Eè6á G å2Þ5/TâÜß6FE/ß6á.ô;/ + â½ß6è6/T1:-�ß6F21\ß�à¼â�<21:è=â½/ G deSf `:gh�ib y {S` A�gEp:��{¶jhgEp:�B| f ` q ` y |P{:g y `Sbð�(A\p;kIAL{:g y o4J�ñ�{E�L���S��®����¥�� KE�L�5� �K¥E�:�2�4�L�}� � �S�=�(K��;¥S�´µt·T¸��T� ��a/Pß_å2â�ß6è67á.åEè D è=1:-0-81\è°ì A / G á + á.ß°1:å D -Y/ + ß�ß6FE/ D RIá.921©R±/ + H.àIè6á + -0/ + ß_1:ßã/T1.ÞCF G /TÞCR¼1:è=1\ß½àIá + dBßCFSàÂâ A àæRóR92/Y<2/Pè ? á.è6-0/ G 1 ? ßC/PèVß6FE/0â½/P-81 + ß½à¼ÞQß6è6/T1\ß6-0/ + ßVá ? U ò ��<Eè6á D è=1:-8âðî=> ¹ / + /P/ G ß6á A è½àIß6/ G á;åE9SRº/ �0à + âxà G /â½ß6èZà +ED âP32âxà + Þ5/ � à¼âãßCFE/Äâ½ß6è½à +ED /Tâ6ÞP1\<2/�ÞCF21:è=1;Þ5ß6/PèT>e �ib y {S` A�gEp:�§� f `:g#k �a`���� q q �T���L��)�¡�S�=�(K��;¥S�´µ����Sª:� G �Z¸ � � �2£;¥ G � � � ���;��� � H He �ib y {S` A�gEp:�§� f `:g q �a` CJD�|L|���� q q � �N���4���L��)�¡�S�=�(K��;¥S�´µ���Sª:� G � � � � �©�S� G��©�S� G��;��� �����L�4�a¥�� � H � �©�S� G �N£.¥ G � � � ���.�:� � H ���S�P�a¥�� � H�H H� + 9Ná.å + G à G / + ß½àæ]2/Pè=âV1 + G å + G /5] + / G á.<2/Pè51:ß6á.è=â 1:è6/ÄÞ5á.è6èC/TÞ5ß½RI7 G /Pß6/TÞ5ßC/ G de �ib y {S` A�gEp:�§� f `:g#� �a`zñ ��T�a�S�>4��£S�.�©�¬² � !S� �S²E�5�¬�L�:¸N���©�Ö�Ø�>4��ª;�.�©�S¢��#� � ªS�6�®�S�L�4� �?02�S�;�L�.�i��� � !S�¤�±�:��¥��4�L� �e �ib y {S` A�gEp:�§�Pk�|To©k Mhg.^a`©J C�` f {L`�szkaoS� � �4���L�>4��£S�.�©�¬² � !S� �S²E�5�¬�L�:¸N���©�Ö�¸>4��ª;�.�©�S¢��#� � ªS�6�®�S�L�4� �?02�S�;�L�.�i��� � !S�¤�±�:��¥��4�L� �e �ib y {S` A�gEp:�§� �«q �B�T���L��S�L�2�5�¬�;��ªð¢¬���N��ª;�E�T��� �>4��ª;�.�©�S¢��#� � ªS�6�®�S�L�4� �?02�S�;�L�.�i��� � !S�¤�±�:��¥��4�L� �

Page 92: Functional programming using Caml Light Michel Mauny January 1995

� ��������� ���

� � !�� � ' � � ' � ��� !#���)� � � � � � � ��� ������� �

*,+ ßCFSàÂâ â½/TÞ5ß½àIá + 3 A / D àIH./Ä1Qâ½/P-81 + ß½à¼Þ_ß6è6/T1:ßC-0/ + ß$á ? UÄò �Æ<EèCá D è=1:-âP> ¹ / A àóRæR±å2âZ/ B#�:Å2¿.ëQÀÌÈ�Ê��CÉEÃ=È<4LÃ=È &�ÀÌÅ�=;3à,> /.> A / A àæRæR¨ßC/Tâ½ßãß6FE/Vß½7S<2/ÄÞ5á.è6èC/TÞ5ß + /Tâ6â�á ? <Eè6á D è=1:-8â G åEè½à +ED ß6FE/5àIèãà + ß6/Pè6<Eè6/Pß=1\ß½àIá + >

Ï �ÜÎ5Ï � Ô 9_Û°×®Ù=Ó �"9N���Ô�ݹ / + /P/ G 1Qß½7L<N/ ? á.è UÄò �¤â½/P-81 + ß½à¼Þ_H�1�RºåE/Tâ ìxè6/P<Eè6/Tâ½/ + ß½à +ED è6/Tâ½åSRIß=â á ? Þ5á.-0<EåEß=1\ß½àIá + â5î=> U â½/P-81 + ß½à¼ÞVH:1©RIåE/A àæRæR¨9N/Ä/5àIß6FE/PèV1 + à + ßC/ D /PèT3Eá.èã1ä�1:-QR ? å + Þ5ß½àIá + 1©R±H:1©RIåE/ ? è6á.- U ò � H�1©RIåE/Tâ ß6á U ò �ÒH:1©RIåE/TâP>e gL�;�i`�{S`ð� �Nb f j � p:Ja{:g��Nb f p;k�oPJEge u ~\mLJ �Nb f p;k�|P{S`P� �Nb f s �{L`P� �Nb f ���L��<�����«¥�� ���S�;�´²E�©¸2�4���;²�¯¹ / + á A G /5] + /Äß A áQ/5W�Þ5/P<Eß½àIá + â4> 2 FE/_]2è=â½ß á + / A àæRæR±92/ å2â½/ G A FE/ + A /_/ + Þ5á.å + ß6/Pè°1 + àæRæRIç@ßí7S<2/ G <Eè6á D è=1:-1 + G A àæRæRÖè6/P<EèC/Tâ½/ + ßVèCå + ç@ß½àI-0/0ß½7L<N/0/Pè6è6á;è=âP> 2 FE/Qá.ßCFE/PèVá + / àÂâÜFE/5RI< ? åSR ? á.è G /P9Eå D;D à +ED d àºß A àæRæRÖ92/Qè=1�àÂâZ/ GA FE/ + á.åEè�à + ßC/Pè6<Eè6/Pß6/PèVì½â½/P-81 + ß½à¼Þ ? å + Þ5ßZàºá + î D áS/Tâ$à + ß6á81 + àæRæRI/ D 1©RBâxàIß6å21:ß½àIá + >2 FE/ ? á:RæRºá A à +ED ß A á0/5W2Þ5/P<Eß½àIá + â A àæRæRB92/Äè51©à¼â½/ G à + ÞP1.âZ/Äá ? è6å + ç@ßZàº-Y/ U ò � ßí7S<2/Q/Pè6èCá.èT321 + G à + ÞP1;â½/Äá ?

9Eå D á ? á.åEè°âZ/P-81 + ß½à¼Þ_ß6è6/T1:ß6-Y/ + ßTde ` q nL`©�Egio:p:J �\fSf gL�;�i`.c �L�/ � ªS�6�®�S�L�4� �L�S�����:�¨�;²l²E�T¸N�4���;²¨¯e ` q nL`©�Egio:p:J �E`P��bTJEg � mEñ´p;k�{:g y o4J�ñ$�L�/ � ªS�6�®�S�L�4� !i� ���4�¬��N�T��²��©¸N�P�±�.²�¯¹ /0-Qå2â½ß D àºH;/81 â½/P-1 + ßZàÂÞØH�1©RIåE/ß6áKá.åEèV921.âxà¼Þ ? å + Þ5ßZàºá + âQì,/ L;å21©RæàIßí7¤1 + G 1:è½àIß6FE-Y/Pß½à¼ÞQá.<2/Pè51:ß½àIá + â5î=> 2 FE/+ /5WEß ? å + Þ5ßZàºá + ß6è=1 + â ? á;è6-8â�1äÖ1:-ØR ? å + Þ5ß½àIá + à + ß6á81 + UÄò � H�1©RIåE/.>eSf `:g�oPJ¬oTgIAS{L`P�¬b©JEgio;nL{hnLbP� f A:k.mSJ je ~:mSJ �Nb fe |6k;mSJin:gio:p\J � p\Ji{:g��Nb f J§s e ~:mSJ �Nb f |Ck.mSJan�gao�p\J � p:Ja{�g��Nb f ��s � p:Ja{�g��Nb f |PnSbP� f A�k;mSJ�J¶�±�e u A#s y bEo.{S` �\fSf gL�;�i`.cN�e u A�s y b�o;{L` �.fLf gS�.�a`\cN���L��4���S��KS¥2� �¬�P�¬�S��ª\¥ �4G5�4���#� � �P�¬�#� � �P�¬� H � � ¥2� �¬�L�;�#µ#·T¸��T� �

"��

Page 93: Functional programming using Caml Light Michel Mauny January 1995

"#� ���������� � ����$ � �� � � �J���� #��� (�)� � ������ � � ����" "�� �

õ á A 3E1.â6â½áEÞCà¼1:ß6/Ä1ä�1:-QR�Nà D FSß ? å + Þ5ß½àIá + ßCá�/T1;Þ6F U ò �Ò<EèC/ G /5] + / G ? å + Þ5ß½àIá + deSf `:gtnLbP� f A:k.mSJin:gao�p\J´j�k;mSJin:gio:p\Je � Ca�hs X� y `�kao q Ce u �:s2�hs X� y `�kao q se u � �2�hs X� y `�kao q �

e u � � �hs X� y `�kao q �e u �Tja�hs |Ck;mLJ#Jl��s o©khJ�j©��g;^i`©J Dh` f {S`«MN�e u {#s y bEo.{S`§|,��`P�¬b©J�g � m�ñ�� �SJ �;J2p J�� y o=�®o©gio �2`2�;�¬�S�ª;���a��K.¸��T�±ª.�S�S�P� �¡¥��:�N�P�S�}� � �4��� � � �P�¬� � � �4����µ ·©¸E�©� �*,+ ß6FE/Äâ61:-Y/ A 1©7K1.âP3 ? á.èã<21:è=âíà +ED 3 A / + /P/ G / G 1 D RIá.921©R±/ + H.àIè6á + -0/ + ß ? è6á;- A FSà¼Þ6F¡ß6FE/V9Sà + G à +ED G /P<Eß6F á ?à G / + ßZàó]2/Pè5â A 1.â$Þ5á.-0<EåEß6/ G 3 A / + /P/ G 1ÄâZ/P-81 + ß½à¼Þ�/ + H;àIè6á + -0/ + ß ? è6á.- A FSà¼Þ6FYß6FE/�à + ßC/Pè6<Eè6/Pß6/Pè A àæRóR ? /Pß=ÞCF0ß6FE/H�1�RºåE/ è6/P<Eè6/Tâ½/ + ß6/ G 9S70à G / + ß½àæ]2/Pè=âP> 2 FE/ D RIá.921©R�â½/P-81 + ß½à¼Þã/ + H;àºèCá + -0/ + ß A àæRæR±9N/Ä1Qè6/ ? /Pè6/ + Þ5/Vá + ß6FE/_Ræà¼â½ßãá ?<Eè6/ G /5] + / G¡U ò �ÒH:1©RIåE/TâP>eSf `:g�oPJ¬oTgIAS{L`P��j ��b©� |Ck;mLJ q s o4J�o©g+AS{S`ð��bTJEgao.nS{�|4nSbð� f A:k;mLJanTgao�p\J q �S�e o4J¬oTgIAL`©J �B�S��4���S��KS¥2� � � ¥�� �¬�L�;�#�E�.¥E��µ� 0��T�¬�S�.� ·©¸E�©� � �#0E�©�¬�L�;� ·T¸��T� � � 0��©���S�.� ·©¸E�©� � �#0��T�¬�L�;� ·T¸��©� � �#0E�©���S�;��·©¸��T� � �eSf `:g�ñ f p'�ab f AS{L`P��j y `�k�o4J�o©g+AS{S`ð� �L��a���S£L�;� KL¥2� � �¡¥2� �¬�L�;�����;¥E�l�i�©¸tµ�i�©¸ � 0��T�¬�S�.� ·©¸E�©� � �#0E�©�¬�L�;� ·T¸��T� � � 0��©���S�.� ·©¸E�©� � �#0��T�¬�L�;� ·T¸��©� � � 0��T�¬�L�;� ·T¸��©� � �

Ï �ÜÎ 7 � Ô 9_Û°×®Ù=Ó�� �0ÛQÓ�×®Ù=ÚVÛQÝ2 FE/ãâ½/P-81 + ß½à¼Þ ? å + Þ5ß½àIá + à¼â�ß6FE/$à + ß6/Pè6<Eè6/Pß6/Pè®àIß=âZ/5R ? > 2 FE/Pè6/�à¼â®á + / ? á.è®/5W�<Eè6/TâCâxàIá + âB1 + G á + / ? á.è G /TÞCR¼1:è=1:ßZàºá + âP>2 FE/ á + / ? á.è /5W�<Eè6/TâCâxàIá + âVÞ5á.-0<EåEß6/Tâ_ßCFE/ÄH�1�RºåE/Qá ? 1 + U ò �¤/5W�<Eè6/TâCâxàIá +¡? è6á;- 1 + / + H;àIè6á + -0/ + ß y ^2p2> 2 FE// + H.àIè6á + -Y/ + ß A àæRæR°Þ5á + ß51©à + ß6FE/YH�1©RIåE/TâQá ?ãD RIá.921�RóRI7 G /5] + / GÒU ò ��H:1©RIåE/TâÄá;èÄá ? ß6/P-0<Ná.è=1:èC7 U ò �hH�1©RIåE/TâP>* ß à¼âãá;è D 1 + àIïP/ G 1;âã1 Ræà¼â½ßT3a1 + G ß6FE/ + åE-Q92/Pè=â è6/P<Eè6/TâZ/ + ß½à +ED H�1:èZàÂ1\9SRº/QáEÞPÞ5åEè6è6/ + Þ5/Tâ A àæRæRB92/Äå2âZ/ G 1.â$à + G à¼Þ5/Tâà + ßCá0ß6FE/V/ + H.àIè6á + -Y/ + ßT>eSf `:g y `Sn�JEg.^�J j�k;mSJin:gio:p\Je vxw s y b�o;{L`§|5~EbEo f m y ` �ðJ�g;^±�.�e uYqÖrSríf s #o©k�J�j D g.^a`©J q ` f {L`«J�g;^�|½JasBD;� f �S��¬�P¢ �Æ�4���t� � ³C�����;¥E�´� � ³C��µ ·T¸��©� �eSf `:g y `Sn#{S`ð��bTJEg y ^2p�je f `:g y `Sn�{L`P�§j�k;mSJin:gio:p\Je � p\Ja{�ghJ§s � p:Ja{�g��Nb f Je u�� b y |½J¬�hs �JEg;^¶J y ^2pe u�� p\J2c±|4`BD��5` � �=` N��s e |x�¬b:g2n©^�{L`P�&`BD o©g.^ � p:Ja{:g��Nb f Mts �{L`P��` e u�� p:Ja{:g��Nb f J§s �{L`P��` �e u A#s y bEo;{L` �.fSf gS�.�a`.c2�e u �a{¬| A �=`;�P�ls l~:mSJ �2b f |Ck;mLJ q s �{L`P�¬b©JEg | q�rLr y ^2pN�l`;�P�

Page 94: Functional programming using Caml Light Michel Mauny January 1995

� ��� ������,��� #���(��� "��e u �S�B|P`+D��5` �2�hs |x��b�gNnT^�{S`ð� `BDe o©g.^ ~\mLJ �Nb f |6ka�hs �k�|4{S`ð�&` �2�e u A#s y bEo;{L` �.fSf gS�.�a`.c2�e oPJ�{S`ð�e �L�¥2� �¬�P�¬�)�¡¥2� �¬�L�;�����;¥E�´� � �;¥L� � � ¥2� �¬�L�;�#µ ·©¸E�©� �2 FE/0-1©à +Æ? å + Þ5ßZàºá + -Qå2â½ßV92/K1:9SRI/0ß6áKß6èC/T1:ßÄ1 + UÄò � G /TÞCR¼1:è=1:ß½àIá + 3®/PH:1©RIå21:ß6/Yàºß©3±1 + G åE< G 1\ß6/8ßCFE/ D Rºá;921©R/ + H.àIè6á + -Y/ + ß=â ì,ñ f p �ib f AS`©J �81 + G ñ f p'�ab f AS{L`P��î=>eSf `:gt{L`P�¬b©JEgio;nL{lj�k;mSJin:gio:p\J � `Ln f |4{ �=`E�hs e f `:g y `L{©m f g#jt{S`ð��bTJEg �,ñ f p'�ab f AS{L`P��`e oPJ ñ f p'�ab f AS`TJ � r jt{ rLr �,ñ f p'�ab f AS`TJ �B�e ñ f p'�ab f AS{L`P� r j y `L{©m f g rLr �,ñ f p'�ab f AS{L`P�ã�e � y oPJEg+AS{:g y oPJEñ � � � � b f mi`�p.k§���e � y oPJEg+AS{:g y oPJEñ#{®�e � y oPJEg+AS{:g y oPJEñ �´o.{ ���e |x��b�gNnT^ y `L{©m f g oTg;^e � p\Ji{:g��2b f J§s �� y o4JEg+AEoPJEg�Je u ~:mSJ �Nb f kts �� y o4J�gIAS{�g y o4JEñ �\ö�k;mLJ� 2�.���e � y oPJEg+A©Ja` f o4Ja`�|©�¬�S�¥2� �¬�P�¬�S��ª\¥�� �S�5�.KE�.¥S� � � �T�¬�L��µ ·©¸��T� �

Ï �ÜÎ�� ÐÒÑ 9N Õ�=Ô�Ýe {L`P�¬b©JEgio;nL{�|½�ab y {S`�A:gEp:�}� f `:g�k �i`�� � q C q D��4�;���L�� !L� �;�.�S���´��¸�¸��;¥ ·©¸E�©� ��)� �©���S�#µ G He {L`P�¬b©JEgio;nL{�|½�ab y {S`�A:gEp:�}� f `:g�o �i`�� � q q �4�;���L�� !L� �;�.�S���´��¸t�#�;¥ ·©¸E�©� ��)� �©���S�#µ G He {L`P�¬b©JEgio;nL{�|½�ab y {S`�A:gEp:�}� f `:g q �i`to |Ck �N�¬�T�;�¬�S�� !L� �;�.�S���´��¸ � �;¥���)� �©���S�#µ G He {L`P�¬b©JEgio;nL{�|½�ab y {S`�A:gEp:�}� f `:g�� �i`toTk q g;^i`©J�| ��� q q �h` f {S` ��kaolM��T�;�¬�S�� !L� �;�.�S���´��¸ �§�;¥ ��)� �©���S�#µ G H

Page 95: Functional programming using Caml Light Michel Mauny January 1995

"�� ���������� � ���E$ � �� � � �J���� #��� (�)� � ������ � � ����" "�� �

Page 96: Functional programming using Caml Light Michel Mauny January 1995

� ��������� ���

� ��� � ��� � � ' � �t�¶�$���

Ï6��Î5Ï � Ù6Ñ�ÕKÚÜÙPÛ°×�ÓBÚ �ÙPÛ�9»×�Ú��¬Ý¹ /_F21©H./ âZ/P/ + ß6F21:ß A / G á + á.ß�F21©H./_è6/TÞ5åEè=âxàIá + à + U ò ��> @ á A /PH./PèT3;àIß$àÂâ»<2áLâ6âíàº9SRI/ ß6áQ/ + Þ5á G /Vè6/TÞ5åEè5âxàIá + 9L7G /5] + à +ED 1N2BÇCÉ�Ë.ÀÌÅ2Ê�È5Ë.ë �PÀÌÅ2¿;Ê@Ë.¾=> U ]EWE<2á:à + ß Þ5á;-�9Sà + 1:ßCá.è�à¼â°1 ? å + Þ5ß½àIá +�� â½å2ÞCF ß6F21:ß©d

��� àÂâ»/ L.åSàIH�1�Rº/ + ßVß6á � ì ��� îB-0á G åSRIá8ß6FE/V/PH:1©RIå21:ß½àIá + è6åSRI/TâP>? á.è 1 + 7K/5WE<Eè6/Tâ6âxàIá +�� > U Þ5á + âZ/ L.åE/ + Þ5/0á ? ß6FE/Q/ L;åSàIH�1©RI/ + Þ5/ D àIH./ + 1:9Ná:H./Và¼â_ß6F21:ß»]EW�<Ná:à + ßÄÞ5á.-Q9Sà + 1:ß6á;è=âÞP1 + / + Þ5á G / è6/TÞ5åEè5âxàIá + > �a/Pß0å2â + á.ß6/ � �� à ? /5WE<Eè6/Tâ6âxàIá + â � 1 + G � 1:è6// L.åSàIH�1�Rº/ + ßK-0á G åSRIáÒß6FE//PH�1�Rºå21\ß½àIá + èCåSRº/Tâ4> 2 FE/ + 3EÞ5á + âxà G /Pè�kLkNbSn�gQß6á 92/ãß6FE/ ? å + Þ5ß½àIá + 1©Riá;9Eß=1©à + / G ? è6á.-&ß6FE/ã9Ná G 70á ? ßCFE/ ? 1;Þ5ß6á.è½à¼1©R? å + Þ5ß½àIá + 9S7Ä1:92â½ß6è=1;Þ5ß½à +ED ì@à,> /.>®å2âxà +ED 1.â±1 <21:è=1\-0/Pß6/PèPîaß6FE/�k2bSn:g_à G / + ß½àæ]2/PèT3S1 + G kio q 1 + 1:è69SàIß6è=1\è67_]EW�<Ná:à + ßÞ5á.-Q9Sà + 1:ß6á.è©> ¹ /ÄF21©H./.d

kLkNbLn:gQà¼â ��kNbLn:g� �|��TJ o©k jhJ M�g;^a`TJ Dh` f {S`��J |Ck2bSn:g |4s�J D;�L��kaoS�õ á A 3.RI/Pß_å2â°Þ5á + âxà G /Pè°ß6FE/V/5WE<Eè6/Tâ6âíàºá +� �#ì,kao q kSkNbLn:g2î N>��°âxà +ED á;åEè�à + ß6åSàIß½àIá + 1:9Ná.åEßãß6FE/ /PH�1©RIå21:ßZàºá +è6åSRI/TâP3a1 + G ß6FE/ G /5] + àIß½àIá + á ? 1 ]EWE<2á:à + ß Þ5á.-Q9Sà + 1:ß6á;èT3 A /Vá;9Eß=1©à + d�� kSk2bSn:g |Ckao q kSkNbLn:gi� = /P<SR¼1.ÞCà +ED kSk2bSn�g9S70àIß=â G /5] + àIß½àIá + 3 A /Vá.9Eß51©à + d�� |���kNbSn�g� �|��©J ¡oTk j¶J�M´g.^a`TJ Dh` f {L`��¤J |CkNbLn:g)|Ps�J D;�L�«kioS�L��|Ckio q kSk2bSn:gi� ¹ /ÄÞP1 +K+ á A <21.â6â»ß6FE/°ß A á01:è D åE-Y/ + ß=â$ß6áQß6FE/_]2è5â½ßã1:92â½ß6è=1;Þ5ß½àIá + 3;à + âZß=1 + ß½à¼1:ß½à +ED kNbSn�g81 + G J8è6/Tâ½<N/TÞ5ß½àIH./5RI7ß6á0kao q kSkNbLn:g81 + G 2d�� o©k j #M�g;^i`©J Dh` f {S`�� )|Ckio q kLkNbLn:g)|Ps D;�S��kio¹ /ÄÞP1 +¡+ á A èC/ G å2Þ5/Äß6FE/QÞ5á + G àIß½àIá + 1©R®à + ß6áQàIß=â ` f {L`Q9Eè=1 + ÞCF¬d�� �� �|Ckio q kSk2bSn:g |4s� ED;�L�äBá + ß½à + åSà +ED ß6FSà¼â A 1©7.3 A /V/PH;/ + ß6å21�RóRI7ÆÞ5á.-0<EåEß6/.d�� �� )| � � | � D4D;�L� � �2 FSàÂâ�à¼â¬ßCFE/�/5W�<N/TÞ5ß6/ G 92/PF21©H.àIá.è®á ? ß6FE/ ? 1.Þ5ß6á.è½à¼1©R ? å + Þ5ß½àIá + > � àºH;/ + 1 + 1:<E<EèCá.<Eè½à¼1:ß6/®]EWE<2á:à + ߨÞ5á;-�9Sà + 1:ßCá.è

kao q 3 A /ÄÞ5á;åSR G¡G /5] + /Qß6FE/ ? 1;Þ5ß6á.è½à¼1©R ? å + Þ5ß½àIá + 1.â»kio q kSk2bSn�ga3 A FE/Pè6/VkSk2bSn:g0à¼â�ß6FE/ /5W�<EèC/Tâ6âxàIá + 1\92á:H./.>� +S? á.è6ß6å + 1:ßC/5Rº7.3 A FE/ + å2âxà +ED ÞP1©RæRIç@9L7Sç@H�1�RºåE/.3®1 + 781:<E<SRæà¼ÞP1:ß½àIá + á ? 1 ]EWE<2á\à + ß°Þ5á.-Q9Sà + 1:ß6á;è � â½å2ÞCFKß6F21:ßTd

� � /PH�1©RIå21:ßC/Tâãß6á � ì ��� îRI/T1 G âÆß6á + á + ç@ß6/Pè6-Øà + 1\ß½àIá + á ? ß6FE/¤/PH�1�Rºå21\ß½àIá + ì,9N/TÞP1:å2â½/�/PH:1©RIå21:ß½àIá + á ? ì ��� îRº/T1 G âÆß6á�/PH�1©RIå21:ßZà +EDì � ì ��� î6î=3E1 + G ßCFLå2â_ì ��� îÖ1 D 1©à + î=>

".ø

Page 97: Functional programming using Caml Light Michel Mauny January 1995

"�� ���������� �� � � ��� �"� ������� "����$ ���� ���

¹ / A àæRóR�å2â½/Vß6FE/��l]EWE<2á\à + ßVÞ5á.-Q9Sà + 1\ß6á.è G /5] + / G 9L7ad� � ���' ºì6ì��'( ��¤ì����' �ì�( (�î���î6î6ì��'( ��¤ì����. Eì�( (aî���î6î6î

2 FE/ ]EW�<Ná:à + ß Þ5á.-Q9Sà + 1:ß6á;è��)F21.âYß6FE/ <21:èCß½à¼Þ5åSRÂ1\è½àIßí7há ? 92/5à +ED å2â61\9SRº/¡å + G /Pè ÞP1©RæRIç@9L7Sç@H�1©RIåE/¤/PH�1©RIå21:ßZàºá +è6/ D àI-0/ ì@à + á.è G /Pè0ßCáXÞ6FE/TÞCô¤ß6F21:ß ? 1.Þ5ßT3 àIßQà¼â + /TÞ5/Tâ6âC1:è67¤ß6áÒô + á A ß6FE/K/PH�1©RIå21:ßZàºá + è6åSRI/TâYá ? �Eç,ÞP1©R¼Þ5åSRIå2â5î=>ò à + Þ5/Vß6FE/ + 1:-0/ " RIáSá.ôEâB-Yá.è6/�RæàIô./Ä1 + á;è G à + 1:è670<21:è51:-0/Pß6/Pè + 1:-0/.3 A / A àæRæR�ÞP1�RóR¬kao q ß6FE/ U ò � /5WE<Eè6/Tâ6âíàºá +Þ5á.è6èC/Tâ½<2á + G à +ED ß6á0ß6FE/��h]EWE<2á:à + ß Þ5á.-Q9Sà + 1:ß6á;èT>e {L`P�¬b©JEgio;nL{�|½�ab y {S`�A:gEp:�e � f `:g�kio q �a`����:k :|L|���� q ,k�|�� �:� :| qlq �X�a�S�i|�� � q ,k�| ���:� :| qhq �¤�a�L�S���4�;�¬�S�� !L� �;�.�S���´��¸�¸N� � �;¥ ·T¸��©� ��)� �©���S�#µ G H¹ /Ä1:èC/ + á A 1:9SRI/Äß6á G /5] + /Qß6FE/ U ò � ? 1.Þ5ß6á.èZàÂ1�R ? å + Þ5ß½àIá + de {L`P�¬b©JEgio;nL{�|½�ab y {S`�A:gEp:�e � f `:g�k2bSn�g �a`lkao q |�� �:k :|�� �©J Æo©k j«J M�g;^i`©J De ` f {S`��J |Ck)|Ps�J D.�S�¤kioS�L���T�.���L�� !L� �;�.�S���´��¸�¸N��ª;�#�;¥�·©¸��T� ��)� �©���S�#µ G He {L`P�¬b©JEgio;nL{�|½�ab y {S`�A:gEp:�}�4k2bSn�g � �4�;���L�� !L� �;�.�S���´��¸t�S�#�.¥� � � �C��)� �©���S�#µ G H1 + G ß6FE/ UÄò � ��àI92á + 1;ÞPÞCà ? å + Þ5ßZàºá + de {L`P�¬b©JEgio;nL{�|½�ab y {S`�A:gEp:�e � f `:g�kio � �a`zkao q | ���:k :| ���©J ¡oTk j«J Dzg.^a`TJ De ` f {L`#o©k jhJ ��g;^i`©J De ` f {S` C�|Ck�|Ps«JJD;�S�§|6k)|4s�J �N�L�¤kao�kaoL�S�¬�T�;�¬�S�� !L� �;�.�S���´��¸�¸N�L£#�;¥ ·T¸��©� ��)� �©���S�#µ G He {L`P�¬b©JEgio;nL{�|½�ab y {S`�A:gEp:�}�4kio � ���T�.���S�� !L� �;�.�S���´��¸t�S�#�.¥� ��)� �©���S�#µ G H

Ï6��Î 7 8§Ô�Ó � �¬Ý�Ù=ÚVÛ 9ãÝE9"Õ �¨Ù+ Ù6×®Ù �VÔ�ÓBÚÜÛ�ÝN× � ��Ó�×� ? Þ5á.åEè=â½/.3�à + 1K-0á.èC/0è6/T1©Ræà¼â½ß½à¼Þ<Eè6á.ßCá.ß½7L<N/.3 A / A á.åSR G /5WEß6/ + G ßCFE/éÞ5á + Þ5èC/Pß6/81 + G 1\92â½ß6è=1.Þ5ßQâ½7 + ß=1�W�/Tâ_á ?U ò �¡à + á.è G /Pè�ß6á0â½åE<E<Ná.è6ßãèC/TÞ5åEè=âxàIá + 1.â�1Q<Eè½àI-QàIß½àIH./QÞ5á + â½ß6èCå2Þ5ßT> ¹ / G á + á.ß G á àIßãFE/Pè6/V92/TÞP1\å2â½/ A / A 1 + ßß6á0ô;/P/P< UÄò �¤âxàI-0<SRI/.> 2 FSàÂâ»à¼â°1 + à + ß6/Pè6/TâZß½à +ED8+ á + ßCè½àIH.à¼1©R±/5WE/Pè=ÞCà¼â½/ �

Page 98: Functional programming using Caml Light Michel Mauny January 1995

� ��������� ���

� !´� !#��� ! � � ��� � � � � � � � ���t� � ����� � � �

!�� � ' � � � !�� ' �����

¹ / + á AtA 1 + ß°ß6áY<2/Pè ? á.è6- â½ß51:ß½à¼ÞVß½7S<2/TÞCFE/TÞ6ô;à +ED á ? UÄò �¤<EèCá D è=1:-âP32ßCF21:ß�à¼âP3aß6áKÞ5á.-0<SRI/Pß6/Qß½7L<N/TÞ6FE/TÞCô;à +ED�CÃ05PË.¾½Ãã/PH�1�Rºå21\ß½àIá + 32-1:ô.à +ED èCå + ç@ß½àI-0/Äß½7S<2/Vß6/Tâ½ß5â�å +E+ /TÞ5/Tâ6â61:èC7 G åEè½à +ED /PH:1©RIå21:ß½àIá + á ? U ò �Ò<EèCá D è=1:-âP>��åEè6ß6FE/Pè6-Yá.è6/.3 A / A 1 + ß_ß6áF21©H./ É�Ë�D �:ëQË.¾@ÉC4LÀIÁPë ì@à,> /.>Ä1©RæRIá A ß6FE/ à G / + ß½àIß½7 ? å + Þ5ß½àIá + 3 ? á.è_/5W�1\-0<SRI/.3¬ß6á92/Q1:<E<SRæà¼ÞP1:9SRI/0ß6á01 + 78ô;à + G á ? G 1:ß=1Sî5>2 7S<2/Äâ½7 + ß6FE/Tâxà¼âã-1T7Y92/�âZ/P/ + 1.âã1 D 1\-0/.> ¹ FE/ + RI/T1:è + à +ED 1 D 1:-Y/.3 A /V-Qå2â½ßTdê Rº/T1\è + ß6FE/ÄèCåSRº/TâÜì A F21\ßBà¼â_1©RæRIá A / G 321 + G A F21:ß�à¼â ? á.èC9Sà GEG / + î �ê Rº/T1\è + 1 A à +E+ à +ED â½ß6è=1\ß6/ D 7.>*x+ ßí7S<2/â½7 + ß6FE/Tâxà¼âP3�ß6FE/Qè6åSRI/TâVá ? ß6FE/ D 1:-0/01:èC/ØÞP1�RóRI/ G 1ÆÊ��CÉ�ÃYÁ �©ÁPÊ@ÃTëQ3¬1 + G ß6FE/ A à +E+ à +ED âZß6è=1:ß6/ D 7àÂâ

ß6FE/Vß½7S<2/TÞCFE/TÞ6ô;à +ED 1©R D á;è½àIß6FE- >*x+ ß6FE/ ? á:RæRIá A à +ED âZ/TÞ5ß½àIá + âP3 A / D àIH./ ß6FE/ UÄò �¤ß½7S<2/Qâ½7�âZß6/P- 3Nß6FE/01©R D á.è½àIß6FE- 1 + G 1 + àI-0<SRI/P-0/ + ß=1:ßZàºá +

á ? ß6F21:ßã1©R D á.èZàºßCFE- > � áLâ½ß�á ? ß6FSà¼âã<EèC/Tâ½/ + ß51:ß½àIá + à¼âã9Ná.è6è6á A / G ? è6á;- ����,>Ï��ÜÎ5Ï � ��Ô)× �QÕKÔ ÝC��ÝN×¬Ô ¹ / â½ßCå G 7¤à + ß6FSà¼â8âZ/TÞ5ß½àIá + 1Æß½7L<N/Oâ½7Eâ½ß6/P- ? á.èQß6FE/ UÄò �¶RÂ1 +ED å21 D /.> 2 FE/ + 3 A /K<EèC/Tâ½/ + ßK1 + 1©R D á;è½àIß6FE-<2/Pè ? á.èC-Qà +ED ß6FE/¡ß½7L<N/Oâ½7 + ßCFE/Tâxà¼âá ? UÄò ��<Eè6á D è=1:-8âP3�1 + G àºß5âKäÖ1\-QR �Nà D FSßàI-0<SRI/P-0/ + ß51:ß½àIá + > �$/TÞP1:å2âZ/á ? â½åE9Eß½RI/K1.â½<N/TÞ5ß=â á ? ß6FE/ + á;ß=1:ß½àIá + å2âZ/ G ì@à +S? /Pè6/ + Þ5/Kè6åSRI/Tâ5î=3�1 + G âxà + Þ5/ â½á.-Y/QàI-0<2á.èCß=1 + ßÄ-81:ßCFE/P-81:ß½à¼ÞP1©R+ á.ß½àIá + â43Öâ½å2ÞCF¶1;âÄå + àæ]iÞP1:ßZàºá + á ? ]2è=âZß6ç@á.è G /Pè0ßC/Pè6-8âP3B1\è6/ + á.ß0<Eè6/TâZ/ + ß6/ G FE/PèC/.3�ß6FSà¼â0Þ6F21\<Eß6/Pè0-81©7�â½/P/P-á.92â6Þ5åEèC/�1:ß$]2è=â½ß è6/T1 G à +ED >2 FE/°ß½7S<2/°â½7Eâ½ß6/P- A / A àæRæR¨Þ5á + âíà G /Pè ? á.è UÄò �¡F21.â$9N/P/ + ]2è=â½ß D àºH;/ + 9L7 � àæR + /Pè ����� ? á.è�1Äâ½åE92âZ/PßÖá ? ß6FE/� �¡R¼1 +ED å21 D /0ì@à +? 1.Þ5ßT321Qâ½åE<N/Pè=â½/Pß_á ? �Eç,ÞP1©R¼Þ5åSRIå2â5î=> U Ê��6ÉEÃ�à¼â /5àºßCFE/PèTdê ß6FE/Vß½7L<N/ÄõãåE-Q92/Pè �ê á.èã1Qß½7L<N/VH�1:è½à¼1:9SRI/ì$3��B3 � * ½î �ê á.è� )&��� *�©3 A FE/Pè6/� )&V1 + G *�°1\è6/Vß½7L<N/TâP>

"��

Page 99: Functional programming using Caml Light Michel Mauny January 1995

"�� �������� �� �����5�.'��(�)�� � �-� � ������� � �� ��� "���&� �� ��� � ����� � � �?�������� �

*,+ 1ß½7L<N/.3�1Kß½7L<N/0H�1\è½à¼1:9SRI/0à¼âQ1 + 7SÅ &:Å2Ë�9�ÅN3aà,> /.>81 ß½7L<N/0ß6F21:ß A /01:èC/8Þ5á.-0<EåEß½à +ED > ¹ / A àæRóRãå2â½/ a3 ��Ì3 )&:3� * � =321;âVëQÃTÊ@¿�?©¿.¾=ÀÌ¿��<DóÃ4Á & èC/P<Eè6/Tâ½/ + ß½à +ED ß½7L<N/TâP> 2 FSà¼â + á.ß=1:ß½àIá + à¼â»àI-0<2á.èCß=1 + ßTd A /ÄâZF21©RæR¨å2â½/Vá;ß6FE/Pè D è6/P/PôRI/Pß6ß6/Pè=â»ß6á G / + á.ß6/Vá;ß6FE/Pè + á.ß½àIá + âÖà + ß6FE/ ? á:RæRIá A à +ED â½/TÞ5ßZàºá + âP>�! !(���� " ì � õãåE-Q9N/PèPî � � � �Æà¼â°1Qß½7S<2/.>�

U Ê��CÉ�ÃÆÁPÈ+4SÃTëQÃT3 à¼â81 ß½7L<N/ A FE/Pè6/OâZá.-0/ H:1:è½à¼1:9SRI/TâK1:è6/ G à¼â½ßZà +ED åSàÂâZFE/ G 1.âQ9N/5à +ED =;ÃTÅNÃT¾5À¼È©> ¹ /ÆÞP1 +è6/P<Eè6/TâZ/ + ßãß½7S<2/Äâ6ÞCFE/P-0/Tâ 9L7ad

&��� * � �� ,' A FE/PèC/� YàÂâ_1Qß½7S<2/.>�! !(���� " æì �"õãåE-Q92/Pè4î � � � ��1 + G ì � õ åE-Q92/PèPî � � � ��1:è6/_ß½7L<N/�â6ÞCFE/P-0/TâP>�

¹ / A àæRæR±å2â½/�� 3�� � 3�� & 3� * � =3E1.â$-0/Pß51TH:1:è½à¼1:9SRI/Tâ�è6/P<EèC/Tâ½/ + ßZà +ED ßí7S<2/ÄâCÞ6FE/P-0/Tâ4> ¹ /_-81©781©R¼â½á A è½àIß6/Vß½7S<2/â6ÞCFE/P-0/Tâ_1.â �� a> *,+ ß6FSà¼âVÞP1.â½/.3 �¤è6/P<EèC/Tâ½/ + ßV1ì,<NáLâ6âxàI9SRI7 /P-Y<Eßí7NîÖâ½/Pß_á ?�D / + /Pè½à¼Þ ß½7L<N/ÄH�1\è½à¼1:9SRI/TâP> ¹ FE/ +ß6FE/Äâ½/Pß á ?¨D / + /Pè½à¼ÞVH�1\è½à¼1:9SRI/Tâ àÂâ»/P-0<Eß½7.3 A / A è½àIß6/ á.è_âxàI-0<SRI7 a>

¹ / A àóRæR A è½àIß6/ ��� ì��®î ? á.èVßCFE/ØâZ/PßVá ? 7SÅ &:Å2Ë�9�Å�Áãá�ÞPÞ5åEè6èZà +ED à + ß6FE/0ß½7S<2/0â6ÞCFE/P-0/���> � + ô + á A + âV1:è6/1©R¼â½á8ÞP1�RóRI/ G 5P¾íÃ5à ?©¿.¾5À¼¿��<DæÃPÁ_ì,ß6FE/P7K1:è6/ + á.ßã9Ná.å + G 9S7K1 L.å21 + ß½àæ]2/PèPî5>

¹ /81©R¼â½á A è½àIß6/ � ì��®îVì �CË�7SÅOBÆÊ��CÉ�à ?T¿;¾=ÀÌ¿��+DæÃ4Á8ËG5��®î ? á;èÄß6FE/8âZ/PßÄá ? ß½7L<N/0H�1\è½à¼1:9SRI/TâQá�ÞPÞ5åEèCè½à +ED à + �A FSà¼ÞCF­1\è6/ + á.ß ? è6/P/Yì@à,> /.>_ß6FE/0â½/Pß°á ? H�1:è½à¼1:9SRI/TâÜå + àºH;/Pè=â61©RæRI7 L;å21 + ßZàó]2/ G î5> �$á.å + G ß½7S<2/QH�1:èZàÂ1\9SRº/Tâ 1:è6/Q1©R¼â½áâ61©à G ß6áQ92/�=;ÃTÅNÃT¾5À¼È©>�! !(���� " *@? � G / + á.ß6/Tâ�ßCFE/Äß½7L<N/Äâ6ÞCFE/P-0/ æì � õãåE-Q9N/PèTî � � � �B3EßCFE/ +KA /VF21©H./.d

��� ì��¨î � � � �1 + G

� ì��¨î � � ��

U Á+7 �ðÁðÊ@ÀÌÊ07SÊ@À¼Ë.Å¡À¼Å�ÁðÊ@¿;Å2È5Ã����Eá ? 1Üß½7L<N/ â6ÞCFE/P-0/�� àÂâ$ß6FE/_ß½7L<N/ âCÞ6FE/P-0/��Bì��®î A FE/Pè6/�� à¼âã1 â½åE92â½ß½àIß6åEßZàºá +á ? ß½7L<N/Tâ ? á.è 5P¾½Ã=àßí7S<2/ H�1:èZàÂ1\9SRº/Tâ 1:<E<2/T1\è½à +ED à + ��> ¹ FE/ + 1:<E<SRI7.à +ED 10â½åE92â½ß½àIß6åEßZàºá + ßCá81Qß½7L<N/�â6ÞCFE/P-0/.3a1è6/ + 1:-Øà +ED á ? â½á.-0/ 92á.å + G ß½7L<N/ÄH:1:è½à¼1:9SRI/TâV-81©792/TÞ5á.-Y/ + /TÞ5/TâCâ61:è67.3Nà + á.è G /Pè_ß6áK1TH;á:à G ß6FE/QÞP1:<Eß6åEè6/ á ? 1? è6/P/Vß½7L<N/ÄH�1\è½à¼1:9SRI/Ä9S7é1 L;å21 + ß½àæ]2/PèT>�! !(���� "

ê *@? � G / + á.ß6/Tâ � æì � �� î �� 1 + G � � à¼â � ºì � � ì � �!�®î6î � ì"� �!�®î=3Pß6FE/ + � � à¼â�1_â½åE92â½ß½àIß6åEßZàºá +à + âZß=1 + Þ5/_á ? � 92/TÞP1:å2â½/�� � �#�Bì��®î A FE/Pè6/�� � � %$[ì"� �&�±î �L3Pà,> /.>'�Oâ½åE92â½ß½àIß6åEßC/TâBßCFE/ãß½7L<N/(� �&�? á.è�ß6FE/VH:1:è½à¼1:9SRI/ B>

ê *@? � G / + á;ß6/Tâ � æì � � �î �� 1 + G ���;à¼â *) ºì ) � ì � � � î6î ��ì � � ��î=3:ß6FE/ + ���:à¼â�1Vâ½åE92â½ß½àIß6åEßZàºá +à + âZß=1 + Þ5/Äá ? � 92/TÞP1:å2âZ/�� � �+�Bì��¨î A FE/Pè6/,� � � -$[ì � � ��î/�L> *,+ ß6FSà¼â°ÞP1;â½/.32ßCFE/Äè6/ + 1:-Øà +ED á ? �à + ß6á ) A 1.â + /TÞ5/TâCâ61:è67ad A / G à G + á.ß A 1 + ß�ß6FE/ÄH:1:è½à¼1:9SRI/�� à + ßCè6á G å2Þ5/ G 9L7.�ÒßCá092/QÞP1:<Eß6åEè6/ G 9L7ß6FE/å + àºH;/Pè=â61©R L;å21 + ß½àæ]iÞP1:ß½àIá + �B>

� / KJ��CH�����I" 7 �I�*G:�J&%��$'6*G:(<��$'C�����FB$'�*D 6#&%�B(�0 7:C%� �214365"78369�:<; $'" ��=?>A@B;�1�365 78369�:<;�,

Page 100: Functional programming using Caml Light Michel Mauny January 1995

����� ��������� �����4� � �.�� "#"�2 FE/Vßí7S<2/Qâ6ÞCFE/P-0/�� � � ��& * � ���� � à¼â_â61©à G ßCá092/Q1 =.éÅ2ÃT¾5ÀÌÈ�ÀÌÅEÁPÊ@¿.ÅNÈ=Ã�á ? � � & � * ,� Yà ? ß6FE/Pè6/

/5WSàÂâZß=â°1Qâ½åE92âZß½àIß6åEß½àIá + ��â½å2ÞCF ß6F21:ß©dê ß6FE/ G á.-81©à + á ? �Òà¼â»à + ÞCRºå G / G à + � 0& �� * * 4� ,�� �ê � �#�$ì Nî �ê + á �'�®á�ÞPÞ5åEè5â ? èC/P/_à + ��>

*,+ á.ß6FE/Pè A á.è G âP3¬1 D / + /PèZàÂÞ�à + âZß=1 + Þ5/á ? 1 ßí7S<2/â6Þ6FE/P-Y/Qà¼âVá.9Eß=1�à + / G 9S7 D àºH;à +ED -0á;è6/0<Eè6/TÞCà¼â½/H�1©RIåE/Tâ ß6áâ½á.-Y/ D / + /Pè½à¼ÞVH:1:è½à¼1:9SRI/TâP3a1 + G ì,<NáLâ6âxàI9SRI7Nî L;å21 + ß½à ? 7;à +ED â½á;-0/°á ? ß6FE/ + / A ß½7L<N/VH�1:èZàÂ1\9SRº/Tâ à + ß6è6á G å2Þ5/ G >�! !(���� " *@? � � � æì � � î � B3Nß6FE/ + � � � � æì6ì"� � �±î � �î � à¼âV1 D / + /Pè½à¼ÞÜà + âZß=1 + Þ5/Qá ? ��>¹ /0ÞCF21 +ED / G �¤à + ß6á¡ì"� � �®î=321 + G A / å + àºH;/Pè=â61©RæRI7 L.å21 + ß½àæ]2/ G á + ß6FE/ + / A Rº7 à + ß6èCá G å2Þ5/ G ß½7S<2/QH�1\è½à¼1:9SRI/��>�

¹ /K/5W�<Eè6/TâCâQß6FSà¼âQß½7L<N/ â½7Eâ½ß6/P- 9S7X-Y/T1 + âQá ? À¼Å<5ðé¾½ÃTÅ2È5þ 7QDæÃPÁP> U + à +S? /Pè6/ + Þ5/ èCåSRº/ à¼â A èZàºßCß6/ + 1.âQ1? è=1.Þ5ß½àIá + d

ê ß6FE/ + åE-Y/Pè=1:ß6á.è$à¼â_ÞP1©RæRº/ G ß6FE/_Éa¾íéëQÀIÁ5ÁðÃ4Á �ê ß6FE/ G / + á.-Qà + 1:ß6á;è�à¼â°ÞP1©RæRI/ G ß6FE/0È5Ë.Å2È�D 7;ÁPÀ¼Ë.ÅN>

U + à +S? /Pè6/ + Þ5/Qè6åSRI/.d� & * � � ,

�-81©709N/Äè6/T1 G à + ß A á A 1©7�âPd

ê ����� � &:3 * * (�)��� ,i3 3� "�) � � >ê ��� ) 1�$���" $ 3 1 �;$ 1� �" � 3 ( 3E(@)�)���� &�( "�)�3 3 1-��$ 1� �"�� &:3 � * (�)���� , � >

U + à +S? /Pè6/ + Þ5/ è6åSRI/V-81©70F21©H./ + áY<Eè6/P-Qà¼â½/.dBâ½å2ÞCF 1 è6åSRI/ A àæRæR±9N/ÄÞP1©RæRº/ G 1 + ¿:Ç:À¼Ë.ëQ> U Þ5á.-0<SRI/Pß6/V<EèCáLá ?®A àæRóR92/ è6/P<Eè6/Tâ½/ + ß6/ G 9L7K1 Éi¾½ËTËH5ÄÊ@¾íÃ5Ããá ? ß6FE/ ? á:RæRIá A à +ED0? á.è6- d

� �& * * * � ����

>>> * *

� && * * � &,

A FE/Pè6/VßCFE/VRI/T1©H./Tâ�á ? ß6FE/Vß6è6/P/Qì � �& 3� * � =3 ���� îB1:èC/_à + âZß=1 + Þ5/Tâ á ? 1�WLàIá.-8â4>*x+ ß6FE/Ä<EèC/P-Qà¼â6â½/Tâ_1 + G ß6FE/ÄÞ5á + ÞCRIå2âxàIá + âV1:<E<N/T1:è��+7�B�=.ÃTëQéÅ2ÊÌÁ�F21TH;à +ED ßCFE/ ? á.èC- d��� �Äd �

Page 101: Functional programming using Caml Light Michel Mauny January 1995

� ��� �������� �� �����5�.'��(�)�� � �-� � ������� � �� ��� "���&� �� ��� � ����� � � �?�������� �

ò å2ÞCF­1 �½å G D /P-0/ + ßÄâ½FEá.åSR G 9N/Qè6/T1 G 1.â �5å + G /PèVß6FE/Qß½7L<Sà +ED / + H.àIè6á + -Y/ + ß � 3aß6FE/Q/5W�<EèC/Tâ6âxàIá + �QF21.â_ß½7S<2/â6ÞCFE/P-0/ � � > 2 7S<Sà +ED / + H;àºèCá + -0/ + ß=â01:è6/Kâ½/Pß=â á ? Ê��6ÉaÀ¼ÅQ=-4��CÉ�Ë;Ê*4LÃPÁPÃPÁÄá ? ß6FE/ ? á.è6- (�d � A FE/Pè6/ ( à¼â01 +à G / + ßZàó]2/Pè + 1\-0/�1 + G �OàÂâ_1Yßí7S<2/ÄâCÞ6FE/P-0/.d$ß½7L<Sà +ED / + H;àIè6á + -0/ + ß=â D àIH./Vß½7L<N/TâãßCá0ß6FE/VH�1\è½à¼1:9SRI/Tâ_á�ÞPÞ5åEè6èZà +ED? è6/P/Qì@à,> /.>�å + 92á.å + G î$à + ß6FE/ /5W�<EèC/Tâ6âxàIá + >

¹ FE/ + ßí7S<Sà +ED �Eç,ÞP1©R¼Þ5åSRIå2â�ßC/Pè6-8âP3©ß6FE/Bß½7S<Sà +ED / + H.àIè6á + -0/ + ß�à¼â®-81 + 1 D / G 1.â¬1ÜÁPÊ@¿.È &�ì,9N/TÞP1:å2â½/�à G / + ß½àæ]2/Pè=â<2áSâ6â½/Tâ6â RIáEÞP1©RÖâ6Þ5á.<N/Tâ5î=> ¹ /Qè6/P<Eè6/Tâ½/ + ßVß6F21:ß ? 1;Þ5ß_à + ß6FE/Q<Eè6/Tâ½/ + ß=1:ß½àIá + á ? ß6FE/Qßí7S<2/0â½7Eâ½ß6/P- 9S7X¾½Ã©ë�Ë ?TÀÌÅ�=ß6FE/0ß½7S<Sà +ED FL7S<2á.ßCFE/Tâxà¼â�Þ5á + Þ5/Pè + à +ED 1 + à G / + ß½àæ]2/Pè + 1:-0/-(¤ì à ? â½å2ÞCFX1ß½7S<Sà +ED FL7S<2á;ß6FE/Tâxà¼âV/5WSà¼â½ß=â5î_92/ ? á.è6/1 GEG à +ED 1 + / A ß½7L<Sà +ED FL7S<2á;ß6FE/Tâxà¼â°Þ5á + Þ5/Pè + à +ED (�>

¹ / A è½àIß6/ ����� ì (aî ? á.è ß6FE/8â½/PßVá.ß ß½7L<Sà +ED FS7S<2á.ß6FE/TâZ/TâVá.9Eß=1�à + / G ? è6á.- � 9L7Æè6/P-Yá�H;à +ED ß6FE/Yßí7S<Sà +EDFS7L<Ná.ß6FE/Tâxà¼â_Þ5á + Þ5/Pè + à +ED ( ì@à ? àIßã/5WLà¼â½ß5â5î=>U + 7 + åE-Y/Pè½à¼ÞÄÞ5á + â½ß51 + ß»àÂâ»á ? ß½7S<2/Äõ åE-Q92/PèTd

� � � p:Ja{:g #ÆdSõãåE-Q9N/Pè ìíõ � � î¹ /Vá.9Eß51©à + ß½7L<N/Äâ6ÞCFE/P-0/Tâ ? á.èãH�1\è½à¼1:9SRI/Tâ ? è6á;-}ßCFE/Vßí7S<Sà +ED / + H;àºèCá + -0/ + ß � d

� � � (Kd �0� � � b y ( d � ì 2 U � 2 î* ß à¼âã<NáLâ6âxàI9SRI/Qß6áYà + âZß=1 + ß½à¼1:ß6/Vß½7L<N/�â6ÞCFE/P-0/TâP> 2 FE/ � � / +E*,+ â½ß=1 + Þ5/ � è6/5R¼1:ßZàºá + è6/P<Eè6/TâZ/ + ß=â D / + /Pè½à¼Þ à + âZß=1 + ß½àIç1:ß½àIá + >

��� � d � � � � � / +E*x+ â½ß=1 + Þ5/;ì��®î��� �Äd � �

ì * õ ò 2 î* ß»àÂâ <2áSâ6âxàI9SRI/�ßCá D / + /Pè=1©RæàIïP/Äß½7S<2/Qâ6Þ6FE/P-Y/Tâ A àIß6F èC/Tâ½<2/TÞ5ßãßCá0H�1:èZàÂ1\9SRº/Tâ ß6F21:ß G á + á.ßãáEÞPÞ5åEè ? è6/P/_à + ßCFE/Äâ½/Pßá ? FL7S<2á;ß6FE/Tâ½/TâPd

� � � d � �� ��� ì � î� � � d <� ì � ÷ õVî

2 7L<Sà +ED 1QÞ5á + G àIß½àIá + 1©R,d� � �*&_dLõ åE-Q92/Pè � � ���Üd � � �*�Vd

� � ì=o©k ��&_g.^a`©J �#� ` f {L` �*�Vkao.îBd ì * �$î2 7L<Sà +ED 1 + 1:<E<SRæà¼ÞP1:ß½àIá + d

� � � & d �� � ��� � � d � � ì��*&)���©îBd � ì U � � î

2 7L<Sà +ED 1 + 1:92â½ßCè=1.Þ5ß½àIá + d ì ��� � ì�(aî6î � � ( d .� � �Vd ���� ì��'( ��:îBd � � ì U � ò î

2 FE/0â½<N/TÞCàÂ1�RBè6åSRI/�9N/5RIá A à¼â_ß6FE/ á + /ÄßCF21:ßãà + ß6è6á G å2Þ5/Tâ_<2á:RI7S-0á.è6<EFSà¼â½-¡d°ßCFSàÂâ_Þ5á.è6èC/Tâ½<2á + G â_ßCá8ß6FE/ � � f `�gÞ5á + â½ßCè6å2Þ5ßT>

� � � d � ì ��� � ì�(aîCî � � (¡d �0� � � � d ��� ì��'( B� � îM�Äd ì � ÷�2 î

2 FSà¼â$ß½7L<N/ â½7Eâ½ß6/P-�F21.â$9N/P/ + <Eè6á:H./ + ß6á 92/QÁPÃTëQ¿.Å2Ê@ÀÌÈ5¿�D@D �ÜÁðË�7SÅOB;3.à,> /.>®ß6FE/Vâ½/P-81 + ß½à¼Þ H�1©RIåE/Vá ? 1 A /5RæRºç@ß½7S<2/ G/5WE<Eè6/Tâ6âxàIá + ìí1 + /5WE<Eè6/Tâ6âíàºá + 1 G -QàIß6ß½à +ED 1Yß½7L<N/:îÖÞP1 +E+ á.ß_92/01 + é¾=¾½Ë.¾ ?©¿�D 7Là G åE/ÄßCá810ß½7S<2/ /Pè6è6á.èT> 2 FSà¼â»àÂâå2â½å21©RæRI7 /5WE<Eè6/Tâ6âZ/ G 1.âPd

¹ /5RæRºç@ß½7S<2/ G <Eè6á D è=1:-8â�ÞP1 +E+ á.ß D á A è6á +ED >2 FSà¼â ? 1;Þ5ßVàI-0<SRæàI/Tâ0ß6F21\ß�1 ÞCRI/PH./PèÞ5á.-0<SàæRI/Pè�-1T7Æ<Eè6á G å2Þ5/ Þ5á G / A àIß6FEá;åEßØ1 + 7 G 7 + 1:-Qà¼Þß½7L<N/0ß6/Tâ½ß ? á.èQ1A /5RæRºç@ß½7S<2/ G /5WE<Eè6/Tâ6âxàIá + >

Page 102: Functional programming using Caml Light Michel Mauny January 1995

����������� ��� ������������ � �����

���! #"%$'&)( *#+-,/.103254�+�27698:.10<;>=�?@,54�+�0A+-,/B�CED5.GF>+�0 H�IJB�KL+L8G,541H�,/,54�+3CMB�FNF>B�O�;>=�?P;Q0�,5D7.�+LR

SUTWV�X�Y[Z@\[]�^#_`^ba-cdZeZ R�fhgifjk=lBLDnmG+-D3,5B@mGBW0oB18�O�+UO�;NFpFE.10o+U,54�+�+�qr.G;>KsH�F>+-=12t+uI1+-,oO�+-+-=v,54�+ V�X�Y 2tBr=10o,5D5.12t, Hw=1mvH�=xH�y�yGFN;)2-Hw,o;>BL=hB�CzH�=;>{P{P+�mr;QH�,5+PH�I10A,5DnHL2t,o;>BL=}|M;k~`+L~ Hw=v+t��y�D5+�050<;>BL=x41H�KL;>=�?u,54�+�CMB�FNF>B�O�;>=�?v0o41H�y1+LR�| ]1�1_��b��� ~z��4�+P|�*!��� � D5.GF>+O�;NFNF�IJ+�2tD5.127;QH�FkR�O�;>,54�BL.�,�;>,�8:O�+�2tBr.GF)m�=�BL, 274�+�256W,74�+���.1mG?L+-{�+-=�, HwI1B�KL+L~

�N�-�����L��t���s���z��������N���s�o�� �� ¢¡r�¤£ �L¥'���P¦§��>¨�©-ªL�� �� M¡L��£ �L¥��¬«¤�'£`��¦§�

�N�-�����L�­ �U®��t«¤�'£`�P¦§�

�N¯°ªL�<�w�­ ��®U�� Q±@¦²±1¥!¦³ Q±P¦´±1¥

�p�-�����w�­ ��®��t«���£`��¦§�

�p¯�ªL�k�L�­ ��®U��±P¦´±

�N��µ-µ��­3¶ �t®��t«¤�'£`�P¦§���z�U®h®��¬±·¦²±

�N¸n©-�L�� ��¹rº-»h® ¶ ¡r��£ �½¼t¾¿®¿®U�-±P¦´±

À��4G;)0�,�ÁGy1+�0oÁ�0o,5+-{ÂmGBG+�0�=�BL,/,7+tFpF'.10/4�B�OÃ,5BUÄ1=1m�,54�+�I1+�0o,3,oÁ�yJ+3C¢BrD H�=W+t��y�D5+�050<;>BL=!~�Å�.�,/O/41H�,�;Q0�,54�+

I1+�0A,�,oÁ�yJ+�CMBLD�H�=h+t��y�D5+�050<;>BL=#Æjk,U{�.10A,�I1+W0o.1254},541H�,�H�=GÁxBL,54�+-D�yJB�050<;>IGF>+u,�ÁGy1+·C¢BLD�,741H�,�+t��y�D5+�050<;>BL=%;)0{PBLD7+�0oy1+�27;NÄ92�Ç:;È=xBL,74�+-D�O�BLDtm�0-8G,54�+�IJ+�0o,/,oÁ�yJ+3;Q0/,54�+PÉ�Ê�Ë-ÌEÍLÎ�Ï1Î�ÐoÑLÒN~

Ó�Ô�ÕAÖ ×ÙØ�ÚÂÛÝÜnÞ ß3à'á5â'ØPã

ä�BsOåmGBWO�+UÄ1=1mx,54�+�{PBG0o,�?L+-=�+-DnH�FE,oÁ�yJ+�CMBLDÝHw=h+t�¤y�D7+�050<;>BL=hB�C�BL.�D3FQH�=�?L.1H�?r+�Ææ��4�+�y�D5BLIGF>+-{çO�;È,74h,54�+0o+-,3B�CED5.GF>+�0�H�I1B�KL+L8G;Q03,541Hw,/O�+�2tBL.GFQm�;>=10o,nH�=G,o;QH�,5+�H�=1mW?L+-=�+-DtH�FN;Èè-+�,oÁGy1+�03H�,ÝHw=�Áu,o;>{P+L8J;>=�,7D5B¤mG.127;>=�?W,oÁGy1+05274�+-{P+�0-8�O�4G;pF>+�,54�+�{PBG0o,�;È{�y1BLD5,tH�=�,�D5.GF>+�0�|�Hwy�yGFp;Q2-H�,A;ÈBr=%Hw=1mWH�I10o,5DnHr2t,o;>BL= � .10o+�muBL=GF>ÁW,oÁGy1+�0-~

*é+-,�.10�O/Do;>,5+PHu=�+-O´0o+-,�B�Cz;>=GCM+-D5+-=12t+uD5.GF>+�0�,541H�,�O�+�O�;NFNF�D5+�HrmêHr0�H�=¿H�F>?LBLDA;È,74�{ë|�27F>B�0o+P,5BWHWìED7B�F>BL?y�D5BL?rDnH�{ � Rí =�Áu=�.�{�+-Do;Q2�2tBL=10o,tH�=�,�;)0�B�C�,oÁGy1+�î�.�{�I1+-D�R

ï T@ðGñ�c#ò�Yôó RGî/.�{�IJ+-D |�î3õ3ö �

��4�+U,�ÁGy1+�0�B�CE;QmG+-=�,o;NÄ1+-Dn0�HwD5+�BLI�,nH�;>=�+�m�I�ÁW,nHw6L;>=�?P?L+-=�+-DA;)2�;>=10o,nHw=12t+�0/B�CE,oÁ�yJ+�05274�+-{P+�03H�y�y1+�HwDo;>=�?P;>=x,54�+,oÁ�yG;>=�?l+-=�Kr;>D5BL=�{P+-=G,�~���4�+�0o+P?L+-=�+-DA;)2�;È=10A,nH�=12t+�0�O�;pFNF�I1+vÌM÷7ø¤Î¬ËÝH�=1m%=�BL,�,oÁ�yJ+·07254�+-{P+�0¬R�,54G;Q03D5+�0o,5DA;)2t,A;ÈBr=H�y�yJ+�H�Dn0ù;>=@,54�+3D5.GF>+�I1+tF>B�O�8GO/4�+-D5+3,54�+/,oÁGy1+�ú�;Q0�+t��y1+�2t,5+�mu,5BUI1+�HU?L+-=�+-Do;Q2�;>=10o,tH�=12t+�B�C!,54�+3,�ÁGy1+�05274�+-{P+û ~

í 0�;>,�;)0�y�D5+�0o+-=G,5+�m%|kI1+tF>BL=�?�;>=�?W,5BuH@mG+�mG.12t,o;>BL=h0oÁ�0o,5+-{ � 8G,54�+�CMB�FNF>BsO�;È=�?uD5.GF>+�O�;NFNF�41H�KL+�,5BuH�=�,A;)27;>y1H�,7+,54�+P+tü!+�2t,�B�C/,54�+P+�qr.1H�FN;>,oÁ¿2tBL=10o,5DtH�;>=�,n0�I1+-,oO�+-+-=¿,oÁGy1+�0Ý;È=ý,54�+uBL,54�+-DUD5.GF>+�0P|<{�.GF>,o;>yGF>+WB�2-2t.�D5D5+-=12t+�0UB�C H,oÁ�yJ+�{P+-,nH�KsHwDo;QH�IGF>+ � 8�O/4�+-=x254�BGB�0<;>=�?u,54�+3;>=10o,nH�=12t+�ú#~

ú \Ãþ +-=�jk=10o,tH�=12t+�| û �ï ÿ ��� R û�� T���� � RLú |kjoî���� �

[4�+-=WO�+�D5+�HLmu,54G;Q0/0o+-,�B�C';>=GC¢+-D7+-=12t+�D5.GF>+�03HL0�H�=vH�F>?LBLDo;>,54�{l8�,54�+U|kj�î���� � D5.GF>+UO�;NFpF'I1+�;>{PyGF>+-{P+-=G,5+�m�I�Á#R� ~�,nH�6r;È=�?uHL0�úu,54�+��t{�B�0o,�?L+-=�+-DnH�F!?L+-=�+-DA;)2Ý;>=10o,nH�=12t+���B�C û ,741H�,�;Q0/H�,oÁGy1+�|k,54�+�D7.GFÈ+UD5+�qr.G;ÈD7+�0 úu,5B�IJ+H�,oÁ�yJ+�H�=1mu=�BL, H�,oÁGy1+�05274�+-{P+ � 8

Page 103: Functional programming using Caml Light Michel Mauny January 1995

����� �E �����'�z� �������!�¤�3����� ���ù������ ��3�����E�½����z������ �����³����z���������3���L���

� ~�{@H�6r;È=�?uúu{PBLD5+�0oyJ+�27;NÄ92�IGÁ���Ï�� ���nÑLÌ�� ÊLÏ��! �#" O/4�+-=v+-=12tBL.�=G,5+-Do;>=�?u+�qL.1HsFp;>,oÁv2tBL=10o,7DnH�;>=�,t0-~��Á�yG;>=�?PH�2tBL=1mr;>,o;>BL=1H�F�D7+�qL.G;>D5+�0�Br=GFÈÁ�,54�+�,5+�0o,�y1H�D5,�,5B�IJ+�B�C�,oÁGy1+�î/.�{�I1+-D�8¤Hw=1mPIJBL,54vH�F>,5+-D5=1Hw,o;>KL+�0�,5B�IJ+B�C!,54�+ 07H�{P+3,�ÁGy1+3ú#~���4G;)0ù;Q0�H�=u+t�:H�{�yGFÈ+3B�C!+�qr.1H�FN;È,oÁ@2tBr=10o,5DnH�;>=G,zIJ+-,�O�+-+-=u,54�+/,oÁGy1+�0EBwCé,oO�B�+t��y�D5+�050�;ÈBr=10-~

ï T%$'& RLî/.�{�IJ+-D ï T%$#( RGú ï T%$*) RLúï T | a�Z+$ & Y�,#X�c+$ ( XLV�òGX-$ ) Z#aL� RLú |�./ î�0 �

��Á�yG;>=�?WH�=vH�y�yGFN;Q2-H�,o;>BL=xy�D5B�mG.12t+�0 HsF)0ABP+�qL.1HsFp;>,oÁv2tBL=10o,7DnH�;>=�,t0z,741H�, H�D5+�,7B�IJ+�0oBwFÈKr+�mWIGÁ@.�=G;NÄ92-H�,o;>BL=!Rï T%$ & R�ú�g ú21 ï T%$ ( RLú

ï T | $ & $ ( � RLú 1 | í ì�ì �

��Á�yG;>=�?vH�=hH�I10A,5DnHL2t,o;>BL= �ty�.10A4�+�0 �WHP,oÁGyG;>=�?v4GÁ�yJBL,54�+�0<;Q0�CMBLD�,54�+PH�I10o,5DtHL2t,5+�mu;QmG+-=G,o;NÄ1+-D�R�.�=G;NÄ92-H�,o;>BL=}O�;NFpF{@H�6r+3;È,�{PBLD5+�y�D5+�27;Q0o+�mG.�Do;>=�?@,74�+�,oÁ�yG;>=�?PBwC�,54�+�HwI10o,5DnHL2t,A;ÈBr=WI1B�mGÁ9R

|oï�3hï'| � �5� ÿ ��� R'4 _ ú � T+$ R�ú 1ï T | ] �65 $�� RGúPgëú 1 | í Å � �

��Á�yG;>=�?WH V�X�Y 2tBr=10o,5D5.12t,�;>=GKLB�F>KL+�03H�?L+-=�+-DnHsFp;>è�H�,A;ÈBr=ê0o,5+-y!RùO�+�?r+-=�+-DnH�FN;>è-+·Hr0�{�.1254vHL0�y1B�050�;ÈIGF>+L~ï T%$ RLú21 �87 &:9 _�_�_ 9 7<; � \>=@? |�ú21 � 3 =@? |�ï � |�ïA3¿ï'| � �5� ÿ ��� R'4 7 & _�_�_ 7<; _ ú21 � T%$ 1#R�ú

ï T | ] �65 $ 1 �B$ RLú |o*!�z� �

��4G;)0�0A+-,�B�CE;>=GC¢+-D5+-=12t+uD5.GF>+�03D5+-y�D5+�0A+-=�,n0�Hw=%HsFÈ?rBLDo;>,54�{ I1+�2-Hw.10o+P,54�+-D5+U;Q0�+t�1HL2t,oF>ÁlBL=�+P2tBL=127F>.10<;>BL=hCMBLD+�HL274v0oÁG=�,nHr2t,o;Q2 í ��*ý2tBL=10o,5D7.12t, |<?�;>KL;>=�?uy�Do;>BLDo;>,oÁ@,5B�,54�+�|�*!��� � D5.GF>+�B�KL+-D�,54�+�D5+-?L.GFQH�D3H�y�yGFN;)2-Hw,o;>BL=xD5.GF>+ � ~��4G;Q030o+-,/B�CED5.GF>+�0�{@H�ÁuI1+�D7+�HLmWHL0/HPìùD5B�F>BL?�y�D5BL?rDnH�{v~

��4G;)0�H�F>?LBLDo;>,54�{³41HL0�IJ+-+-=vy�D5B�KL+-=W,5B�IJ+LR

C Ë ÷�Ï1ÌMÑD��Ì��E�nÑLÒ ÒN÷PË-Ê��GÏGF!R3O/4�+-=},54�+PH�F>?LBLDo;>,54�{ç0o.12-2t+-+�m�0UBL=hH�=x+t��y�D5+�050<;>BL= $ H�=1m%D5+-,5.�D5=10�Hu,oÁGy1+Pú#8,54�+-= $ RLú#~

C �nÊLÉ�ø9ÒNÎ�ÌMÎ�R�;NC�H�=x+t��y�D5+�050<;>BL= $ yJB�050o+�050A+�0�Hu,�ÁGy1+Pú#8�,54�+-=x,54�+@H�F>?LBLDA;È,74�{ O�;NFpF�Ä1=1mhHu,oÁ�yJ+Pú 1 0o.1274,541H�,/ú�;Q0 H�=u;>=10o,tH�=12t+�B�Czú 1 ~E��4�+�D5+-,7.�D5=�+�mu,oÁ�yJ+�ú 1 ;Q0�,54G.10�,54�+�{�B�0o,�?L+-=�+-DnH�F',�ÁGy1+�BwC $ ~

���! #"%$'&)( h+�2tBL{�y�.�,5+�,54�+z,oÁGy1+�,541H�,!O�+�0<;>{PyGF>Á·274�+�276L+�m�;È=�BL.�D�FQHL0o,'+t�:Hw{PyGF>+L~ [41H�,!;Q0'mGDnH�O/=�IJ+tF>BsO;Q03,54�+�D5+�0o.GF>,�B�C�,54�+�,oÁGy1+P0oÁG=�,54�+�0�;)0¬R/;>=lCkHL2t,�8#O�+�D5.�=xBL.�D�HsFÈ?rBLDo;>,54�{³O�;>,54x,�ÁGy1+�K�H�Do;QH�IGF>+�0�D5+-y�D7+�0o+-=�,A;È=�?.�=�6G=�BsO�=10-83{PB¤mr;NCMÁL;>=�?�,54�+xy�D5+-KL;>BL.10lH�y�yGFN;Q2-H�,o;>BL=10lB�C�,74�+¿|<j�î���� � D5.GF>+hO/4�+-=Ã=�+�2t+�0705H�D5Áe|M;k~`+L~åO�4�+-=+-=12tBL.�=G,5+-Do;>=�? H�=�+�qL.1H�FN;>,oÁÃ2tBL=10o,5DnHs;È=G, � ~Ã��4G;)0�;Q0uK�H�FN;)m#8�0<;>=12t+x;>,W2-H�=[I1+xy�D5B�KL+�m ,541H�,P,54�+h2tBLD7D5+�2t,o;>BL=B�C�,54�+lO/4�B�F>+hmG+�mG.12t,o;>BL=[,5D5+-+�;)0uy�D7+�0o+-D5KL+�m�IGÁ 0o.�I10o,o;>,5.�,o;>BL=[B�C�,oÁGy1+�0·C¢BrDP,oÁ�yJ+êK�H�Do;QH�IGF>+�0-~jk=ÃH}D5+�H�F;>{PyGF>+-{P+-=G,nH�,o;>BL=�B�CÝ,74�+vH�F>?LBLDo;>,54�{v8�,54�+vm�H�,tHê0A,5D5.12t,5.�D5+�0·D5+-y�D5+�0o+-=G,o;>=�?h,oÁ�yJ+�0�O�;NFNFÝIJ+v0o.�I�{�;>,5,5+�m ,5BhH.�=G;NÄ92-H�,o;>BL=x{P+�2741H�=G;Q0o{v~

�p¯�ªL�k�L��n�U�����ù�U������p�������� �P M¡L��£ �L¥'���P¦§�

�N¯°ªL�<�L�­ �U®���  ±@¦´±1¥!¦³  ±P¦´±1¥ �N¯°ªL�<�w�

­ ��®��-±P¦´±�N�sµ-µ��

­�¶ �t®��t«¤�'£`��¦§���ù�U®ý®��-±P¦´±�N¸t©-�w�� ��¹rº-»h® ¶ ¡r��£ �½¼t¾¿®¿®U�-±P¦´±

//=12t+�H�?�H�;>=!8G,54G;Q0�+t�¤y�D7+�050<;>BL=�;)0ù=�BL,z,oÁGy1H�IGF>+ O�;È,74�BL.�,z,54�+3.10o+/BwCé,74�+�|�*��z� � D5.GF>+LRzHw=P+-D5D5BLD�O�BL.GFQmPB�2-2t.�DI1+�2-Hw.10o+�B�Cz,54�+�,oÁGy1+U+�qL.1H�FN;>,oÁv2tBL=10o,5DtH�;>=�,n0�I1+-,oO�+-+-=êHsFpFEB�2-2t.�D5D5+-=12t+�03B�C�H�K�H�Do;QH�IGF>+PIJBL.�=1mlI�ÁvH � ] �:~zj<=H�=W+tü!+�2t,o;>KL+�;È{�yGFÈ+-{�+-=�,nHw,o;>BL=!89H·.�=G;pÄ92-Hw,o;>BL=v+-D5D7BLD/O�BL.GFQmuB¤2-2t.�D�~

Page 104: Functional programming using Caml Light Michel Mauny January 1995

���������ý�� ���@���e����z�����������3���L���#�z� ���

À }+ê{uH�Á½=�Br,o;Q2t+xC¢D7BL{ ,74�+ê+t�1H�{PyGF>+¿HwI1B�KL+x,541H�,u,54�+¿H�F>?LBrDo;>,54�{ ;Q0lË ÷�Ï1ÌMÑ����FD�QÐoÎ ��ÌMÎ FLR¿0<;>=12t+L83CMBLDWH

?�;>KL+-=½+t��y�D5+�050<;>BL=!8�Hl,oÁ�yJ+ mG+�mG.12t,o;>BL= C¢BrD�,741H�,�+t�¤y�D5+�070<;>BL=½.10o+�0U+t�:Hr2t,oF>Á¿BL=�+WD7.GFÈ+WyJ+-D@0o.�I�M+t��y�D5+�050<;>BL=!8,54�+@mG+�mG.12t,A;ÈBr=¿yJB�050o+�050A+�0�,74�+@05H�{P+P0o,7D5.12t,5.�D5+@Hr0�,54�+P+t��y�D5+�050�;ÈBr=!~� }+@2-H�=h,54G.10�D7+�2tBL=10o,5D5.12t,�,74�+ í ��*+t��y�D5+�050<;>BL=�C¢D5Br{å;>,n0�,�ÁGy1+�mG+�mG.12t,A;ÈBr=v,5D5+-+L~ ��D5BL{´,54�+�mG+�mG.12t,A;ÈBr=v,5D5+-+�HwI1B�KL+L8r;NC�O�+�O/Do;>,5+�.�y�yJ+-D D7.GFÈ+�0�HL0I1+t;>=�? �¬H�D5?L.�{P+-=G,n0 ��B�C!,54�+3BL=�+�0�I1+tF>B�OôHw=1m�;NCEO�+3H�=�=�BL,nH�,7+/,54�+�H�y�yGFN;)2-Hw,o;>BL=10/BwCé,74�+�|kjoî���� � Hw=1mW| í Å � �D5.GF>+�0�I�Áu,54�+�=1H�{P+UB�C�,54�+�0o.�I��o+�2t,/KsHwDo;QH�IGF>+L81O�+�BLI�,nHs;È=!R

*!�����G| í Å ���G|kj�î������ � 9 í ìzì�|<j�î������ 9 j�î������ �5�

��4G;Q0ù;Q0�Hw=�;NFpF>.10o,7DnH�,o;>BL=WB�C!,54�+ �t,oÁGy1+�0�kHL0�My�D5BLy1BG0<;>,o;>BL=10zH�=1m�y�D5BL?rDnH�{@0�kHr0�My�D5BGB�C 0 �3y1H�DnHLmr;>?L{v8GH�FQ0oB�6G=�B�O/=HL0u,54�+ �'.z.�D5D5Á�kä�BsO/H�Dtmý;Q0oBL{PBrD5y�4G;Q0o{��[|o27CA~ � ���8" � ~åj<=Ã,54G;Q0W+t�1H�{PyGF>+L8�O�+¿2-Hw=ô0A+-+h,54�+h,oÁGy1+hB�C�,54�+2tBL=10<;QmG+-D5+�me+t��y�D5+�050<;>BL=dHr0WHýy�D5BLy1BG0<;>,o;>BL=dH�=1m�,54�+h+t��y�D5+�050�;ÈBr=[;>,n0o+tFNC@HL0u,54�+hy�D5BGB�C58 H�=1m#8�;>=1mG+-+�m#8�O�+D5+�2tBL?r=G;Èè-+U,54�+�+t��y�D5+�050<;>BL=xHL0�,54�+�mG+�mG.12t,o;>BL=v,5D7+-+L~

Ó�Ô�Õ�� ×ÙØ�Ú������ â� �!WÚ "$#% '& â'Ø�Ú�#�á)(zÚ�à

h+�=�B�O[;>{PyGF>+-{P+-=G, ,74�+�0o+-,/BwC!;>=GC¢+-D5+-=12t+�D5.GF>+�0�?�;>KL+-=êHwI1B�KL+L~ }+�=�+-+�m#R

C H .�H�{�F!D5+-y�D7+�0o+-=�,tH�,o;>BL=WB�C í ��*},oÁ�yJ+�0/H�=1mu,oÁGy1+�05274�+-{P+�0-8

C H�{@H�=1H�?r+-{P+-=�,�B�CE,oÁ�yJ+�+-=�Kr;>D5BL=�{P+-=G,n0-8

C H�.�=G;NÄ92-H�,o;>BL=vy�D7B¤2t+�mG.�D5+L8

C H�,oÁ�yG;>=�?@H�F>?LBrDo;>,54�{v~

*,+.-0/1-2* 354%687�4%9:4<;>=�?%=�@2A>;BA,C�DFEHGI=KJ86�4<9L?,; MN=KJ86�4O9:P�Q 4<RS4%9 h+3Ä1Dn0A,/=�+-+�mW,5BumG+tÄ1=�+�H .�Hw{�F!,�ÁGy1+3CMBLD/Br.�D í ��*},oÁ�yJ+�m�H�,nHP0A,5D5.12t,5.�D5+LRT Y$UWV9X �GòwVYX�Y$UWV9X[Z]\Gc�^Lc1ñ�_rcT `baWc�d�e X�T `bf UWV9X � � ÃñLZhg��GY�U�V#XT `bi ¤ñW_ÃñLZ �GòwVYXsY�UWV9Xhj �GòwVYX�Y$UWV9XT ��c<k]g � �Y�UWV9X[ZSlYm�c<k:Xs^�nna¬c�Y8o d�c Y � e V�X ��wV c X1n ��òLV�X�Y�U�V#X�pT ��c<k ��òLV�X�Y�U�V#X$XGò�q#,#X d XrZts�ñ �LVGVæñrZba-c�YdVJaLò�YNj �GòwVYXsY�UWV9Xuo�ov�wyx1z]{�|�}$~���wyx1z]��z��<���.z��1�v�wyx1z]�${:�<��w:xHz]��z�%�K�.zW�H�v�wyx1z]{�|�}$~���wyx1z:~�|<���.z��.z���z��<���>zW�1���4�+ \�c�^Lc1ñW_Lc í ��*},�ÁGy1+�;Q0/=�BL,�D5+�H�FNF>ÁvH�,oÁ�yJ+LRE;>,�;Q0�,54�+�;>=G;>,o;QH�FEKsH�F>.�+�B�C'C¢D5+�0A4 í ��*},oÁ�yJ+�KsHwDo;QH�IGF>+�0-~ h+O�;NFNF�2tBL=10�;)mG+-DPHL0�HwI�=�BLD5{@H�FzHW0<;>,5.1H�,A;ÈBr=hO/4�+-D5+ \Gc�^Lc1ñ�_rc Hwy�y1+�H�Dn0�;>=ýyGFQHL2t+PB�C/HWD5+-?L.GFQH�D í ��*½,oÁGy1+L~�j<=0o.1274ê0<;>,5.1Hw,o;>BL=10-8�O�+�O�;NFNF�DtH�;Q0o+�,54�+3CMB�FNFÈB�O�;>=�?u+t�:2t+-y�,A;ÈBr=!RT Xs^%q�X�V�Y9a�ñ�c f UWV!a-c��$� c �ôñrZbò�Y #a¬c�� o$o������z�x����$����vKw:x.�������%�����z��%�K�.z��1�

Page 105: Functional programming using Caml Light Michel Mauny January 1995

���:� �E �����'�z� �������!�¤�3����� ���ù������ ��3�����E�½����z������ �����³����z���������3���L���

��Á�yJ+�K�H�Do;QH�IGF>+�0 HwD5+�H�FNF>B�2-H�,5+�mWIGÁu,54�+ c#Xy_%X:g � �Y�UWV9X CM.�=12t,o;>BL=!8#H�=1mu,54�+t;>D3?�F>BLI1H�F�2tBL.�=G,5+-DU|�H�F>B¤2-H�FED5+tCM+-D�+-=12t+ � ;)0�D5+�0o+-,/IGÁ JXGò�X�Y<X:g��GY$UWV#X�ò ~T V�X�Y�c9X:_<X:g��GY$UWV#X�� JX�òGXsY%X:g � �Y�UWV9XGòOZT�� j��:X�c#X���Y9a¬c�� ��cYk JX�òGX�Y�Y#a-c�� c c�^rc:ñW_Lc#òhj��T V�X�Y�qLñ c c¤YJX Z JXsZ�T a-c � Z c c,qsY#a�ñ�c � ����SqLñ c c�Y1X n Z� qwñ c c�YJX����� oT lYm�c<k:Xs^SZ� �qLñ c c�Y1X o���LV c X[Z]\�c�^rc:ñW_Lc<p����T � Z c c,qsY#a�ñ�c � ����SqLñ c c�Y1X n Z���� o�o�.z��W~���{:�<��wyx1z��5�� �$�����S��{y�%�w:x1z����Y�����,z:|<z��W~��${:�<��w:xHz�|�� ��� �$�����h�� �������Y����

*,+.-0/1-! " 4<9�=�7�#8P�=�@%$.4&#8; @!'�P�?<=�@ A ;�A,C DFEHGu=KJ86 4<9 h+�O�;NFpF1=�+-+�m·,5B �-0o4�BrD5,5+-= ��,�ÁGy1+�KsH�DA;)HwIGFÈ+�0¬Rz0<;>=12t+�,54�+-Á�H�D7+E;>=1mr;>D5+�2t,o;>BL=10E,7B í ��*u,oÁ�yJ+�0-8�O�+z=�+-+�mU,5B�C¢B�FNF>B�O,54�+�0o+�;È=1mr;>D5+�2t,A;ÈBr=10�;>=PBLDnmG+-D�,5B�BLI�,nH�;>=�,54�+/,oÁGy1+/,741H�,E,54�+-Á�D5+-y�D5+�0o+-=G,�~1��BrDE,54�+/05H�6L+/BwC9+)( 27;>+-=12tÁL8GO�+/,nH�6L+HLmGK�H�=�,tH�?L+�B�C�,74G;)0�BLyJ+-DnH�,o;>BL=W,5B�D5+-yGFQHL2t+�{�.GF>,o;>yGF>+�;>=1mr;>D5+�2t,o;>BL=10�I�ÁW0<;>=�?�F>+�;>=1mr;>D5+�2t,o;>BL=10·|�0o4�BLD7,5+-=G;>=�? � ~T V�X�Y 1X�qÃò',:ñ �YJX�côYSZT d ��Y<q',ÃYS_#a�YD,T f U�V#X � � Sl�m�cYk:X�^�ZYX.o ��wV c X�Z�\�c�^rc:ñW_Lc<p���½YT `bf U�V#X � � � lYm�c<k:Xs^�Z�X�oT ��LV c X�Z f U�V#X��� lYm�c<k�X�^�Z�X�oT � �LV c X�Z:\Gc�^rc1ñ�_rcYp ��ò½Y�g�p��*+��Y$gT `bf U�V#X � � � lYm�c<k:Xs^�Z�X�o � �LV c X�Z f UWV9X � � Y�g��p �Gò Y$g-,��T �� Y$g-, 5 ��wV c X�.� Y$g�� 5 ��wV c X.oxò',:ñ �YJX�cæYT `bf U�V#X � � Sl�m�cYk:X�^�ZYX.o ��wV c X�ZrY0/�p��� Y1/T ` \Gc�^rc1ñ�_rc2+� ��aLòGX ��f U�V!a¬c���� c �43wò',:ñ �YJX�c53��T ` Y1/&�� Y1/�o$o|�� �:�<��z �6� {�|�}$~���wyx1z����S{W|$}�~���w:xHz*����Y���7�í = í ��*},oÁ�yJ+�+-D5D5BrD�O�;pFNFEI1+UD5+-y�D5+�0o+-=G,5+�mWIGÁu,54�+3C¢BwFpF>B�O�;>=�?u+t�:2t+-y�,o;>BL=!RT Xs^%q�X�V�Y9a�ñ�c f UWV#XwðGV �Gò',eñrZ �GòwVYX�Y$UWV9X]j �GòwVYXsY�UWV9X�o$o������z�x����$����vKw:xHz�8W}�{W|����z��%�K�.z��1� h+3O�;NFNFé=�+-+�m�.�=G;NÄ92-H�,o;>BL=lBL= í ��*v,oÁGy1+�0�O�;>,54xÊ#� �#�GÐ�� �:9�Î �:;�~E��4�+/CMB�FNF>B�O�;>=�?�CM.�=12t,o;>BL=u;>{PyGF>+-{P+-=G,n0�B¤2-2t.�D 274�+�256#RT V�X�YÃñ�q�q c Jò lYm�cYk:Xs^�Zwc o � �LV c X�Z�X�p[ZT V�X�Y 1X�q ñ�q�q 1X�q Z�Z c c,qsY#asñwcT f U�V#X��� �lYm�c<k:Xs^�Z d o � �LV c X�Z�X�p<�� � cYZ d �T `baWc�dYe X +�½Z�wV:òGXT `bi �ñ�_ � Y7�7��Y-,��<�� � ñYq�q�JX$qýY7��� ñ � ñ�q�q�JX�q¿Y-,=�T ` \Gc�^rc:ñW_rc4�� ��arò�X � f UWVéa¬c��$� c ��3�ñ�q�q c Jò>3��T a-cdñYq$q JX$qT o$o���$�����Y|?� ��{y�%�w:x1z����h{�|�}�~���wyx1z����A@$����}��B���Y����

Page 106: Functional programming using Caml Light Michel Mauny January 1995

���������ý�� ���@���e����z�����������3���L���#�z� �����

��4�+/.�=G;NÄ92-H�,A;ÈBr=PCM.�=12t,o;>BL=!R';>{PyGF>+-{P+-=G,n0�mG+�0o,5D5.12t,A;ÈKr+/.�=G;NÄ92-H�,o;>BL=!~�jk=10o,5+�Hrm�B�C9D7+-,5.�D5=G;>=�?�,54�+/{PB�0A,�?L+-=�+-DtH�F.�=G;NÄ1+-D�8�;>,WD5+-,5.�D5=10u,54�+x.�=G;NÄ92-H�=1meB�C�,oO�B¿,oÁGy1+�0�|k,54�+t;>DW{PB�0o,u?L+-=�+-DnHsF�2tBL{P{PBL= ;>=10o,nH�=12t+ � ~ ��4�+x,�O�BH�D5?r.�{P+-=�,t0�H�D5+�y�4�Á�0<;Q2-H�FNF>Á¿{�B¤mr;NÄ1+�m%;È=ýBLDnmG+-DU,5BWD5+-y�D5+�0A+-=�,U,54�+P05H�{P+P,oÁGy1+L~u��4�+P.�=G;NÄ92-H�,o;>BL=}C¢.�=12t,A;ÈBr=O�;NFNFùmG+-,7+�2t,/,oÁ�yJ+�27F)Hr0o4�+�0-~T V�X�Y 1X�q c céa�Z$U � Y � c � �oY � c ,=� ZT d ��Y%q#, � ò#,1ñ GYJX�cÃY� c � �xò',:ñ GY1X�cÃY � c ,��T _9a�YD, � j½Y$UWV#X[g � #a � e V:Xýc ��c<k[Y�U�V#X�g � 9a � e V:X d j��T � f U�V#X��� � l�m�c<k�X�^�Zwc�o � �LV c X�Z:\Gc�^rc1ñ�_rcYp ��ò�Y$g���� �Gò Y����5�T � f U�V#X��� � l�m�c<k�X�^�Z d o � �LV c X�Z:\Gc�^rc1ñ�_rcYp ��ò�Y$g-,=� �Gò Y-,=�T ��da�Z[c2.+� d Y�,#X�côY�g�� 5 � �LV c X�.� Y-,T `<� j½Y$UWV#X Y7� ��cYkôY$UWV9X�g��#a � e V�Xhj-�T Y7�7� ��f UWV9X � � � lYm�cYk:Xs^�ZYX.o � �LV c X�Z:\Gc�^Lc1ñ�_rc<p ��ò½Y�g � �Gò½Y�,��T ��da�Z�c1ñLY � ñ�q�q c Jò Y�g[Y7���½YD,9X�cÃY$g 5 � �LV c X�.+�Y7�T XwV:òGX ��aLòGX ��f U�V#XLð�V ��ò', � Y��7��Y-,=���T `<� j½Y$UWV#X[g � #a � e V:X ��c<k�Y$UWV#X Y-,Nj-�T � f U�V#X��� � lYm�c<k�X�^�Z�X�o ��LV c X�Z�\Gc�^rc:ñW_rcYp ��ò�Y$g � ��ò Y������WY-,T ��da�Z�c1ñLY � ñ�q�q c Jò Y�g[Y�,��½YD,9X�cÃY$g 5 � �LV c X�.+�Y�,T XwV:òGX ��aLòGX ��f U�V#XLð�V ��ò', � Y��7��Y-,=���T `baWc�d�e X�1� a�c�dYe X +� � �T `bi ¤ñW_ � Y�� �oY�,��5� � i ¤ñW_ � Y1/ �7�oY0/ ,=� ��ò½Y �T �� c c!a�Z$U � Y��7��Y1/ ���>o c céa�Z$U � Y�, ��Y1/ ,=�T `<� Y�� �oY�,��*+� �¤aròGX ��f UWV9XLð�V �Gò#, � Y�� �oY-,=��� o�o��� �:��w � {W|�}$~��w:x1z��h{W|$}�~��w:xHz����h��� �����B��Y���7�

*,+.-0/1- / 354%687�4%9:4<;>=�?%=�@2A>;BA,C =KJ868@ ;��[4%;�$8@ 7�A ; RS4<;>=�9 h+�.10o+ �GòLV�X�Y$UWV#X$XGò$q',#X d X VJaLò�Y HL0�,�ÁGyG;>=�?@+-=GKr;ÈD7BL=�{P+-=G,n0-8�H�=1mWO�+3O�;NFNF�.10o+�,74�+�+-=12tB�mr;È=�?uB�CEKsH�DA;)HwIGFÈ+�0HL0�;>=1mr;Q2t+�0�;>=�,7BP,54�+�+-=GKr;ÈD7BL=�{P+-=G,�~

��4�+P;>=G;>,o;QH�F�+-=�Kr;>D5BL=�{P+-=G,�;Q0PH�FN;)0A,PB�C�,�ÁGy1+�0 � a�c�dYe X +� � aWc�dYe X +� aWc�dYe X� �+� 8'O/4G;Q254[H�D5+u,54�+,oÁ�yJ+�0�B�CE,54�+ í ��*hy�Do;>{�;>,o;>KL+UCM.�=12t,o;>BL=10-~T V�X�Yba-c!a�Y%X�Y$UWVéa¬c��<XGX�c�g ZT d ��V � Z c c�q�Y#asñwcdò���T sGñ �wVGV ���� � i �ñ�_ � a�c�d�e X 0�T i �ñ�_ � a�c�d�e X 0� a�c�dYe X �����+�T a¬céa�Y<XGX�c�g o$o��4�+3?�F>BLI1H�F!,oÁ�yG;>=�?�+-=GKL;>D5BL=�{�+-=�,�;Q0ù;>=G;>,o;QH�FN;Èè-+�ml,5B�,54�+3;>=G;>,o;QH�F�,oÁGyG;>=�?�+-=GKr;ÈD7BL=�{P+-=G,�8�H�=1muO�;NFNFéIJ+�.�y9m�H�,7+�mO�;>,54l,54�+�,oÁ�yJ+�B�C�+�Hr254 í ��*¿mG+�27FQH�DtH�,o;>BL=!8#H�C¢,7+-D�,74�+-Á H�D7+�,�ÁGy1+Kk274�+�276L+�m#~T V�X�Yh�¤VGñ e �LV�X�Y$UWV!a-c��<XGX�c�ghZ 1X�Zba-c!a�Y<X�Y$UWV!a-c��<XGX�c�g o$o

*,+.-0/1-� �17�A R =KJ86 4<9b=�A�=KJ86�4 9:P�Q84%RS4<9� �� 4<; 4<7�?�� @���?%=�@2A ;jk=WBrDnmG+-D�,5BU;È{�yGFÈ+-{�+-=�,3?L+-=�+-DnH�FN;>è�H�,o;>BL=!8:O�+3O�;NFNF�=�+-+�mv0ABL{P+�C¢.�=12t,o;>BL=10�2tB�FNFÈ+�2t,A;È=�?u,oÁ�yJ+�0�KsHwDo;QH�IGF>+�0�B¤2-2t.�D Do;>=�?�;È= í ��*%,�ÁGy1+�0¬~

��4�+3C¢B�FNF>B�O�;>=�?PCM.�=12t,o;>BL=x2tBL{Py�.�,5+�0�,74�+�FN;Q0o, BwC�,oÁ�yJ+�KsHwDo;QH�IGF>+�0/B�C';>,n0/H�D7?L.�{P+-=G,�~

Page 107: Functional programming using Caml Light Michel Mauny January 1995

����� �E �����'�z� ����� �!�¤�3����� ���ù������ ��3�����E�½����z������ �����³����z���������3���L���

T V�X�Yhg � 1ò�XLñLZ%XsY�UWV9X½Y� c ZT V:XsY JX$q]g � 1ò�gJò Z�Z c c,qsY#asñwcT aWc�d�e X���[gJòT `bf UWV9X � � Sl�m�c<k�X�^�Zwc�o���wV c X�Z�\�c�^Lc1ñW_Lc<pT ��ôa�Z d X d cBgJò½Y�,#X�cBg1ò[XLV�òGX½c�n$n gJòT `bf UWV9X � � Sl�m�c<k�X�^�ZYX�o���wV c X�Z�Y�p4+�[g� 1ò�gJò YT `bi ¤ñW_ � Y�� �oY�,��<��[g��Jò � g� 1ò�gJò Y7���ýY�,T ` \Gc�^Lc1ñ�_rc2+� �¤aròGX ��f UWVéa¬c���� c �23Kg��Jò�XwñrZ<X�Y�U�V#X>3��T a-cSg��Jò ��� Y � cT o$o��{y�Y|$~��:��~��w:x1z�� {W|$}�~��w:xHz����h�K� �h}���|����B��Y���7�

��4�+ c c�^Lc1ñW_Lc#ò$XLñrZ<X�Y$UWV#X ��e g1�oY � H�y�yGFN;Q2-H�,o;>BL=hD7+-,5.�D5=10�,54�+�FN;)0A,�B�CzKsH�DA;)HwIGFÈ+�03B�2-2t.�D5Do;>=�?u;>= Y ,741H�, mGBu=�BL,H�y�yJ+�H�D�;>= e g ~���4�+ ò c�e Y �$q�Y CM.�=12t,o;>BL=vD7+-,5.�D5=10�,54�+�mr;Nüé+-D7+-=12t+�B�CE,oO�BUFN;Q0o,n0-~

T V�X�Y c c�^Lc1ñW_Lc#ò$XLñrZ<X�Y$UWV#X ��e g1��Y ��ZT ò c�e Y �$q�Y � g��Jò�XwñrZ<X�Y�U�V#X¿Y � e g8o�o�����W� ������|�~��:�Y~���wyx1z�� ��� � }��W|�� �S{W|�}$~��w:x1z����h�K� �h}���|����B�������7�

h+3=�+-+�mP,7B�2tBL{Py�.�,7+ ,54�+�Fp;Q0o,�B�C!.�=�6�=�B�O/=10�B�C�H�,oÁGy1+3+-=�Kr;>D5BL=�{P+-=G,ECMBLD�,54�+ ?r+-=�+-DnH�FN;>è�H�,o;>BL=Wy�D5B�2t+�050�|k.�=�6G=�BsO�=10zIJ+tF>BL=�?�;>=�?P,5B�,541H�,ùFN;)0A, 2-H�=�=�BL,�I1+�2tBr{P+�?L+-=�+-Do;Q2 � ~z��4�+Ý0o+-,�B�C'.�=�6�=�B�O/=10�B�C�H�,oÁ�yJ+�+-=�Kr;>D5BL=�{P+-=G,;Q0/,74�+�.�=G;ÈBr=vB�CE,54�+�.�=�6G=�BsO�=10/B�C'+�HL254l,oÁ�yJ+L~z��4�+ Z�V ��Y CM.�=12t,o;>BL=��9H�,5,5+-=10/H�FN;Q0o,3B�C�FN;Q0o,n0¬~

T V�X�Y[Z¤V �sYNZda�Y%XwVJaLò�Y � V JXsZ#a�^���� �� o�o�Y}�{�� ����~�{]}��W|��h}��W|�� �����~�{]}���|����B�������7�T V�X�Y c c�^Lc1ñW_Lc#ò$XLñrZ<X�Y$UWV#X$XGX�c�g[X�c�gBZT Z¤V �sY �2d �V � Z c c,qsY#asñwcBs�ñ �wVGV � ��g0�oY � +� c c�^rc1ñ�_rc9ò�XLñLZ%XsY�UWV9X � ��g0�oY �+��X�c�g � o�o�����W� ������|�~��:�Y~���wyx1z�~Yz � ��� {�|�}$~���wyx1z:~�|<���.z��.z }��W|������S�K� �]}��W|������Y����

��4�+3?L+-=�+-DnH�FN;>è�H�,o;>BL=uB�C�H�,oÁGy1+�;Q0zD7+tF)Hw,o;>KL+/,5B�H�,oÁ�yG;>=�?�+-=GKL;>D5BL=�{�+-=�,�~E��4�+ d �y^JX$XGòGXsY C¢.�=12t,o;>BL=u+tFN;>{�;>=1H�,5+�0mG.�yGFN;Q2-H�,5+�0�;>=W;>,n0�FN;Q0o,�H�D5?L.�{�+-=�,�~

T V�X�Y 1X�q d �y^JX$XGòGXsYSZ�Z c c,qsY#asñwcT �� +� ��T ` ^ n�n�V4+�Ãa�Z d X d ^dV[YD,9X�c d �:^JX$XGò�X�YÃVXLV�òGX½^ n$n d �y^JX�X�òGXsYÃV o$o� {� z:~�|<z�� ����{ }��W|������� {h}��W|������Y����T V�X�Yh�1X�c9X �wVJaLòGX�XsY�U�V#X � �� d�d ���WY � c �rZT V�X�Yh�1X�c�g � 1ò[ZT d �y^JX$XGòGXsY � ò c�e Y �$q�Y � g � Jò$XLñLZ%X�Y$UWV9XýY � c �T ��c c�^rc:ñW_Lc#ò�XwñrZ<X�Y�U�V#X$XGX�c�g��� d�d �����T a-cBsGñ �LV�V � �JX�c�g��Jò��@Y� c �T o$o�.z��.z�%{W}��W|Yz�~��w:xHz � {W|$}�~���w:xHz�~$|<� �>z �>zF}��W|�� �h{W|$}�~��w:xHz����S{W|$}�~���w:xHz�~$|<� �>z �>z ����Y����

Page 108: Functional programming using Caml Light Michel Mauny January 1995

���������ý�� ���@���e����z�����������3���L���#�z� �����

*,+.-0/1- + �17�A R =KJ86 4O9:P�Q 4<RS4%9'=�A]=KJ86�4<9� �� 4<; 4<7�@ P @2; 9�=�?,;>=�@2?%=�@2A ;��4�+�C¢B�FNF>B�O�;>=�?�CM.�=12t,o;>BL=xD5+-,5.�D5=10/H·?L+-=�+-Do;Q23;>=10o,nHw=12t+�B�C';>,n0�,oÁ�yJ+�05274�+-{P+�H�D7?L.�{P+-=G,�~ í ?L+-=�+-Do;Q23;>=10o,nHw=12t+;Q0/BrI�,nH�;>=�+�mWIGÁ@D7+-yGF)Hr27;È=�?WH�FNF�?L+-=�+-DA;)2U,oÁGy1+�KsHwDo;QH�IGF>+�0/IGÁ@=�+-O.�=�6G=�BsO�=10-R

T V�X�Yh�1X�c�X�a¬c9ò�Y ��c,q�X � s�ñ �LVGV � �$g1�oY � c ��� ZT � j��JX �Gò�òLñ�q�a �sYJX �½c#X:_ c c�^rc:ñW_Lc[Y¤ñÙX ��q#,S�JX�c#X 9aWq�g � 9a � e V:Xhj��T V�X�Y c c�^rc:ñW_Lc#ò[Z d �V � Z c c�q�Y#asñwc[c4��½c � f U�V#X��� � c9X:_%Xyg��GY�U�V#X � ���+� �$g a-cT V�X�Y 1X�q��9a¬c#òsY��c,qGX ZôZ c c�q�Y#asñwcT � f UWV9X ���SlYm�c<k�X�^�Z�c�o���wV c X�Z�\�c�^rc:ñW_Lc<p �Gò Y �*+�T � Y $U �Gò�òLñ�q c c c�^Lc1ñ�_rc#òT _#a�YD, a ñrY<X�Z�ñ c cYkA�� Y �T `bf U�V#X��� lYm�cYk:Xs^�ZYX.o � �LV c X�Z Y�p��[�#a-c#òsY��c�qGX¿YT `baWc�dYe X +� aWc�dYe X�T `bi �ñ�_ � Y7�7��Y-,��<�� i �ñ�_ � �#a¬c9ò�Y ��c,q�XhY�� � �9a¬c9ò�Y��c,q�XýY�,��T ` \Gc�^rc:ñW_rc4�� ��arò�X � f UWVéa¬c��$� c ��3��1X�c,X¤a¬c9ò�Y��c,q�X=3��T a-cS�#a-c#ò�Y ��c�qGX½Y � cT o$o�.z��,~����,|���{K�.��z�� {W|$}�~��w:xHz�~�|Y� �>z �.z���� {W|�}$~��w:x1z����Y����

*,+.-0/1-�� � Q 4�D E1GI=KJ86�4O9�J8;>=�Q84<9:@��4<7��4�+�,oÁGy1+�0oÁG=�,74�+�0<;>è-+-D/;Q0�,54�+ �GòLV�X�Y$UWV!a-c��<XGX�^�V C¢.�=12t,o;>BL=!~��zHL274WB�C!;>,n0�{@H�,n274W2-HL0o+�0/2tBLD7D5+�0oy1Br=1m�0�,5BPH�=;>=GC¢+-D7+-=12t+�D7.GFÈ+U?�;>KL+-=êHwI1B�KL+L~T V�X�Y 1X�q �GòwVYXsY�UWVéa¬c��%XGXs^WV ]� � d�d �[ZT V�X�Y 1X�q½Y$UWV#X$X 1X�q[Z[Z c c,qsY#a�ñ�cT ð�ñwc#òsYNX��� aWc�dYe X T ` � � �c���T V:XsYò�a� d �[ZT Y �U[c�Y�,[cB�� d$d �T _9a�YD, s ��a�V c 1XhX��� ��arò�X � f UWVéa¬c��$� c ��3 \�c e ñ c cYk 3��T a¬c �JX�c�X�a-c#ò�Y ��c�qGX[ò¤a�� d �T ` ð�ñwc<k � X=� �tX , �tX����*+�T c céa�Z$U � a�c�d�e X 0�uY$UWV9X�X 1X�q[X>��� oT V:XsY[Y-,SZ[Y�U�V#X$X JX$q�X , ��c<k Y�SZ[Y�UWV9X�X�JX�q X�T a¬c c c!a�Z�U � Y-, �WY�=�>oWY��T `bi V�V �+� i�e ò � ^1�nX�,�� �Gò Z �5�xX>���*+� � j ��� f q �Gò�Xhj-�T V:XsY[Y���Z[Y�U�V#X$X JX$q�X>�[a¬cT V�X�Ybò�a� d � Z �1X�c9X �wVJaLòGX�XsY�U�V#X � �� d�d ���oY7���T a¬c �GòLV�X�Y$UWV!a-c��<XGX�^�V � ò¤a�� d �1n$n �� d�d �-�½X�,T `bi V�V � X=� �tX�,=�*��T V:XsY c Z f UWV9X � � � c#Xy_%X:g � �Y�UWV9X � ���T a¬c c c!a�Z�U � Y�U�V#X$X JX$q�X>�7� i ¤ñW_ � Y�U�V#X$X JX$q�X , � c ��� o cT `bi�e ò � ^1�nX-�*+�T V:XsY c Z f UWV9X � � � c#Xy_%X:g � �Y�UWV9X � ���½a¬c

Page 109: Functional programming using Caml Light Michel Mauny January 1995

����� �E �����'�z� ����� �!�¤�3����� ���ù������ ��3�����E�½����z������ �����³����z���������3���L���

T V:XsYò ZSsGñ �LV�V � ��� � c �T a¬c i ¤ñW_ ��c � �GòwVYX�Y$UWVéa¬c��<XGXs^WV � ò1n$n �� d�d �-��X��T a-cÃY�U�V#X�X�JX$q�o�o{W|$}�~���w:x.���$�,~<z��x���� {W|$}�~���w:xHz�~$|<� �>z �>zF}��W|��B���h{�|�}4���h{�|�}$~���wyx1z*�B��Y���7�

*,+.-0/1-�� � J86 @2; ���8=�7�?,6 68@2; �]=KJ86�4OP � ?,9yQ 4<9L?,;8M�6 7�@2;>=�@2; � DFE1G =KJ86 4<9î�BsOU8�O�+zmG+tÄ1=�+/0oBL{P+�H�.G�G;pFN;QH�D5Á�C¢.�=12t,A;ÈBr=10�;È=UBLDnmG+-D',5B/I�.G;NFQmPH �t?rB�B�m� F>B�BL6r;>=�? �3,oÁ�yJ+�0oÁG=G,54�+�0<;>è-+-D�~1��;>Dn0o,!B�CH�FNFk8�H3y�Do;>=G,o;>=�?�D5BL.�,o;>=�+�C¢BrD í ��*�,�ÁGy1+/05274�+-{P+�0�;)0EmG+tÄ1=�+�m�|k.10<;>=�?�H�C¢.�=12t,o;>BL= Y$g��%X�c � d X O�4G;)274@2tBL{�y�.�,5+�0HPmG+�2t+-=G, =1Hw{P+3C¢BrD�,oÁGy1+UKsH�Do;QH�IGF>+�0 � ~T V�X�Y[Y$g��%X�c � d Xýc ZT � j ð�ñ d V c Y1XGò �½c � d XA37/ �>37� 5 525 Z�ñ [Y�U�V#X[g��#a � e V�XGò�� j��T � j��9a�g1X�c ��c´a-c�Y1X:�JX��c JXV JX�òGX�c�Y#a-c�� YD,9X V1ñ�ò�a�Y9a�ñ�c j��T � j ñLZÃYD,#X Y�UWV9X[g� 9a � e V:Xæa¬cdY�,#X V1arò�YdñLZh�JX�c#X 9aWq j��T � j½Y$UWV9X]g � 9a � e V:X�ò j��T V:XsY JX$q c � d X�XLñLZ�cBZT V�X�Y�� � SZ � c��,���5� � c d ñ$kA,���[a-cT V�X�Ybò[Z d �y^JX$XGò�Y #a-c���� � q', � %XwñrZ<X�a¬c¤Y � � �� ��� a¬cT a�Z���Z�� YD,#X�cåò[XLV�òGX � c � d X$XLñLZ��=���ròT a¬c 3 / 3�� � c � d X�XLñLZ�c��T o$o���${:��~�� {K�.z � ��� �B���]|��y�%���$���B�����������4�+-=xH�y�Do;>=�,A;È=�?�CM.�=12t,o;>BL=WCMBLD�,oÁ�yJ+�05274�+-{P+�0-~T V�X�Y]V #a-c�Y%XsY�U�V#X�X�ò�q#,#X d X � sGñ �LV�V � ��g1��Y �+� ZT � j�� #a-c�YJò ��Y$UWV9X[ò�q#,#X d X 5 j-�T � j[s ��asV:ò�_�,#X�c a�YX�c�qLñ c c�Y1X Jò ��c c c�^rc:ñW_Lc�j-�T V:XsY�c � d XGò ZeV�X�Y JX$qýc � d X�ò�XLñLZSZ�Z c c,qsY#asñwcT � c � ��� �*+� ��T ` � c � � g�� n�n �$g �+� +� � Y�g � %X�c � d Xýc7��n�n � c � d X�ò�XwñrZ � c=� �7� �$g �+�T a-cÃc � d XGò$XLñrZ � � ���$g �[a-cT V:XsY[Y�g � %X�c � d XGò ZtqLñ dYe a-c#X � JXygt�$g1�uc � d XGò-�æa¬cT V:XsY JX$q V #a-c�Y%X�JX$q�Z[Z c c,qsY#a�ñ�cT f UWV#X�����lYm�c<k�X�^�Z�c�o���wV c X�Z�\�c�^rc:ñW_Lc<p���T V�X�Y�c � d X[Z[Y �U ��òGòLñ�qýcÃY$g� <X�c � d X�òT _#a�Y�, a ñLY%XsZ�ñ c c<kA+�T ��aLòGX ��f U�V!a¬c���� c ��3 a ñwc �JX�c9X 9aWq�g � #a � e V:X=3��T a-chV 9a¬c¤Y%XGòsY 9a¬c��½c � d XT `bf UWV#X�����lYm�c<k�X�^�Z�X�o ��LV c X�ZrY�p*+� V 9a¬c¤Y%X 1X�q½YT `ba�c�dYe X +��V #a-c�Y<XGò�Y #a-c��43 aWc�dYe X �3T `bi �ñ�_ � Y��7��Y-,=� +�T V #a-c�Y<XGò�Y #a-c���3 � 3 o V #a-c�Y<X JX$q½Y��,oT V #a-c�Y<XGò�Y #a-c���3 +�43 obV #a¬c¤Y%X�JX�q Y-, oT V #a-c�Y<XGò�Y #a-c���3��-3

Page 110: Functional programming using Caml Light Michel Mauny January 1995

���������ý�� ���@���e����z�����������3���L���#�z� �����

T ` \�c�^rc:ñW_Lc2�� �¤arò�X � f UWV!a-c��$� c �43 V #a-c�Y%XsY�U�V#X�X�ò�q#,#X d X=3��T a¬chV #a-c�Y%X�JX$q½YT o$ovW�)x>}YzW��z:}S����x>��� �� ��� �����)�������<� ���������)���${:�Y~� {K�.z ��� ����� � {��.z:|�~��:��� ��������<� ���� � ��W{y��� ����� � ���>z]��{y�%�${�@W}Yz�%�h|���{:�<�W|��$���K� {�� �Kx$x1z���W{�|<z }YzW����z��N�K����� ��| x�{$����z���� �x,�<��� �W~��w:xHz�~�|Y� �>z �.z�� {�|�}�~���wyx1z�~$|<���.z �>z*���h��� �$���B���������î�BsOU8#,54�+P{@H�;>=lCM.�=12t,o;>BL=¿O�4G;)274hD5+�0A+-,n03,54�+P,oÁGy1+�KsH�DA;)HwIGFÈ+�0�2tBL.�=G,5+-D�8'2-H�FNFQ0�,54�+P,oÁGy1+P0oÁG=�,74�+�0<;>è-+-D�8',5DnH�y10í ��*x,oÁ�yJ+Ý27FQHL0o4�+�0�H�=1mPy�DA;È=G,n0�,74�+ D5+�0A.GFÈ,A;È=�?�,�ÁGy1+�0¬~ í ,z,74�+�+-=1m#8�,74�+ ?�F>BLI1HsFé+-=GKr;ÈD7BL=�{P+-=G,n0/H�D5+�.�y9m�H�,5+�m#~T V�X�Y[Y$UWVéa¬c�� ��� X$qLV � ò��nX-�+��ZT JX�òGX�Y<X:g � GY$UWV9XGò � �>oT V:XsY[Y� c Z � j f � �%m a �tj-�T Y $U ��òLV�X�Y�U�V!a-c��%X�X�^�V �¤VGñ e �LV�X�Y$UWV!a-c��<XGX�c�geXT _#a�YD, f UWV#XwðGV �Gò', � Y7�7�oY�,��<�� � j i Y$UWVéa¬c��dX ¤ñ Nj��T V:X�YSg � Jò�ZWg � Jò$XLñLZ%X�Y$UWV9X � Y7��� �Wg���ò�XLñLZ%XsY�U:V#X � Y-,=�ýa-cT V #a-c�Y<XGò�Y #a-c���3 i� � f UWV9XhqLV �Gò#, e XsY�_JX�X�c 3,oT V #a-c�Y<X�Y�U�V#X$XGò�q#,#X d X � sGñ �wVGV � g��Jò���Y������>oT V #a-c�Y<XGò�Y #a-c���3 ��c<k�3 oT V #a-c�Y<X�Y�U�V#X$XGò�q#,#X d X � sGñ �wVGV � g��Jò���Y-,=���>oT V #a-c�Y<X�c#Xy_�V1a¬c#X � � oT ��aLòGX � s ��asV c 1X�3 i� �eY$UWVéa¬c��73�� a¬cT V:XsYò�a� d � Z �1X�c9X �wVJaLòGX�XsY�U�V#X � �¤VGñ e �LV�X�Y$UWV!a-c��<XGX�c�g1��Y� c �ýa-cT � j \ � �$i�f m a � � a �<m���� a � a�f�� j��T ��V�ñ e �wVYX�X�c�g�n�ZòHn�n� 2��V�ñ e �wVYX�X�c�g8oT ��V�ñ e �wVYXsY�UWVéa¬c��%XGX�c�g n ZÙò¤a�� d �1n$n� 2��VGñ e �wVYX�Y$UWVéa¬c��<XGX�c�g1oT JX�òGX�Y<X:g � GY$UWV9XGò � �>oT � j����%m a�f m a ��� � � \� f m a � f � ���Nj��T V 9a¬c�Y<XGòsY #a-c��43 i�� � f UWV#XæñLZ�3 oT V 9a¬c�Y<XGòsY #a-c��Ãò�oT V 9a¬c�Y<XGòsY #a-c��43[aròB3,oT V 9a¬c�Y<X�Y$UWV#X$XGò$q',#X d X½ò¤a�� d ��obV #a-c�Y%X�c#Xy_�VJa-c#X � �>o$o��wyx��K��� � ���)x>~�{W|�}A���]�� ��������Y����

*,+.-0/1-"! � J86 @2; � DFE1G 687�A � 7�?,RS9 h+�D5+t;>=G;>,o;QH�FN;>è-+@,74�+�y1H�Dn0<;>=�?P+-=GKL;>D5Br=�{P+-=�,�RT �¤VGñ e �LV�XGX�c�g�n ZJa-c!a�Y<XGX�c�g o � �>o$o� � ��� �����#�$�

î�BsOU8LF>+-,3.10�D5.�=x0oBL{P+�+t�1H�{PyGF>+�0�,54�D7BL.�?L4W,54�+ í ��*x,oÁGy1+�254�+�276L+-D�RT Y$UWVéa¬c�� � V ��Jò�X�X�Y¤ñ�V 3�V�X�YÃ^ e X4�,o 3�� o�o% &��v�wyx1zh�:� � ��|('%���7@�z�

Page 111: Functional programming using Caml Light Michel Mauny January 1995

�L��� �E �����'�z� ����� �!�¤�3����� ���ù������ ��3�����E�½����z������ �����³����z���������3���L���

� � ��� �����#�$�

T Y$UWVéa¬c�� � V ��Jò�X�X�Y¤ñ�V 3 ��, ������� ^ 5 ^ � �=�>o 3��>o$o% &��v�wyx1zh�:�B���S�W|('%���@�z��� � ��� �����#�$�

T Y$UWVéa¬c�� � V ��Jò�X�X�Y¤ñ�V 3ra�Z���2�ýY�,#X�c �æXwV:ò�X��[Z#a>o 3�� o�o% &��v�wyx1zh�:�B���S�W|('%���@�z��� � ��� �����#�$�

T Y$UWVéa¬c�� � V ��Jò�X�X�Y¤ñ�V 3�V�X�Yåa:k e X ��� ^ 5 ^8o 3�� o�o% &��v�wyx1zh�:�B���S�W| � ��{������{ �� � ��� �����#�$�

T Y$UWVéa¬c�� � V ��Jò�X�X�Y¤ñ�V 3 � � ayk2��� � a:kaykA,=�>o 3��>o$o% &��v�wyx1zh�:�B���S�W|('%���@�z��� � ��� �����#�$�

T Y$UWVéa¬c�� � V ��Jò�X�X�Y¤ñ�V 3�V�X�YÃZ e X ����� ^ 5 ^[^ � ����� ^ 5 ^ �>o 3�� o�o% &��v�wyx1zh�:� � ��| � � { ���� {��� � ��� �����#�$�

T Y$UWVéa¬c�� � V ��Jò�X�X�Y¤ñ�V 3 � ����� ^ 5 ^ � � o 3��>o$o% &��v�wyx1zS��}�{W|��@�z�����z$z � '<���7@�z��B{�� � � � {B��� � {�����>�W{������ �Sz�����z�x����$��� ���<{��W}$����z� %�& N�w:x��K����

*,+.-0/1-�� � J86 @2; � ?,; M�7�4<P-# 7�9:@2A ;��4�+� [Ä���y1B�;>=G,Ý2tBr{�IG;>=1H�,7BLD mGBG+�0�=�BL,/41H�KL+�H�,oÁGy1+3;>=êö�;NF>=�+-D��°0�,oÁ�yJ+�0oÁ¤0A,5+-{vRT Y$UWVéa¬c�� � V ��Jò�X�X�Y¤ñ�VT 3�V:X�YæZ#a�^ e X ��� Z 5 �+����� ^ 5 Z ������� 5 � ^½^ � � ��� ����� ^ 5 Z ������� 5 � ^�^ � � ����� o 3��>o�o% &��v�wyx1zS��}�{W|��@�z�����z$z � ��{h{�� ��� � { ���� @�����>�W{������ �Sz�����z�x����$��� ���<{��W}$����z� %�& N�w:x��K������4G;Q0';Q0�I1+�2-Hw.10o+/O�+/,5D5ÁU,5B�H�y�yGF>Á ^ ,5B3;>,n0o+tFNCA8�H�=1m·,54�+/,oÁ�yJ+/B�C ^ ;Q0ù=�BL,Ey1B�F>ÁG{PBLD5y�4G;Q2�~�jk=�CkHL2t,�8r=�B3Ä��¤yJB�;>=�,2tBL{�IG;>=1H�,5BLD�;Q0�,oÁGy1H�IGF>+P;>= í ��*ù~���4G;)0�;Q0�O�4�ÁhO�+P=�+-+�mýHv0Ay1+�27;QH�F/y�Do;>{�;>,o;>KL+WBLD�0oÁ�=G,nHL2t,A;)2�2tBL=10o,5D5.12t,�;>=BLDnmG+-D�,5B�+t�¤y�D5+�070/D5+�2t.�Dt0<;>KL;>,oÁL~

j C1O�+zO/H�=G,!,5B HL070<;>?L=�,oÁGy1+�0�,5B/D5+�2t.�Dn0�;ÈKr+�y�D7BL?LDnH�{u0-8-O�+z41H�KL+�,5B/y�D5+�mG+tÄ1=�+/,74�+� xÄ���y1B�;>=G,z2tBL{�IG;È=1Hw,5BLD�~jk,t0�,oÁ�yJ+�05254�+-{�+�0o4�BL.GFQm�I1+@4 7 _ |5| 7 g 7 � g 7 � 8�IJ+�2-H�.10o+UO�+�,tH�6L+�Ä��¤yJB�;>=�,n0�B�C'C¢.�=12t,A;ÈBr=10-~T �¤VGñ e �LV�XGX�c�g�n�Z�3¬Z9a�^�3 n�nna¬c!a�Y%X�X�c�g8oT �¤VGñ e �LV�X�Y$UWV!a-c��<XGX�c�g�n ZT � sGñ �LV�V ��� � � �T i �ñW_ � i �ñ�_ ��f UWV9X � � �l�m�cYk:X�^�Z �%o � �LV c X�Z:\Lc�^rc:ñW_Lc<p��T f UWV#X�����lYm�c<k�X�^�Z � o ��LV c X�Z�\Gc�^rc:ñW_�c<p=�5�T f U�V#X��� �lYm�c<k:Xs^�Z � o � �LV c X�Z:\Gc�^rc1ñ�_�c<p��+���T n�nna¬céa�Y%XsY�U�V!a¬c��%X�X�c�g8oT�� �>o$o� � ��� �����#�$�

Page 112: Functional programming using Caml Light Michel Mauny January 1995

����������� ���@���e����z�����������3���L���#�z� �L�L�

h+�2-H�=l=�B�OômG+tÄ1=�+�BL.�D�C H�KLBLDA;È,7+/CM.�=12t,o;>BL=103HL0-RT Y$UWVéa¬c�� � V ��Jò�X�X�Y¤ñ�VT 3�V:XsYeZ ��qsY e X Z#a�^ ����� Z 5 ����� c 5 a�ZNZ�c4��Y�,#X�c��T XwV:òGX j c � Z � ½c����+�T Z9a���� o 3��>o�o% &��v�wyx1zh�:� �%{����S�W|�� '%���7@�z�2��� '%���@�z����� � ��� �����#�$�

T Y$UWVéa¬c�� � V ��Jò�X�X�Y¤ñ�V 3¬Z ��q�Y��1o 3�� o�o% &��v�wyx1zh�:�B���S�W|('%���@�z��� � ��� �����#�$�

T Y$UWVéa¬c�� � V ��Jò�X�X�Y¤ñ�VT 3�V:X�YæZ#a e e X Z#a�^ ����� Z 5 ����� c 5 a�ZSZ�c��ýYD,#X�c �T XLV:ò�XÃa�ZBZ�cB,[YD,9X�c �T XLV�òGX�� � Z � ½c ����� � Z � ýc4,=���T Z#aT Z#a��+�>o 3��>o$o% &��v�wyx1zh�:� �%��@S��|���'<����@�z��2��� '%���7@�z���� � ��� �����#�$�

T Y$UWVéa¬c�� � V ��Jò�X�X�Y¤ñ�V 3¬Z9a e � o 3��>o$o% &��v�wyx1zh�:�B���S�W|('%���@�z��� � ��� �����#�$�

Page 113: Functional programming using Caml Light Michel Mauny January 1995

�L�#� �E �����'�z� �������!�¤�3����� ���ù������ ��3�����E�½����z������ �����³����z���������3���L���

Page 114: Functional programming using Caml Light Michel Mauny January 1995

� ��������� ��

� ��� � ������� � � � � ��� � � �"! #��%$��"&'�� �"&)( ��� * &+� , *

jk=lBLDnmG+-D/,7B�CM.GFNF>Áv,nH�6r+ÝHLmGK�H�=G,nH�?L+�B�CE,54�+�0o,tH�,o;Q23,oÁ�yG;>=�?PB�C í ��*hy�D5Br?LDnH�{@0¬8�O�+�41H�KL+3,5B1R

C +t;È,74�+-DzO/Do;>,5+�H3=�+-O�;>=�,5+-D7y�D5+-,5+-DzO�;È,74�BL.�,z,oÁGy1+/,5+�0A,n0�|�mr; ( 2t.GF>,�8�IJ+�2-H�.10o+3O�+�.10o+�m�y1H�,5,7+-D5=�M{@H�,n274G;>=�?;È=lBLDnmG+-D/,7B�D7+�H�FN;Èè-+�,oÁGy1+�,5+�0o,t0 � Ç

C BLD/mG+�0<;>?L=êH�=l.�=�,oÁGy1+�mu{@Hr254G;>=�+�Hw=1mWy�D5B�mG.12t+�2tB�mG+�CMBLD�;>,�~ h+P274�B�B�0A+�4�+-D7+�,74�+·0A+�2tBL=1mx0oB�F>.�,o;>BL=!R�;>,�O�;NFpF�y1+-D5{·;È,�.103,7BW?�;>KL+P0oBL{P+�;È=G,5.G;>,o;>BL=¿HwI1BL.�,�,54�+P2tBL{�yG;pFN;>=�?y�D5B�2t+�050�BwC�CM.�=12t,o;>BL=1H�F�FQH�=�?L.1H�?L+�0¬8�Hw=1mx,5BêmG+�072tDo;>I1+vHW,oÁGyG;Q2-H�F�+t��+�2t.�,o;>BL=ý{PB¤mG+tF�C¢BrD�|�0o,5Do;Q2t, � C¢.�=12t,A;ÈBr=1H�FFQH�=�?L.1H�?r+�0-~ ��4�+�{@Hr254G;>=�+�,541H�,3O�+�O�;NFNFz.10o+U;Q0 Hu0<;>{PyGFN;NÄ1+�mhKL+-Dt0<;>BL=x,54�+.-zÑrÌMÎ�ÍrÊLÐ �E�tÑLÒ0/21tË-ÌMÐ�ÑD��Ì43xÑ��:92�QÏJÎ|�. í öý8rC¢BLD30o4�BLD5, � ~

}+�O�;pFNF!2-H�FNF�. í ö BL.�DzH�I10A,5DnHL2t,E{@Hr254G;>=�+L8�mG+�0AyG;È,7+/;>,n0Emr;Nü!+-D5+-=12t+�0�O�;>,54�,54�+/BLDA;È?w;È=1HsF�. í öý~��:BLD�{�BLD5+;>=GC¢BrD5{@H�,o;>BL=10�BL=W,54�+-. í öý8�0o+-+%� � 8 ���'" ~

Ó65�ÕtÓ ×ÙØ�Ú��+7'#Jâ!à!Û98ùâ+: Û98ùØPáK&�Ú��4�+�+t��+�2t.�,o;>BL=x{PB¤mG+tFE;Q03HlË ÌMÑD�:;@É�Ñ�� 9 �QÏJÎU|M;k~`+L~�HP{@Hr254G;>=�+�.10<;>=�?vH@0A,nHL276 � ~�jk=x,54G;Q0�0o+�2t,o;>BL=!8#O�+�mG+tÄ1=�+;>= .�Hw{�F!,54�+PË-ÌMÑLÌMÎ-Ë�B�C�,74�+ . í öëH�=1m�;>,n0�;>=10o,5D5.12t,A;ÈBr=10-~

í 0o,nHw,5+/;Q032tBL{PyJB�0o+�muB�C5R

C HWÐoÎ�ÍD�>Ë-ÌMÎ�Ð�|<4�B�FQmr;È=�?uKsHsFÈ.�+�03H�=1m�+-=�Kr;>D5BL=�{P+-=G,n0 � 8

C H3ø9ÐoÊnÍrÐoÑLÉ �nÊ��GÏ1ÌMÎ�Ðn8rD5+-y�D5+�0o+-=G,5+�m�4�+-D5+�HL0zH�FN;Q0o,�B�C#;È=10A,5D5.12t,o;>BL=10�O/4�B�0A+/Ä1Dn0A,z+tF>+-{P+-=G,z;Q0�,54�+�2t.�D5D5+-=G,;È=10A,5D5.12t,o;>BL=lI1+t;>=�?@+t��+�2t.�,5+�m#8

C H�=1m�H�Ë-ÌMÑ��:;�D5+-y�D5+�0o+-=G,5+�m�HL0EH�FN;Q0o,EB�Cé2tB�mG+/HLm�mGD5+�050A+�0�|M;>=10o,5D7.12t,o;>BL=UFp;Q0o,t0 � 8LK�H�F>.�+�0zH�=1mU+-=GKL;>D5Br=�{P+-=�,t0-~��4�+�Ä1Dn0o,@.�Hw{�F!,�ÁGy1+�,741H�,/O�+�=�+-+�m�;)0�,54�+�,oÁGy1+3CMBLD@. í ö ;È=10A,5D5.12t,o;>BL=10-~ h+UO�;NFpFz0o,5.1mGÁ�FQH�,5+-D3,54�+�+tü!+�2t,B�CE+�HL274u;È=10A,5D5.12t,o;>BL=!~

T Y$UWV9XÃa¬c9ò�Y c qsY#a�ñ�cBZT ;c ñrY1X ñrZÙa¬c�Y � jhm�c�YJXy�JX�NqLñ�c#ò�Y ��c¤YJòhj��

�r�

Page 115: Functional programming using Caml Light Michel Mauny January 1995

�L�K� �E3�������z� ���L� �/�����E�o�#������@���e���[���b��� �!����� �3�¿�x� �E����3� �������

T�` �¤V c ò ` a¬c c ò � j i #a�Y�, d X�Y#a�q ñ�V9X ��Y#asñwc9ò]j��T�` � a�g#ayk:X ` � � c �LV ` f a d X�òT�`ba YD,dñLZ a-c�Y � j � � #a � e V:X �$q�qGX�òGò�XGòhj��T�` � ��c�q',dñLZba¬c9ò�Y c qsY#asñwcdV1arò�YBja-c#òsY c q�Y9a�ñwcôVJaLò�YT � j ð�ñwc<k1a�Y9a�ñwc �LVeXs^JX$q c Y9a�ñ�cNj��T�` � c ò', � j�� c ò',9XGòæñwc¤Y�ñ�Y�,#X[òsY�$q:^Nj��T�` � _��V � j���^%q', 5 Y�ñ�VeñrZbò�Y ��q:^ ��c<k JX:�9aròsYJX Bj-�T�` ð�VGñ:ò ñrZba-c#ò�Y c q�Y#asñwcdV1aròsY � j�� c a�V$k:ò �hqwVGñ:ò c 1X�_#a�YD,ÃY�,#XSq c JX�c�YX�c�g9a �ñ�c d X�c�YSj-�T�`bi V�V1V�U � j[s c c,qsY#asñwc �V�V1V1aWq ��Y#asñwc�j��T o$ov�wyx1z]�K�,|��:�Y�Y�W�$����� ��z��<���>zW�1�

h+U=�+-+�mhHP=�+-O,oÁ�yJ+UC¢BLD30o+-{@H�=G,o;Q2UKsH�F>.�+�0�0<;>=12t+�;>=10o,5D7.12t,o;>BL=lFp;Q0o,t0341H�Kr+�=�B�OdD7+-yGF)Hr2t+�mêHwI10o,5DnHL2t,�0oÁG=�,tH��,5D5+-+�0¬~ ��4�+h0o+-{uH�=�,A;)2%KsH�F>.�+�0vHwD5+x{P+-D5?L+�m ;>=ÙH},oÁ�yJ+ ñ e�� X$q�Y ~å��4�+h,oÁGy1+ ñ e�� X$q�Y I1+-41H�KL+�0lHL0Wm�H�,nH;>= Hl2tBL{Py�.�,5+-DU{P+-{PBLD7Á9RUO�+P=�+-+�mh4G;>?L4�+-D FÈ+-Kr+tF/;>=GC¢BLD7{@H�,o;>BL=½|o0o.1254½HL0�,�ÁGy1+·;È=GCMBLD5{uH�,o;>BL= � ;>=½BLDtmG+-D�,5B;>=�,7+-D5y�D5+-,!,54�+-{l~H�:.�D5,54�+-D5{�BLD5+L8�0oBr{P+zm�H�,nH�mGB/=�BL,'2tBLD5D5+�0oyJBL=1m3,5B Hw=�ÁG,54G;>=�?�|MCMBLD!+t�1H�{PyGF>+�Hw=�+-=�Kr;>D5BL=�{P+-=G,2tBL{PyJB�0o+�mýB�C�+-=GKL;>D5BL=�{�+-=�,n0·D5+-y�D5+�0o+-=G,n0U=�+t;>,54�+-D Hw= í ��*eKsH�F>.�+l=�BLDPH�=ý;>=�,5+-D7{P+�mr;QH�,5+êm�Hw,nH�;È=[H�FÈ+-?GH�F2tBL{Py�.�,tH�,o;>BL=Wy�D5B�2t+�050 � ~

T Y$UWV9X ñ e�� X�qsYSZÃðGñ�c#ò�Y ��c¤YÃñrZba-c�YT ` ðGV�ñ:ò c JX ñLZÃñ e�� X$q�YNjæñ e�� X$q�YT `bi k$k JX�òGò ñLZba¬c9ò�Y c qsY#asñwcdV1arò�YT ` �rc�g#a ¤ñwc d X�c¤Y[ñLZdñ e�� X�qsYÃVJaLò�YT o$ov�wyx1z]�+@�� z��W� ��z��<���>zW�1���4�+�,oÁGy1+ ò�Y�sYJX ;Q0 H·y�D5B¤mG.12t,�,�ÁGy1+UO�;>,54W{�.�,nH�IGF>+�2tBr{Py1BL=�+-=G,n0-~

T Y$UWV9X[ò�Y ��YJX Ztl dYc Y� e V:X �1X:� nWñ e�� X�qsY oT dYc Y� e V:X��¤ð nxa-c#òsY c q�Y9a�ñwceVJaròsY oT dYc Y� e V:X � Y�$q:^�n ñ e�� X�qsYÃVJaLò�Y�pT o$ov�wyx1z |���{$��z]��z��%�K�.z��1�î�BsOU8�O�+u?�;>KL+u,54�+êÊ ø¤Î�ÐoÑLÌ�� ÊLÏJÑLÒ�Ë Î�É�ÑrÏ1Ì��E�-Ë�B�C@. í ö ;>=10o,5D5.12t,A;ÈBr=10-~h��4�+W+tü!+�2t,�B�C�H�=h;>=10o,7D5.12t,o;>BL=ý;Q0�,5B2741H�=�?L+x,54�+¿0o,tH�,5+ê2tBr=GÄ1?L.�DnH�,o;>BL=!~´��4G;Q0u;Q0uO/41Hw,WO�+hmG+�052tDA;ÈIJ+¿=�B�O O�;>,54[,54�+ ò�Y1X�V CM.�=12t,o;>BL=!~ .zB�mG++t��+�2t.�,o;>BL=10/O�;pFNFEI1+�H�D5IG;>,5DnH�D7ÁP;>,5+-DnHw,o;>BL=10�B�CE,54G;Q0�CM.�=12t,o;>BL=!~

T Xs^%q�X�V�Y9a�ñ�cÃð i We$c �dñrZdò�Y 9a¬c�� o�o������z�x����$����8 % @W��� ��z��<���>zW�1�T Xs^%q�X�V�Y9a�ñ�cÃð i X �rcYk[ñrZdñ e�� X$q�Y o$o������z�x����$����8 %<~:�W� �h��z�%�K�.zW�H�T V�X�YòsYJXV òsY�sYJX[Z d �sY%q#,bò�Y ��YJXr_#a�Y�,T l��JX:��ZYX.o �¤ð�Z ;c ñLYJX � c��.n�n qwñ�k�X�o � Y�$q:^�Z:ò�p���T ò�Y�sYJX 5 �JXy�A.+æðGñwc9ò�Y ��c�Y � c7�>ovò�Y�sYJX 5 ��ð�.�hqwñ�k:XT

Page 116: Functional programming using Caml Light Michel Mauny January 1995

���L�)�L�ý�� ����� �!����� �3�¿�x� �E����3� �L� �

T�` l��JX:��ZGð�ñwc#òsY��c�Y �2d � o ��ð�Z���V c ò1n$n qwñ�k:X.o � Y�$q:^�Z�ðGñ�c#ò�Y ��c¤Y � c7��n$n7ò�p*+�T ò�Y�sYJX 5 �JXy�A.+æðGñwc9ò�Y ��c�Y � c>� d � olòsY�sYJX 5 � Y ��q:^�.�Ãò.oT ò�Y�sYJX 5 ��ð�.�Sqwñ�k:XTT�` l��JX:��ZGð�ñwc#òsY��c�Y �2d � o ��ð�Z a-c c òHn�n�qLñ�k�X�o � Y ��q:^�ZGð�ñwc#òsY��c�Y � c��.n�n7ò�p*��T ò�Y�sYJX 5 �JXy�A.+æðGñwc9ò�Y ��c�Y � c d � olòsY�sYJX 5 � Y ��q:^�.�Ãò.oT ò�Y�sYJX 5 ��ð�.�Sqwñ�k:XTT�` l��JX:��ZGð�ñwc#òsY��c�Y �2d � o ��ð�Z f a d XGòHn�n�qLñ�k�X�o � Y ��q:^�ZGð�ñwc#òsY��c�Y � c��.n�n7ò�p*��T ò�Y�sYJX 5 �JXy�A.+æðGñwc9ò�Y ��c�Y � c�j d � olòsY�sYJX 5 � Y ��q:^�.�Ãò.oT ò�Y�sYJX 5 ��ð�.�Sqwñ�k:XTT�` l��JX:��ZGð�ñwc#òsY��c�Y �2d � o ��ð�Z � ag#a:k�X1n$n qLñ$k:X.o � Y��qy^�Z�ðGñwc9ò�Y ��c�Y � c7��n�n5ò�p*+�T ò�Y�sYJX 5 �JXy�A.+æðGñwc9ò�Y ��c�Y � c � d � olòsY�sYJX 5 � Y ��q:^�.�Ãò.oT ò�Y�sYJX 5 ��ð�.�Sqwñ�k:XTT�` l��JX:��ZGð�ñwc#òsY��c�Y �2d � o ��ð�Z� � c �LV8n�n�qLñ�k�X�o � Y ��q:^�ZGð�ñwc#òsY��c�Y � c��.n�n7ò�p*��T ò�Y�sYJX 5 �JXy�A.+æðGñwc9ò�Y ��c�Y � a�Z cYZ d YD,9X�c ��XLV�òGX��=�>oT ò�Y�sYJX 5 � Y ��qy^A.+eò.oxò�Y ��Y1X 5 �¤ðA.�Sqwñ�k:XTT�` l��JX:��ZGð�ñwc#òsY��c�Y �2d � o ��ð�Z�� ��c,q#, � qLñ�k�X=� ��qLñ$k:X ,���n$n qwñ�kGX�o � Y��qy^�Z �n�n5ò�p���T ò�Y�sYJX 5 �JXy�A.+ oT ò�Y�sYJX 5 � Y ��qy^A.+ i k�k JXGò�ò � qLñ�k�X-�.n�n7ò.oT ò�Y�sYJX 5 ��ð�.� � a�Z d Z��[YD,9X�c�qwñ�k:X ,eXLV�òGXSqLñ$k:X>���TT�` l��JX:��Z 8o �¤ð�Z � c ò#,�n�n�qLñ$k:X�o � Y ��qy^�Z:ò�pA��T ò�Y�sYJX 5 � Y ��qy^A.+ n�n5ò�oxòsY��Y1X 5 ��ðA.+hqLñ$k:XTT�` l��JX:��Z 7� o ��ð�Z � _ ��V�n$n qwñ�k:X.o � Y�$q:^�Z -,8n�n7ò�pA��T ò�Y�sYJX 5 �JXy�A.+ -, oêò�Y�sYJX 5 � Y ��qy^.� 7�>n$n7ò�oT ò�Y�sYJX 5 ��ð�.�Sqwñ�k:XTT�` l��JX:��Z 8o �¤ð�ZGð�VGñ�ò � qwñ�k�X=���.n�n�qLñ�k�X�o � Y��qy^�Z�ò�pA+�T ò�Y�sYJX 5 �JXy�A.+æðGVGñ�ò c JX ��i k$k JX�òGò � qLñ$k:X>���5� �,oT ò�Y�sYJX 5 ��ð�.�Sqwñ�k:XTT�` l��JX:��ZYX.o �¤ð�Z ��� o � Y ��qy^�Z i k�k JXGò�ò � qLñ�k�X-�.n�n7ò�p +�T ò�Y�sYJX 5 � Y ��qy^A.+eò.oxò�Y ��Y1X 5 �¤ðA.�Sqwñ�k:XTT�` l��JX:��ZWg8o �¤ð�Z i V�V:VWU�n$n qwñ�k:X.oT � Y��qy^�Z�ðGVGñ�ò c JX ��i k$k JX�òGò � qLñ$k:X>���5� ��c�g#a��ñ�c d X�c¤Y � X���� n�n5ò�p*+�T ò�Y�sYJX 5 �JXy�A.+ �rc�g9a ¤ñwc d X�c¤Y � g n�n5X-�>oT ò�Y�sYJX 5 � Y ��qy^A.+ i k�k JXGò�ò � qLñ�k�X-�.n�n7ò.oT ò�Y�sYJX 5 ��ð�.�Sqwñ�k:X>�T

Page 117: Functional programming using Caml Light Michel Mauny January 1995

�L�� �E3�������z� ���L� �/�����E�o�#������@���e���[���b��� �!����� �3�¿�x� �E����3� �������

T�` l��JX:��ZWg8o �¤ð�Z ��� o � Y ��qy^�Z ��� p���T ��aLòGX � ð i� X �Lc<k]g �T�` l��JX:��ZYX.o �¤ð�Z � ��V c ò ` a-c c ò ` f a d X�ò ` � a�g9a:k�X ` � � c �LV=��n$n qsñ�k�X�o � Y ��qy^�ZYXHn�n�X�p���T ��aLòGX � ð i� We�c ��3�mwVGV f UWV9X�k 3��TT�` l��JX:��Z �Lc�g#a��ñ�c d X�c�Y � X-� o ��ð$Z a Y�, � c���n$n qwñ�k:X.o � Y ��q:^�ZYX�pA��T ò�Y�sYJX 5 �JXy�A.+ � Y $U�c�Y�,ÃcbXT _#a�YD,Bs ��asV c 1XhX��� ��aLòGX � ð i �e�c ��3�mwVGV f UWV9X�k 3���� oT ò�Y�sYJX 5 ��ð�.�Sqwñ�k:XT�` X�+� ��aLòGX � ð i� We�c ��3 � �ñ�c��Nqwñwc�Z9a�� c �sY#asñwc�3��T o$o|���z x � |���{���z����h�� �������Y���� h+�{@H�Áu=�BL,o;Q2t+�,741H�,�,54�+�+-{Py�,oÁ 2tB�mG+�0A+�qL.�+-=12t+�mG+-=�BL,5+�03Hu|ky1BG050<;>IGF>ÁuÄ1=1H�F � ÐoÎ�Ì��GÐtÏ�;>=10o,5D5.12t,A;ÈBr=!~

}+ 2tBL.GFQmWH�D5?L.�+3,541H�,�y1H�,5,5+-D7=�M{@H�,n274G;>=�?�;>=W,54�+ ð � d V:òsYJXV CM.�=12t,o;>BL=u;>{PyGF>+-{P+-=G,n0/H�6r;>=1muB�C�mGÁ�=1Hw{�;Q2,oÁ�yJ+�254�+�276r;È=�?J~Pjk=%C HL2t,�8J;È=½HW2tBL=12tD5+-,7+@| FÈB�O� F>+-KL+tF � ;>{PyGF>+-{P+-=G,nH�,o;>BL=ýB�C�,74�+�{uHL254G;>=�+l|k+t��y1H�=10<;>BL=hB�C�,54�+. í ö ;È=10A,5D5.12t,o;>BL=10�;>=êHr050o+-{�IGF>Áv2tB¤mG+L8:C¢BrD/+t�:Hw{PyGF>+ � 81,74�+�0o+�,5+�0A,n0�O�BL.GFQmW=�BL,3H�y�y1+�H�D�~/��4�+-ÁvH�D5+�.10o+tF>+�0500<;>=12t+WO�+@,7D5.10o,�,74�+@,oÁGy1+�274�+�256L+-DPH�=1m},54�+W2tBL{PyG;NF>+-D�~ �LBJ8�Hw=�Áh+t��+�2t.�,o;>BL=½+-D5D7BLD�;>= HlD5+�H�F�;È{�yGFÈ+-{�+-=�,nH�,o;>BL=¿2tBr{P+�0�C¢D5Br{çH 1 ��Í·;È=ýBL=�+uB�C/,54�+@H�IJB�KL+Py�D5B�2t+�050o+�0UH�=1mhO�BL.GFQmlF>+�HLm},5Bl{P+-{PBLD5Áx+-D5D7BLDn03BLD�;pFNF>+-?�H�F;>=10o,5D5.12t,A;ÈBr=10�|k.10A.1H�FNFÈÁvmG+-,7+�2t,5+�mWIGÁ@,74�+�2tBL{Py�.�,7+-D��°0�BLy1+-DtH�,o;>=�? 0AÁ¤0o,7+-{ � ~

Ó65�ÕAÖ �Ãß�ã !uá-Ü-áK&�Þ������ !Pà�ß Þ3à!Û3ã #²áK& â!ß��S� : 8�ß��PÚ h+U?�;>KL+�;>=v,74G;)030o+�2t,o;>BL=hHP2tBr{PyG;NFp;>=�?�C¢.�=12t,o;>BL=l,nH�6r;>=�?@,54�+�H�I10o,5DtHL2t,/0oÁ�=G,nH��W,5D5+-+UB�CzH�= í ��*h+t��y�D5+�050�;ÈBr=H�=1muy�D5B�mG.127;>=�?�. í ö 2tB�mG+L~z��4�+�2tBL{PyG;NFQH�,o;>BL=x05254�+-{�+�;Q0�KL+-D5ÁW0<;>{PyGF>+LR

C ,54�+�2tB¤mG+UB�C�HP2tBr=10o,nH�=G,�;Q0 ;�c ñrY1X ÇC H�K�H�Do;QH�IGF>+�;Q0/2tBr{PyG;NFÈ+�mlHL0�H�=vHL2-2t+�050�,5B�,54�+ÝHwy�y�D5BLy�Do;QH�,5+�2tBr{Py1BL=�+-=G,�B�CE,54�+Ý2t.�D7D5+-=�,�+-=�Kr;>D5BL=�{P+-=G,| a YD,#� Ç

C ,54�+P2tB¤mG+PBwC�HW2tBL=1mr;>,o;>BL=1H�F�+t�¤y�D7+�050<;>BL=hO�;NFNF�07H�Kr+�,74�+·2t.�D7D5+-=�,U+-=�Kr;>D5BL=�{P+-=G,�| � c ò',#� 8#+-KsH�F>.1H�,7+P,54�+2tBL=1mr;>,o;>BL=xy1H�D5,�81Hw=1m#81HL2-2tBLDnmr;>=�?u,5Bu,54�+�I1BGB�F>+�H�=xKsH�F>.�+�BLI�,nHs;È=�+�m#8#0o+tF>+�2t,�,54�+�H�y�y�D5BLy�Do;QH�,7+�2tB¤mG+�,5B+t�¤+�2t.�,5+�| � ��c�q',#� Ç

C ,54�+@2tB�mG+@B�C H�=ýH�y�yGFN;)2-Hw,o;>BL=½O�;NFNF�HsF)0ABê05H�KL+P,74�+P+-=�Kr;>D5BL=�{P+-=G,�Br=¿,54�+u0o,nHL276h| � c ò#,#� 8!+t��+�2t.�,5+u,54�+C¢.�=12t,o;>BL=Uy1H�D5,!BwC¤,54�+zHwy�yGFp;Q2-H�,A;ÈBr=!8L,54�+-=U+t�:2741H�=�?L+�,54�+'C¢.�=12t,A;ÈBr=1H�F¤K�H�F>.�+�H�=1m�,54�+�07H�Kr+�m3+-=�Kr;>D5BL=�{P+-=G,| � _��V9� 8r+-KsH�F>.1H�,7+�,54�+�H�D5?L.�{�+-=�,/H�=1m#8rÄ1=1H�FNF>ÁL89Hwy�yGFÈÁW,74�+/CM.�=12t,o;>BL=1H�F�K�H�F>.�+P|kO�4G;)274u;Q0/H�,�,54�+�,5Bry@B�C,54�+�0o,nHL276 � ,7BP,54�+�H�D5?r.�{P+-=�,�4�+tFQm�;>=v,54�+�D5+-?w;)0A,5+-D/O�;>,54l,54�+ i V�V1V�U ;>=10o,7D5.12t,o;>BL=!Ç

C ,54�+@2tB�mG+PB�C H�=hH�I10o,5DtHL2t,o;>BL=¿0<;>{PyGF>Á¿2tBr=10<;Q0o,n03;>=ýI�.G;NF)mr;>=�?¿Hl27F>B�0o.�D5+PD7+-y�D5+�0o+-=G,o;>=�?ê,74�+�C¢.�=12t,A;ÈBr=1H�FKsH�F>.�+LR�,54�+�27F>B�0o.�D5+�;)032tBL{PyJB�0o+�muB�CE,54�+�2tB�mG+�B�CE,54�+3CM.�=12t,o;>BL=êHw=1mW,54�+�2t.�D5D7+-=�,/+-=GKr;ÈD7BL=�{P+-=G,�~

ä�+-D5+3;Q0/,54�+�2tBr{PyG;NFp;>=�?�C¢.�=12t,o;>BL=!RT V�X�Y 1X�qSqLñ$k:X$XLñrZ Z�Z c c,q�Y9a�ñ�cT ð�ñwc#òsY � c��<�� � ;c ñrY1X � c�� �T�` � � �c��� � a Y�, � c�� �

Page 118: Functional programming using Caml Light Michel Mauny January 1995

���L����� �/�����E���é�����d� ��� �z�����/�/�3� �P������� �ù� � �/����� �L� �

T�` ð�ñwc<k � X$X�YJX�ò�Y0�tX�XsY1�nX�X�Z � ��T � c ò#,�n�n � qwñ�k:X$XLñLZeX$X�YJX�ò�Y �T � � � ��c,q', � qwñ�k:X$XLñLZeX$X�Y1�5qLñ�k�X�XwñrZX$X�Z � �T�`bi V�V � X=� �tX�,=� +� � c ò#,�n$n � qwñ�k�X�XLñLZeX>���T � � � _ ��V � � � qLñ$k:X�XwñrZ[X ,��T � � i V$V1V�U �T�`bi�e ò � X��nX-�<�� � ð�VGñ:ò � qwñ�k:X$XLñLZeX�� � o$o�W�$��z:~��:� � {�|�}B���S���,|��:���<�W�$���K�N}��W|������Y����í ?�F>BLI1H�F'+-=�Kr;>D5BL=�{P+-=G,3;Q0/=�+-+�mG+�m�;>=xBLDnmG+-D3,5BP{@H�;>=G,nH�;>=êHsFÈD7+�HLmGÁvmG+tÄ1=�+�mlKsH�F>.�+�0-~ í =�Á . í öë+t�¤+�2t.�,A;ÈBr=O�;NFNFù0A,nH�D5,�;>=êHP0A,nH�,5+3O/4�B�0o+�D7+-?�;Q0o,5+-D/y1H�D7, 2tBL=G,nH�;>=10�,54G;Q0�?�F>BLI1H�F�+-=GKL;>D5Br=�{P+-=�,�~

T V�X�Yba-c!a�Y%XLð i XGX�c�gSZT V�X�Y e �Gò�a�q�X¤a¬c#òsY c q�Y9a�ñ�cSZ�Z c c�q�Y#asñwcT 3 � 3 �� �¤V c òT ` 3 >3 �� a¬c c òT ` 3�j>3 �� f a d X�òT ` 3 �>3 �� � a�g#ayk:XT ` 3�Z 3 �� � � c �wVT ` ò�+� ��aLòGX � ð i �e�c ��3 \�c�^rc:ñW_LchV 9a d a�Y#agJX=3��T a-c d �V � Z c c,q�Y9a�ñ�cò���T ðGVGñ�ò c JX ��i k$k JX�òGò � ðGV�ñ:ò � � c ò',�n�n a Y:, � ,=�T n�n � _�V�n�n a Y�, � ���T n�n � e ��ò�aWq$X�a-c#ò�Y c q�Y#asñwcÃò � � � �T �rc�g9a ¤ñwc d X�c¤Y ��� ���T a-c!a�Y%XGX�c�g8o�o��� ����~-8�%�%~Yz � � � ��@ � z����]}���|����� 8W}��W|����,z � %%�$�:�,z:|�| � 8�}��W| ��� ��|��� '�������� &���{)x�� '���� �� � }��$|�� � ��� ���y�%�K���.z�� � � � �8W}��W|����,z � %%�$�:�,z:|�| � 8�}��W| ��� ��|��� '�������� &���{)x�� '���� �� ,������|�� � �W� �$�:�<�����>z � � � � �8W}��W|����,z � %%�$�:�,z:|�| � 8�}��W| ��� ��|��� '�������� &���{)x�� '���� ��[vW���>z�|�� � �W� �$�:�<�����>z � � � � �8W}��W|����,z � %%�$�:�,z:|�| � 8�}��W| ��� ��|��� '�������� &���{)x�� '���� ����,���$����z�� � �W� ���y�%���$�.z�� � � ���8W}��W|����,z � %%�$�:�,z:|�| � 8�}��W| ��� ��|��� '�������� &���{)x�� '���� �� � �W��{W}�� � �W� �$�:�<�����>z � � � ��

T V�X�Yh�¤VGñ e �LV�XLð i X�X�c�ghZ JXsZba¬céa�Y<XLð i� X�X�c�g8o�o�,}���@${W}�~�8�%�%~<z�� � � ��@�� z����]}���|�����z�����z��� 8�}��W|$����z � %%���y�,z:|�| � 8W}���| ��� ��|��� '�������� &��${�x�� ',�K� ��� � }$��|�� � �W� �$�:�<�����>z � � � � �8�}��W|$����z � %%���y�,z:|�| � 8W}���| ��� ��|��� '�������� &��${�x�� ',�K� ��� ,�K�,�$|�� � �W� ���y�%���$�.z�� � � ���8�}��W|$����z � %%���y�,z:|�| � 8W}���| ��� ��|��� '�������� &��${�x�� ',�K� ���[vW�K�.z:|�� � �W� ���y�%���$�.z�� � � ���8�}��W|$����z� %<���y�,z�|$| � 8�}���| ��� ��|���� ',�K������&=��{�x���',��� �����,�$������z�� �L�W� �$�:�<�����>z � � � � �8�}��W|$����z � %%���y�,z:|�| � 8W}���| ��� ��|��� '�������� &��${�x�� ',�K� ��� � ����{�}�� � �W� ���y�%���$�.z�� � � ��

í 0/H�=W+t�1H�{PyGF>+L8J4�+-D5+3;Q0/,74�+�2tB¤mG+�C¢BLD/0oBr{P+ í ��*}+t��y�D5+�050<;>BL=10-~

T qwñ�k�X�XLñLZ � Xs^WV JXGò�ò�asñwc � V:Xs^JX � òsY JX � d XLñLZ%X�ò�Y 9atc��B3��,o 3������ o�o� � ����|��y�Y�<�����$����}��W|���� ��� ������z ��

Page 119: Functional programming using Caml Light Michel Mauny January 1995

�L� � �E3�������z� ���L� �/�����E�o�#������@���e���[���b��� �!����� �3�¿�x� �E����3� �������

T qwñ�k�X�XLñLZ � Xs^WV JXGò�ò�asñwc � V:Xs^JX � òsY JX � d XLñLZ%X�ò�Y 9atc��B3 ��� ,1o 3������ o�o� � ����|��y�Y�<�����$����}��W|������� �$|���� � ��|��� '������ � &���{)x�� � ���$��z �� %x�x }:w � &���{)x�� � ���$��z ��� %x�x }:w�T qwñ�k�X�XLñLZ � Xs^WV JXGò�ò�asñwc � V:Xs^JX � òsY JX � d XLñLZ%X�ò�Y 9atc��B3 ����� ^ 5 ^ � ������� ^ 5 ^ �<��� o 3������ o�o� � ����|��y�Y�<�����$����}��W|������� �$|���� 8W}���| � '���� �� ��&��${�x�� � �$|���� 8W}���| � ',�K� �� ��&��${�x�� � ���$��z�����%�x$x>}:w ��%�x$x>}yw�T qwñ�k�X�XLñLZ � Xs^WV JXGò�ò�asñwc � V:Xs^JX � òsY JX � d XLñLZ%X�ò�Y 9atc��T 3 �2� � a�Z��[YD,9X�cB,XLV�òGX ��Z9a��>o 3��+���>o$o� � ����|��y�Y�<�����$����}��W|������� �$|���� � ��|��� '������ � &���{)x�� � ���$��z �� %x�x }:w � &���{)x�� � ��|��� � ������z�� ����<{��.��� � ��� ������z � � � � ������z��� � ��%x�x>}yw�

Ó65�Õ�� ���Ú�8��â'ánß & ß � �S� : 8zß �PÚ��4�+u{@H�;>=}C¢.�=12t,o;>BL=ýCMBLDU+t�¤+�2t.�,o;>=�?¿2tBr{PyG;NFÈ+�m í ��*�{@Hw=1H�?L+�0�,74�+@?�F>BLI1HsF�+-=GKr;ÈD7BL=�{P+-=G,�.�=G,o;NF/+t�¤+�2t.�,A;ÈBr=41HL0/0A.12-2t+-+�mG+�m#~T V�X�Y c c ��� X�qwV � ò��tX����OZT � j f � �%m a �tj-�T 1XGò�X�Y%Xyg��GY�U�V#X�ò � � oT V�X�YÃY� c ZT Y $U �GòwVYXsY�UWVéa¬c��%XGXs^WV � 2��VGñ e �wVYX�Y$UWVéa¬c��<XGX�c�g[XT _#a�YD, f UWV9XLðGV �Gò#, � Y7�7��Y-,��<��T V:XsYhg��Jò�Z�g��Jò�XwñrZ<X�Y�U�V#X � Y���� �hg� 1ò�XwñrZ%XsY�U�V#X � Y-,=��a-cT V 9a¬c�Y<XGòsY #a-c��43 i�� � f UWV#XSqwV �Gò#, e XsY�_1XGX�c 3 oT V 9a¬c�Y<X�Y$UWV#X$XGò$q',#X d X � sGñ �LV�V � g � 1ò��oY7���+�>oT V 9a¬c�Y<XGòsY #a-c��43 ��c<k43 oT V 9a¬c�Y<X�Y$UWV#X$XGò$q',#X d X � sGñ �LV�V � g � 1ò��oY�,��+�>oT �¤aròGX � s �¤a�V c JXA3 i� �[Y�U�V!a-c���3��T ` \�c e ñ c cYkeò��� ��aLòGX ��f UWVéa¬c���� c � � 3�\Gc e ñ c c<k8n 3��rò-�+�Ãa¬cT V�X�Ybò�a� d �[Zh�JX�c9X �LVJaLòGX$X�Y�U�V#X � ��V�ñ e �LVYXsY�U�V!a¬c��%X�X�c�g0�oY � c �½a-cT � j�� �<m a�f m a � f � ���Nm a s � � $i�f m�� a j��T V #a-c�Y%X�ò�Y #a¬c���3 i�� � f UWV9X ñrZ 3 oT V #a-c�Y%X�ò�Y #a¬c��ò�o V #a-c�Y<XGò�Y #a-c��43ôaLò43 oT V #a-c�Y%XsY�U�V#X�X�ò�q#,#X d X�ò¤a�� d ��o V #a-c�Y<X�c#Xy_�V1a¬c#X � � oT � j ð � �%m �%m a �tj��T V�X�Y�qLñ$k:X[ZNqwñ�k:X$XLñLZXÃa¬cT V�X�Ybò�Y ��Y1X[ZSl �JXy��Z�rc�g9a ¤ñwc d X�c¤Y � 2��V�ñ e �wV�XLð i� X�X�c$g � o ��ð�Z�qLñ$k:X�o � Y�$q:^�Z �� pea-cT � j���� ��ð�\ f m a �tj��T V�X�Y JX�ò c VrYSZ[Y $Uh_D,éa�V�X½Y c X[k�ñÙòsYJXVbò�Y ��YJX k�ñwc#X.oxò�Y ��Y1X 5 �1X:�T _#a�YD,dð i X �rcYk]g+�]gåa-cT � j \ � ��i�f m a � � a �%m�� � a� � a$f� j-�T �¤VGñ e �LV�XGX�c�g n Zeò1n$n� �¤VGñ e �LV�XGX�c�g oT �¤VGñ e �LV�X�Y$UWV!a-c��<XGX�c�g�n Zeò�a� d �1n�n+ �¤VGñ e �LV�X�Y�U�V!a-c��%X�X�c�g o

Page 120: Functional programming using Caml Light Michel Mauny January 1995

���L�����W�����������!� ���´��� �ù� � �/����� �L� �

T �¤VGñ e �LV�XLð i X�X�c�g�n Z 1XGò c VrY n�n+ ��V�ñ e �LVYXwð i� XGX�c�g8oT � j�� �<m a�f m a ����� � \� f j-�T �2d �sY%q', JXGò c VLYT _#a�YD,dð�ñwc#òsY��c�Y � c��*+� V 9a¬c¤Y%X�a-c�Y�cT ` ð�VGñ:ò c 1X � X���X��*�� V #a-c�Y%X�ò�Y #a¬c���3 .sZ c c�g�wV>�>3T ` X��� ��arò�X � ð i �e�c � 3 � ¤ñwc��ò�Y ��YJX qLñwc¤Z#a� c ��Y9a�ñwc53��+�>oT V #a-c�Y%X�c#Xy_�VJa-c#X � �>o$o�Y�� � ���)x>~�{�|�}B���h��� �$���B���������î�BsOU8LF>+-,3.10�D5.�=x0oBL{P+�+t�1H�{PyGF>+�0-RT�� j �JX¤a¬céa�Y#a �LV1a � a-c��ÃX�c�g#a ¤ñwc d X�c¤YJòhj��T �¤VGñ e �LV�XGX�c�g�n ZJa-c!a�Y<XGX�c�g oT �¤VGñ e �LV�X�Y$UWV!a-c��<XGX�c�g�n ZJa¬céa�Y<X�Y�UWVéa¬c��<XGX-c�g8oT �¤VGñ e �LV�XLð i X�X�c�g�n�Z1a¬céa�Y%Xwð i� XLX�c�g oT�� �>o$o� � ��� �����#�$�

T c c � V ��JòGX$X�Y¤ñ�V 3+� o 3��>o$o% &��v�wyx1zh�:�B���S�W|('%���@�z���� � ��� �����#�$�

T c c � V ��JòGX$X�Y¤ñ�V 3 �2�<, o 3��>o$o% &��v�wyx1zh�:�B���S�W|('%���@�z���� � ��� �����#�$�

T c c � V ��JòGX$X�Y¤ñ�V 3 ����� Z 5 ����� ^ 5 Z�^ ��� ����� ^ 5 ��^ ��� � o 3��>o$o% &��v�wyx1zh�:�B���S�W|('%���@�z���

� � ��� �����#�$�

h+�{@H�Áu=�B�O ;>=G,5D5B�mG.12t+�,54�+� Ä���y1Bw;È=G,�2tBL{�IG;È=1Hw,5BLD HL0�H�y�D5+�mG+tÄ1=�+�m�C¢.�=12t,A;ÈBr= Z#a�^ ~T�e X:�9a¬cT �¤VGñ e �LV�XGX�c�g�n Z 3¬Z9a�^73>n�nna¬céa�Y�XGX�c�g oT �¤VGñ e �LV�X�Y�U�V!a-c��%X�X�c�g�n�ZT � sGñ �LV�V ��� � � �T i �ñ�_ � i ¤ñW_ ��f U�V#X � � �lYm�cYk:Xs^�Z �,o ��LV c X�Z�\Lc�^Lc1ñW_Lc<p��T f UWV#X�����lYm�c<k�X�^�Z � o ��LV c X�Z�\Lc�^Lc1ñW_Lc<p-�5�T f U�V#X � � �lYm�cYk:Xs^�Z �,o � �LV c X�Z:\Gc�^Lc1ñ�_rc�p��+���T n�nna¬céa�Y%XsY�U�V!a¬c��%X�X�c�g8oT �¤VGñ e �LV�XLð i� X�X�c�g n�ZT � d ��Y<q',�qwñ�k:X$XLñLZ � Xs^WV 1XGò�ò�a�ñ�c � V:X�^1X � ò�Y JX � d XwñrZ<XGò�Y 9a¬c��T 3 ��� Z 5 ������� ^ 5 Z ������� 5 � ^�^ � � ��� ����� ^ 5 Z ������� 5 � ^ ^ � � ���+�>o 3����+�T _9a�Y�, � ðGV�ñ:ò � ð�� � +�[ð�VGñ�ò c 1X ��i k�k JX�òGò � ð���� �rc�g9a ¤ñwc d X�c¤Y ��� �T ` X��� �¤aròGX � ð i� We$c ��3 � �ñ�c��Nqwñ�k�X½Z�ñ eZ9a�^73����T n�nna¬céa�Y%Xwð i� XGX�c�g

Page 121: Functional programming using Caml Light Michel Mauny January 1995

�#�L� �E3�������z� ���L� �/�����E�o�#������@���e���[���b��� �!����� �3�¿�x� �E����3� �������

T X�c<k1o�ovW�)x>}YzW��z:}S����x>��� �� �$���K� � 8W}��W| � 8 ��2���A8�}���|�����z � %%���y�,z:|�| � 8 � �b�W� �$�:�<�����>z � � � �� ��W{y��� ����� � ���>z]��{y�%�${�@W}Yz*8h|��${:�%��|����$��� {K� �Kx�xHz�����{W|Yz }<z�����z�N�����K� �W| x�{��$��z��� �� � ��� �����#�$�

T c c � V ��JòGX$X�Y¤ñ�VT 3�V:XsYeZ ��qsY e X Z#a�^ ����� Z 5 ����� c 5 a�ZNZ�c4��Y�,#X�c��T XLV�òGXhj½c � Z � ¿c �����T Z#a+���>o 3�� o�o% &��v�wyx1zh�:� �%{����S�W|�� '%���7@�z�2��� '%���@�z����������� ��{W}��� � ��� �����#�$�

T c c � V ��JòGX$X�Y¤ñ�VT 3�V:X�YæZ#a e e X Z#a�^ ����� Z 5 ����� c 5 a�ZSZ�c��ýYD,#X�c �T XLV:ò�XÃa�ZBZ�cB,[YD,9X�c �T XLV�òGX�� � Z � ½c ����� � Z � ýc4,=���T Z#aT Z#a��+�>o 3��>o$o% &��v�wyx1zh�:� �%��@S��|���'<����@�z��2��� '%���7@�z���������� ��{W}��� � ��� �����#�$�

T c c � V ��JòGX$X�Y¤ñ�V 3-Z��qsY � o 3�� o�o% &��v�wyx1zh�:�B���S�W|('%���@�z��� � � � �� � ��� �����#�$�

T c c � V ��JòGX$X�Y¤ñ�V 3-Z#a e � o 3��>o$o% &��v�wyx1zh�:�B���S�W|('%���@�z��� �� � ��� �����#�$�

j<,u;Q0WB�CP2tBL.�Dn0o+xy1BG050<;>IGF>+[|�H�=1m[mG+�0<;>DnH�IGF>+ � ,5B};È=G,5D5B�mG.12t+ýD5+�2t.�Dn0<;>BL=ÃIGÁ .10�;È=�?ÃH½0oyJ+�27;NÄ92¿0oÁG=G,nHL2t,o;Q22tBL=10o,7D5.12t,�8�0oy1+�27;QH�F�;È=10A,5D5.12t,o;>BL=10/Hw=1mWH�mG+�mr;Q2-H�,7+�mW2-HL0o+�,5BU,54�+�2tBL{PyG;NFN;>=�?PCM.�=12t,o;>BL=!~ �L+-+-� ���'" C¢BLD�+)( 27;>+-=�,2tBL{PyG;NFQH�,o;>BL=lB�CED5+�2t.�Dn0<;>BL=!8#m�H�,nH�0o,5D7.12t,5.�D5+�0�+-,n2�~

���!( ������� (�� �����nÏJÌMÎ�ÐoÎ-Ë-Ì�� Ï�Í�ÎK��Î�Ð �#�)Ë-Î-Ë��-ÊLÐ���9 �E�:9��EÎ��EÊLÏ�� Ì�Í�����Î�Ë-ÊLÒ ��Ì�� ÊLÏ:ËB�nÊLÏ:Ë��)Ë-Ì �QÏ�Î�ÏJÐ �E�:92�QÏGÍ ÑD� �tÊLÐ F�� Ï�ÍÌMÊW÷�Ê��GÐ�ÌMÑwË ÌMÎPÌ 9GÎ /���� ÒNÑLÏ�ÍD��Ñ�ÍrÎ�� /�Ò�Ë Ê� �1*� � Ò F�� Ï�ÍuÑWË-ÌMÑLÏGFrÑLÒNÊLÏ1Î /!��� �QÏJÌMÎ�Ð ø9ÐoÎ�ÌMÎ�Ð �>Ë�ÑPÍLÊ�Ê#FWÎK��Î�Ð �#�)Ë-Î � ÏÉ�Ê#F��GÒNÑLÐ�ø#Ð�ÊtÍLÐoÑLÉ�É �QÏGÍ��

Page 122: Functional programming using Caml Light Michel Mauny January 1995

� ��������� ���

� � #�� * $ # � � *�� * $ & ��# * #

h+�?�;>KL+�;>=�,54G;Q0z2741H�y�,5+-D'BL=�+�y1B�050�;ÈIGF>+�0oB�F>.�,o;>BL=UCMBLD�+�Hr254�+t��+-Dn27;Q0o+ 2tBL=G,nH�;>=�+�m�;>=P,54G;Q0EmGB¤2t.�{�+-=�,�~E���¤+-Dn27;Q0o+�0H�D5+�D5+tCM+-D5D5+�ml,5BuIGÁv,54�+t;>D�=G.�{�IJ+-D�H�=1ml,54�+�y1H�?L+�O/4�+-D5+�,54�+-Ál41H�KL+�I1+-+-=hy�D5Bry1B�0o+�m#R�CMBLD3+t�:H�{�yGFÈ+L8 � � ~ � 8y!~ � � ��D7+tC¢+-Dn0�,5BP,54�+3Ä1Dn0A,/+t�¤+-Dt27;)0A+�;>=ê2741H�y�,5+-D � Ç�,54G;Q0/+t��+-Dn27;Q0o+�;)0�F>B¤2-Hw,5+�muBL=vy1Hw?L+ � � ~

/1- * � 6 -L* ���4�+3CMB�FNF>BsO�;È=�?l|�H�=�Br=�ÁG{PBL.10 � CM.�=12t,o;>BL=10�41H�Kr+�,54�+�D5+�qr.G;ÈD7+�mv,oÁGy1+�0-R

� ~ T Z c c�q�Y#asñwcÃZB�� � ZB,�� � �,o�o� �����K� �B��� ��� ���B���h�K� �����������7�

� ~ T Z c c�q�Y#asñwc d �� � Z c c,qsY#asñwc[c2+�½c=� d � ���>o�o� � ��� �B���h�K� �B���S��� ���B���������

�~ T�� Z c c,q�Y9a�ñ�c[Z2�� � Z c c�q�Y9a�ñwc d �� Z �2d � ��� ��,��+�>o$o� �����K� �B��� ��� ���B���h�K� �B���h�K� ������Y���7�

/1-% � 6 -L* � h+�{�.10o,�Ä1Dt0o,/D5+-=1H�{�+ U ,5B � 8GBLI�,nHs;È=G;>=�?1R

� Z c c�q�Y#asñwcÃ^B�� � Z c c,qsY#asñwc � +� ^-� � ���

H�=1m�Ä1=1H�FNF>Á#R

� Z c c�q�Y#asñwcSUB�� � Z c c,qsY#asñwc � +�[U-� � ���

�;>,54�BL.�,/D5+-=1Hw{�;>=�?18�O�+�O�BL.GFQmW41H�KL+�BLI�,nHs;È=�+�m#R

� Z c c�q�Y#asñwcSUB�� � Z c c,qsY#asñwcSU+�[U-�WU ���

O/4G;Q274êmGBG+�0/=�BL,/mG+-=�BL,7+�,54�+�05Hw{P+3C¢.�=12t,A;ÈBr=!~

�'���

Page 123: Functional programming using Caml Light Michel Mauny January 1995

�#��� �E3�������z� ���-�v���@���h�����¿���[� �Ý���@�'����� �

/1-0/�� 6 -L* � h+�O/Do;>,5+�0o.12-2t+�050<;>KL+tF>Áh,74�+�D5+�mG.12t,o;>BL=ý0o,5+-y10�C¢BLD3+�HL274x+t�¤y�D5+�070<;>BL=10-8!H�=1m�,54�+-=xO�+�.10o+ .�H�{�F';>=xBLDnmG+-D�,5B274�+�256u,54�+�D7+�0o.GF>,�~

C V�X�Y[^�Z � ��,a-c �+� Z c c,qsY#asñwc U +�[U-�r^ �ý^ � o�o� Z c c,q�Y9a�ñ�chU2��[U�� � � ��,=��� � � �+,�� o�o� Z c c,q�Y9a�ñ�chU2��[U�� � � ��,=��� � o�o�+� � � ��,=�>o$o�+���1o�o1o�o.�H�{�F�05H�Á�0-R

T V�X�Y[^�Z � ��,a-c �+� Z c c,qsY#asñwcSU+�[U-�r^ �ý^ � o�o� � ��� ��� �

C V�X�Y[^�Z � ��,a-c �+� Z c c,qsY#asñwcæ^ +� ^-�r^ �ý^ � o�o� Z c c,q�Y9a�ñ�c[^2�� ^��r^ � � � �+,�� o�o�+���1o�o1o�o.�H�{�F�05H�Á�0-R

T V�X�Y[^�Z � ��,a-c �+� Z c c,qsY#asñwcÃ^+� ^-�r^ �ý^ � o�o� � ��� ��� �

C V�X�Y[Z7��Z�Z c c,q�Y9a�ñ�cÃZ-,�� � Z c c,qsY#a�ñ�cÃ^2��½Z�,[^ �a-cdV:XsYS�SZ[Z c c�q�Y9a�ñwcô^ +�½^-� �

a¬cdZ7�F�B, o�oV�X�Yh�BZ[Z c c,qsY#a�ñ�c[^2+��^�� �a-cÃZ c c,qsY#a�ñ�cÃZ-,+� � Z c c,qsY#asñwcÃ^2�� Z-,[^ � �B,1o�o� Z c c,q�Y9a�ñ�c[Z�,4+� � Z c c�q�Y#asñwcÃ^2+�½Z-,[^ �+� � Z c c�q�Y#asñwcÃ^2+�½^-� ����, o$o� Z c c,q�Y9a�ñ�c[^2�� � Z c c�q�Y9a�ñwcæ^2�� ^-� ���ý^ � ,1o�o� Z c c,q�Y9a�ñ�c[^2�� ^�� ��� , o�o,+� �,o�o�1o�o.�H�{�F�05H�Á�0-R

T V�X�Y[Z7��ZôZ c c�q�Y#asñwcæZ-,�� � Z c c�q�Y9a�ñwcæ^2�� Z-, ^ �T a-cdV:XsYS�NZ Z c c�q�Y9a�ñwcô^ +�½^-� �T a¬cdZ7�r� , o�o� � ��� ��� �

1- * � 6 -'/1*��B@2tBL{Py�.�,5+�,74�+�0o.�DoCkHL2t+�H�D7+�H�BwCùH�D7+�2t,nH�=�?�F>+�Hw=1mu,54�+�KLB�F>.�{P+UB�CùH�0oy�4�+-D7+LR

Page 124: Functional programming using Caml Light Michel Mauny January 1995

�#�

T V�X�Yò c �Z��q�X�X�JX�qsYÃV:X�cS_#aykhZÃV:X�cIjr_#a:k1o�o|������<{���z:~���z��W� � ��� �����S��� �����S�K� ���B�������7�T V�X�Y]Véa[Z�� 5 �tj 5 ��Y��c � 5 � o$ox��?�b��}��${������8�$� � ������� ���������T V�X�Yhg¤ñGV c�d X$XGòV2,#X�JX BZ�� 5 � � 5 � 5 �Sj 5 V!ahj 5 � V1ñ�_JX� � 5 � o�o����}���.z�~$|Kx��.z���z �L��}���{$�����[��}���{$������Y���7�

1-% � 6 -'/1*jk=ýHW2-H�FNF�MIGÁ�MKsH�F>.�+uFQH�=�?L.1H�?r+PO�;>,54�BL.�,�2tBL=1mr;>,o;>BL=1H�F�2tBr=10o,5D5.12t,�|�Hw=1mvO�;È,74�BL.�,�0o.�{ ,oÁGy1+�0 � 8�H�FNFzy�D5BL?rDnH�{@0;>=�KrB�F>KL;>=�?WH�D5+�2t.�Dn0<;>KL+�mG+tÄ1=G;>,o;>BL=x=�+-KL+-D ,7+-D5{�;>=1H�,5+L~

1-0/�� 6 -'/1*T V�X�Y 1X�q Z�$q�Y¤ñ #a �LVýc Z a�Z�c<Z �ýYD,#X�c ��XLV�òGXýc�j � Z ��qsY�ñ 9a �wV � c =�����>o$o�%{��W�$�:�%�${W}?� ��� �B���h��� �A�B��Y���7�T Z ��qsY�ñ 9a �wV1o�o� � ��� ��� ��� �

T V�X�Y[Y ��asVYX 1X�q c Jò¤a�g1X�X�Z ��qsY�ñ 9a �wV}c�ZT V�X�Y 1X�q½Z ��q�Y[c d Zba�Z[cYZ �}Y�,#X�c d XwV:ò�X½Z�$q�Y � c =��� � c,j d �T a-cÃZ�$q�Y�c�� o$o��{$�W}$~��,z$�����Y|��$��z:~��%{��W�$�:�%�${W} � �K� �B��� ��� ���B�������7�T Y ��asVYX 1X�q c Jò¤a�g1X�X�Z ��qsY�ñ 9a �wV� o$o� � ��� ��� ��� �

1- �� 6 -'/1*T V�X�Y 1X�q Z#a e ñ�c ��q$q�axc ZT a�Z�c<Z � Y�,#X�c �T XwV:ò�XÃa�Z[c<Z+,�YD,9X�c �T XLV�òGX½Z9a e ñwc �$q�q¤a � c =��� �[Z#a e ñ�c ��q$q�a � c ,�� o�o�%�+@��K� {��$�W� � ��� �B���h��� �A�B��Y���7�T Z9a e ñwc �$q�q¤a ,+� o�o� � ��� ��� � � ���

1- + � 6 -'/� T V�X�YNqwñ d V1ñ:ò�X½ZS�BZ�Z c c,q�Y9a�ñ�cÃ^2��½Z � � � ^ ��� o�o�W�K��x.�W|<z � ��� {����� @ � ����� �)������ {�������)������ @�����Y����T V�X�YNq c �U[ZBZ[Z c c,q�Y9a�ñ�cÃ^�� � Z c c�q�Y9a�ñwc U�� Z � ^1� U ��� o�o��������w � � � { � � @B��� �)� �B��� ��{B��� � @������*�B�������7�

Page 125: Functional programming using Caml Light Michel Mauny January 1995

�#�:� �E3�������z� ���-�v���@���h�����¿���[� �Ý���@�'����� �

T V�X�Y c c,q c $U[ZBZ[Z c c�q�Y9a�ñwc � ^0��U � +�½ZÃ^SU o�o���>�������Ww � ��� {����� @���� �)� ������ { �� @B��� �����B���������T�c c,q c $UNqLñ d V:ñ:òGX.o�o� ��� ��~�{B��� ��~-@�� �#� ��~<����� ��~�{����� ��~Y����� ��~-@����������7�T qwñ d V1ñ:ò�Xhq c $U c c�q c �U8o�o� ��� ��~�{B��� ��~-@B��� ��~Y� �B��� ��~�{B��� ��~-@B��� ��~Y� �B��Y���7�T qwñ d V1ñ:ò�X c c�q c �UBq c �U8o�o� ��� ��~�{ � ��~-@B�����~Y� ����� ��~�{ � ��~-@������~<�����Y����

+.- * � 6 -'/ �T V�X�Y 1X�qSqLñ dYe a¬c#X ZT Z c c,qsY#asñwc �� � �� �� ��T ` � ^�� n�n�V ����� � ^-, n$noV+,��<�� � ^��7��^-,=��n�n � qwñ dYe a¬c9X � V �7�AV�,��+�T ` XA+� ��aLòGX � s �¤a�V c JXB3:qLñ dYe a-c#XHnuV1arò�Y1ò ñrZBk1a�ZGZ1X 1X�c�YôV:X�c��GY�,�3�� o�o�W�K��@$���.z � ��{]}���|�� � � @ }��W|�������� ��{ �� @��]}���|������������7�T qwñ d�e a¬c9X � � � o , o � � � � 3 �>3 o 3 e 3,o 3:q=3 � �>o�o� �����K� � �]|��:�%�K�����]}���|���� � � � �K{ � ��� � � @ � ���� �� � T qwñ d�e a¬c9X � � � o , o � � � � 3 �>3 o 3 e 3 � � o�o���>�W{������ �Sz�����z�x����$��� ���<{��W}$����z�������@$���>z�� }��W|���|S�:���$�:����z���z � ��}<z���� ��� �

+.-% � 6 -'/ �T V�X�Y 1X�qÃò c$e V1arò�Y1ò[ZT Z c c�q�Y#asñwc ��� �� � ����T ` ^ n�n�VA��æV:XsYòLVSZò c$e V1arò�Y1ò VT a¬cåòwV�� � d �V � Z c cÙVA+��^ n�n�V���òwV��>o$o|���@W}��W|���|?����{ }��W|������� {h}��W|��[}��W|����B���������T ò c�e VJaròsYJò ��� o$o� ����~�{h}��W|��]}���|���� ��� �

T ò c�e VJaròsYJò � � o , o � � o$o� � ��� �h}��W|��]}���|���� ��� � � �� � � � � � ��� �� � � �� � � �� �� � � ��� � � � ��� ��� ���

T ò c�e VJaròsYJò � 3 �>3 � o$o� � |��y�%�K����}��W|��h}��W|���� ��� � � � { � �

�1- * � 6 - �T Y$UWV9X � / ����/ e � e Y 1XGX[Z �JX ��ZÃñLZ / eT ` �GY JX�X ñrZ � / ���+/ e �hc1ñ�k�XT ��c<k � / ����/ e �}c1ñ$k:X Zhl��V�n�/ �.o

Page 126: Functional programming using Caml Light Michel Mauny January 1995

�#���

T � ñwc5�>n � / ����/ e � e Y JX�X�oT � ñwc>, n � / ����/ e � e Y JX�X�p o$ov�wyx1z*@$�:��z�z]��z��%�K�.z��1�v�wyx1z � ����z ��z��<���.z��1�T V�X�Y 1X�q½c1ñ$k:X�ò�X ��c<k�XLV:X �:g1XGòOZT Z c c�q�Y#asñwc �1X �sZ[^2�� � ��� � � ^ � �T ` ��Y 1XGX[l��V<ZL^ o � ñwc5��Z:ò>� o � ñwc>,�Z:ò ,�pA+�T V:X�Y � c1ñ$k:X�ò=�7�AV:X �:gJX�ò=��� Z�c1ñ$k:X�ò�X ��c<k�XLV:X �:g1XGò½ò=�T ��c<k � c1ñ$k:X�ò�, �AV:X �:gJX�ò�,=� Z�c1ñ$k:X�ò�X ��c<k�XLV:X �:g1XGò½ò�,T a¬c � ^�n�nMc1ñ$k:XGò>� ��c1ñ�k�XGò , � V:X �ygJX�ò=� ��V:X �:gJX�ò�,=�>o�o� �$��z:|�~�{K� ��~�}<z�{���z�|���� ��{ � � @���@��y�,z�z����� {h}���|�� �� @]}���|����B�������7�T c:ñ�k�XGò�X ��cYkYXLV�X �ygJXGò � ��Y 1XGX[l��V<Z 3 � 3 o � ñwc5��Z�JX �sZ�� o � ñwc=,$Z �1X ��Z�,�p=�>o$o� � |��y�%�K����}��W|�� �S��� �]}���|���� � � � � � � ��� �

�1-% � 6 - �T V�X�Y 1X�q d �V,X e Y 1XGX¿ZS�NZ[Z c c,qsY#asñwcT �1X ��Zæ^ +� �JX �sZ � ZÃ^ �T ` ��Y JX�X[l �V<Z�ñ�V�o � ñwc5��Z�ò=� o � ñwc>,�Z�ò�,�pT +���GY JXGX l��V<Z��Ãñ�V o � ñ�c��Z d �V,X e Y 1XGX¿ZS� ò>� oT � ñ�c=,$Z d �V,X e Y 1XGX¿ZS� ò ,�p1o�o� {)x>~�@��:��z�z �(� � {B��� � @�����#� �)����� ��� �B����� �)��� ��{ ��@$�:��z�z�������� � � � @��A@$�:��z�z*���Y����

�1-0/�� 6 - � h+u=�+-+�m½,5Bl?�;>KL+vH�C¢.�=12t,A;ÈBr=1H�F�;È=G,5+-D5y�D7+-,nH�,o;>BL=½,5B e Y JX�X m�Hw,nHv2tBL=10A,5D5.12t,5BLDt0-~ h+u.10o+ Z |kD5+�0Ay!~ �1� ,5BmG+-=�BL,5+�,74�+/CM.�=12t,o;>BL=vHL050AB¤27;QH�,5+�mu,7B�,54�+ �JX ��Z |kD5+�0oy!~ ��Y 1XGXG� m�H�,nHU2tBL=10o,5D7.12t,5BLD�8GBLI�,nHs;È=G;>=�?P,74�+/CMB�FNF>BsO�;È=�?.�H�{·F�mG+tÄ1=G;>,o;>BL=!R

T V�X�Y 1X�q e Y JX�X�X�a�Y[Zh�BZ[Z c c,q�Y9a�ñ�cT �1X ��Zæ^ +� Z[^T ` ��Y JX�X�l��V<Z�ñ�V o � ñwc��Z:ò>� o � ñwc=,$Z:ò ,�pT ��[�Ãñ:V ��e Y JXGX$X�a�Y�ZS�bò=��� ��e Y JX�X�X¤a�Y[ZS�ò ,��T o$o@��y�,z$z�~��$� ����� {B���� @���������������� � @����� @����� @�������������� � { ��@$�:�,z$z����� @����Y����T�e Y 1XGX�X¤a�Y � Z c c,q�Y9a�ñ�c[^2�� ^ �T � Z c c,q�Y9a�ñ�c�3 � 3*�� V JXsZ#a�^ �T ` X��� ��arò�X � s ��asV c 1XB3 \�c�^Lc1ñW_LcÃñ:V�3����T � �GY JXGX l ��VYZ 3 � 3 o � ñ�c��Z �JX ��Z��,o � ñwc>,�Z�JX �sZ�,$p�� o�o� � ��� ��� �

Page 127: Functional programming using Caml Light Michel Mauny January 1995

�#��� �E3�������z� ���-�v���@���h�����¿���[� �Ý���@�'����� �

�.- * � 6 -b+ T Y$UWV9X � / ����/ e �½V1aròV,X�qwñwc9ò[Zhl d�c Y � e V�X ð ���n�/ ��o dYc Y � e V:X ð$k �n�/ e p o�ov�wyx1z }��W| x>~<������|S��z�%���>zW�H�T V�X�YNq � hVBZ]V 5 ð ��T ��c<ktq�k hVBZ]V 5 ð�k T ��c<k �V1V ��q �OVNgBZ]V 5 ð ��.��gT ��c<k �V1V ��q�k�VNgBZ]V 5 ð�k .��g8o�o�W{y� � � ��{ � � @ �h}���|Kx>~Y�W�K�,|B��� � {�����Y���7��W�y� � � ��{ � � @ �h}���|Kx>~Y�W�K�,|B��� � @�����Y���7���x }�{��W{ � � ��{ � � @ �h}���|Kx ~<�W�K�,| ���� { ���h��� �����B�������7���x }�{��W� � � ��{ � � @ �h}���|Kx ~<�W�K�,| ���� @ ���h��� �����B�������7�T V�X�Y]V ZSlGð � �Z � o�ð�k �ZrY c X�p o$ox �����K� � � @$����}�]}��W|Kx ~<�����,|�����8${:�� ���<8$�:��S�:���<z��T �V1V ��q �OV2,1o�o� � ��� �����#�$�

T V o�o� �����K� � � @$����}�]}��W|Kx ~<�����,|�����8${:�� ���<8$�:��S�:���<z��

�.-% � 6 -b+ T V�X�YòsY� d V,X$qLñ c c�Y1X Z JX�ZB�1o�o|��${���x>~<���W�� ��z��� �K� ����z��2���,z� �T V�X�YòsY� d V � �]ZT òsY� d V,X$qLñ c c�Y1X �n�Z2�<� 7òsY� d V,X$qLñ c c�Y1X o� 7òsY� d V,X$qLñ c c�Y1X 8o�o|��${���x � ��� �$�����S�K� ���B�������7�T òsY� d V � �>o$o� � ��� ��� �

T òsY� d V � �>o$o� � ��� ��� �

�.-0/�� 6 -b+ T V�X�YXs^%q#, ��c��JX½Yåa � ZT V�X�YhgBZ�Y 5 � a+�Ãa¬cSg1X�q�Y<X ��òGò�a�rcÃYÙa Y 5 � � �>o gJX�qsY%X �GòGò¤a��Lc[Y � gT o$oz���� � {����>z ����{t��z��������S��� �����S�K� ����� �� �$���B���Y����T V�X�Y � c a�q:^%X�òLñ GY[YBZT V�X�Y 1X�q � c aWqy^dVGñ ,éa]ZT a�ZdVGñA. ,!aT Y�,#X�c e X:�9a¬c

Page 128: Functional programming using Caml Light Michel Mauny January 1995

�#���

T V�X�Yåa[Z JXsZV�ñT ��c<k � Z JXsZ�,éaT ��c<k]V Z�Y 5 � ,!a+�[a¬cT _�,!a�V�X? ta*.? �T kGñT _D,éa�V�X ta�. ,!a��ÃY 5 � na��*.�Z 5 VBk�ñ a-c,q�ba[kGñwc9X�oT _D,éa�V�X � �æVGñ��hV�.�Z 5 Y 5 � � ��k�ñtk�X�q� � kGñwc9X�oT a�Z na*.? � YD,9X�cbXs^%q', ��c��JX½Y ta �T kGñwc9X�oT Xs^%q', ��c��JX½Y6,!a na>oT � c aWqy^dVGñ � ta�B��� oT � c aWqy^ � ta � ��� ,!aT X�c<kT XLV�òGX � �T a-c�� c aWq:^ � � gJX$q�Y%XwV:X�c��GY�,[Y24���T o$o�W����� �%~�|��:�<� �L�Y}���{$�h��z$�W�B���]�� �$�A� ���Y����T V�X�Y � Z ��` , 5 �1o � 5 1o � 5 � o � 5 �1o<� � 5 � o � 5 � ` � o�o{?�b�Y}���{$�t��z������ � ��� � ��� ��� � � � � � � �1� ���(� �1� � � �.� � � T � c a�q:^%X�òLñ GY ��o�o� � ��� �����#�$�

T �.o�o� �b�Y}���{$�t��z������ � � �H� ��� ��� � � �.� � � ��� ��� �8� ��� � �H� � �

!1- * � 6 -b+ !T V�X�Y 1X�q Z#a-c<k�XGò c q�q�XGX�k½ZBZ�Z c c,qsY#a�ñ�cT ��� +� �¤arò�X � s ��a�V c 1XB3¬Z9a¬c<k�XGò c q�q�XGX�k 3��T ` ^ n�noV��� Y $U[ZÃ^ ov^h_#a�YD, X�+��Z9a¬cYkYXGò c q$qGXGX�k ZdVT o$o�%�K� ��~�|��Y���$z�zW� � � ��{����� @��������{ }��W|������� {����Y����T V�X�Y�,YkSZôZ c c�q�Y#asñwc �� �� ��arò�X � s ��asV c 1XB3wX d V¤Y�U�3�� ` ^ n�noV��� ^ o$o� �?����{h}��W|��������{��B���Y����T Z9a¬cYkYXGò c q$qGXGX�k ,Yk ���� o ��� o � � o , � o � �1o � � � o$o� � ��� �h}��W|���� � ����

!1-% � 6 -b+ !T V�X�Y 1X�q d �V,X�ò c q$qGX�X�k½ZNZ[Z c c,qsY#asñwcT ��� +� ��T ` ,�n�n<YB�� Y $U � Z6,��.n�n � d �V,X�ò c q$qGX�X�k½Z[Y �T _#a�YD,�X��� d �V,X�ò c q$qGX�X�k�ZÃY o$o

Page 129: Functional programming using Caml Light Michel Mauny January 1995

�#��� �E3�������z� ���-�v���@���h�����¿���[� �Ý���@�'����� �

� {)x>~$|��<�$��z$zW� � ��� {B��� � @ �B��� � {h}���|������� @]}��W|�������Y����T�d ��V�XGò c q�q�XGX�k ,<k � �� o � � � o � , o � � o � �8o o � � o�o� � ��� �h}��W|���� � ������ ��

�1- * � 6 - � /��4�+3Ä1Dn0A,zCM.�=12t,o;>BL=x| qLñ�V�UJ� ,541Hw,�O�+�mG+tÄ1=�+�HL050o.�{�+�0z,741H�,�;È,t0�HwD5?L.�{P+-=G,n0�H�D5+3D5+�0oyJ+�2t,o;>KL+tF>ÁW,54�+/;>=�y�.�,�H�=1m,54�+�BL.�,7y�.�, 2541Hw=�=�+tF ~���4�+-ÁvH�D7+�HL050o.�{P+�mu,7BPI1+�H�F>D5+�HrmGÁWBLy1+-=�+�m#~

T V�X�YNqwñ�V�U a-c,q#,dñ c Y%q',tZT � jÃa¬c�q', ��c<kÃñ c Y%q', � JXÃò c V�V:ñ:ò�X�k½Y�ñ e Xæñ�V9X�c9X�ktq#, ��c�c#XwV:ò[j-�T Y �U � j �$q�Y c �LVSqLñ�V�U#a-c��Nj��T _�,!a�V�X½Y c XT k�ñeñ c Y�V c Y<X�q#, � æñ c Y%q#, � a-c�V c Y%X$q', ��ba¬c�q',7�T k�ñwc#XT _#a�YD, �rcYkYXwñrZ%XsZ#asV:X��� � j a ñ d �LV YJX d a-c ��Y9a�ñ�c�j-�T ��aLòGX��Lc<kYXwñrZ<X�Z#asV:XT ` ò:U1ò�X$X � U1ò�X�X ¤ñ d òy��� � j iWe c:ñ d �LV YJX d a-c ��Y9a�ñ�cNj��T V JX� %X�X�cYkGVJa-c#X d òy� oT ��aLòGX � s ��asV c JXB3:q�V�3��T ` X�+� � j�\Gc�^Lc1ñ�_X�^<qGX�V¤Y#asñwc � d �yU e XÃa¬c¤YJX c V�Y#asñwc��]j��T V JX� %X�X�cYkGVJa-c#X 3 \�c�^rc:ñW_LcbX �ñ _D,!asV:Xhqwñ�V�U#a¬c���3,oT ��aLòGX � s ��asV c JXB3:q�V�3��T o$o�W�)x%w � �K�,~<��� {K���.z:}B��� �W����~<��� {��$�.z:}���� �� �$���B���Y������4�+u=�+t�¤,·C¢.�=12t,o;>BL=½Bry1+-=10�2541Hw=�=�+tF)0u2tBL=�=�+�2t,5+�mý,7BW;>,n0�Ä�F>+-=1H�{P+êHwD5?L.�{P+-=G,n0-8EH�=1mý2-H�FNFQ0 qwñ�V�U BL=ý,54�+�0o+2741H�=�=�+tFQ0-~ ��4�+�HLmGKsHw=�,nHw?L+�B�Czmr;>KL;Qmr;>=�?v,74�+�2tB�mG+�;>=G,5Bu,�O�BUCM.�=12t,o;>BL=10�;Q03,541H�, qLñ:V�U y1+-DoCMBLD5{@0�,54�+�HL2t,5.1H�FO�BLD56#8EH�=1m¿2-Hw=½I1+uD5+-.10o+�m};>= mr;Nüé+-D7+-=�,@Hwy�yGFp;Q2-H�,A;ÈBr=10-8zO�4G;pF>+l,54�+@D7B�F>+WB�C qV ;Q0�{�BLD5+ �-HLmG{�;>=G;Q0o,5DnHw,o;>KL+��;>=[,54�+ê0o+-=10A+v,541H�,·;È,WmGBG+�0u=�BL,54G;>=�?¿I�.�,uBLyJ+-=G;È=�? Hw=1m 27F>B�0<;>=�? 2741H�=�=�+tFQ0WH�=1m½y�Do;>=G,o;>=�?½y1B�070<;>IGFÈ+}+-D5D5BLD{P+�0507H�?L+�0-~

T V�X�YNqVdZ��}Z�,tZT � j ��V9X�c!a-c��Nq#, ��cGc#XwV:ò��WZ��}Z9a 1ò�Y1� YD,#X�cdZ-,tj��T V�X�Yba-c,q',tZT Y �UÃñ:V#X�c�X�a-cÃZ��T _9a�YD,Ùò:UJò$X�X � UJò$XGX� �ñ d ò:�2��T V JX� <XGX�cYkGV1a¬c#X � Z7� ��3>n&3�� d òy� � oT ��aLòGX � s �¤a�V c JXB3:q�V53��T ` XA+��V JX� <XGX�cYkGV1a¬c#X � 3�\Gc�^rc1ñ�_rcdX�^<qGX�V¤Y#asñwcS_�,!a�V�X ñ�V9X�céa¬c�� 3 ��Z7��� oT ��aLòGX � s �¤a�V c JXB3:q�V53��T a-cT V�X�YÃñ c Y%q#,BZT Y �UÃñ:V#X�c�XLñ c Y[Z�,T _9a�YD,Ùò:UJò$X�X � UJò$XGX� �ñ d ò:�2��

Page 130: Functional programming using Caml Light Michel Mauny January 1995

�#���

T qLVGñ�òGX$X�a¬cÙa¬c�q', oT V JX� <XGX�cYkGV1a¬c#X � Z�, ��3>n&3�� d òy� � oT ��aLòGX � s �¤a�V c JXB3:q�V53��T ` XA+�SqLVGñ�òGX$X�a¬cÙa¬c�q', oT V JX� <XGX�cYkGV1a¬c#X � 3�\Gc�^rc1ñ�_rcdX�^<qGX�V¤Y#asñwcS_�,!a�V�X ñ�V9X�céa¬c�� 3 ��Z�,�� oT ��aLòGX � s �¤a�V c JXB3:q�V53��T a-c � jæðGñ:V�U9a¬c�� ��c<k YD,#X�c�qLV�ñ:ò¤a¬c��Bj-�T Y $U qwñ�V�Uba¬c�q',dñ c Y%q#,T _#a�YD, �Lc<kYXwñrZ<X�Z#asV:X�+�hqLV�ñ:ò�X�X�a-cåa¬c�q', o qLV�ñ:òGX$XLñ c YÃñ c Y%q#,T � jhqLV�ñ:òGX$XLñ c Y[Z¤V c ò#,#X�òhj-�T ` Xs^%q���SqLV�ñ:ò�X�X�a-cba-c,q#,�o qwVGñ:ò�X�Xwñ c Yôñ c Y<q', o �¤aròGXæX�^%qT o$o� x � |��:�<����� ���h|��y�%���$� ���h�� �������Y����*#+-,/.10�,5D5Á qV R

T qV 3 ��X�Y<q���V �Gò�ò:_�k 3�3 �sY d V ��Z¤ñGñ 3 o�o� � ��� �����#�$�

T qV 3 �sY d V ��Z¤ñGñ 3�3 �sZ�ñGñ 3 o$o� �<��� � � �<��� � � z��:� ��|�|��$��� ��z � ��zW����>�W{������ �Sz�����z�x����$��� ���<{��W}$����z���x ���4�+�FQHL0o,z+t�1H�{PyGF>+3CkH�;NF>+�muI1+�2-H�.10o+�HUD5+-?L.GFQH�D�.10o+-Dù;)0�=�BL,�H�FNF>B�O�+�mP,5BUO/Do;>,5+�H�,z,74�+/D5BGBL,zB�C!,54�+�Ä�F>+�0oÁ�0o,5+-{v~

�1-% � 6 - � /í 0E;>=W,54�+3y�D5+-Kr;>BL.10�+t�¤+-Dn27;Q0o+L8:,54�+/CM.�=12t,o;>BL= qLñ c c�Y yJ+-DoCMBLD5{@0�,54�+�HL2t,5.1H�F!2tBL.�=G,o;>=�?1~'jk,�O�BLD56�0EBL=WH�=�;È=�y�.�,2741H�=�=�+tF�H�=1m�D5+-,5.�D5=10/H·y1H�;>D/B�C';È=G,5+-?L+-Dt0-~T V�X�YNqwñ c c�Yba-c,q', ZT V�X�Y�q', � 1ò[Z JX�Z �T ��c<kÃVJa-c#X�ò[Z JX�Z � a-cT Y �UT _�,!a�V�X½Y c X kGñT V:XsYNq Zba¬c�V c Y<X�q', � da¬c�q',åa-cT q#, � 1ò�n�Z� �q', ��Jò����,oT a�Z q Z�� � c��WY�,#X�cdVJa-c#XGò n�Z oV1a¬c#X�ò���� XLV�òGX � �T k�ñwc#X.oT � q', � 1ò��� �VJa¬c9XGò��T _9a�Y�, �Lc<k�XLñrZ<X�Z9a�V:X��� � q', � 1ò��� oVJa-c#X�ò-�T o$o�W����� � � ���,~Y� � {����>z�} ���S��� � �S��� �A� ���Y������4�+3CM.�=12t,o;>BL= _%q BLy1+-=103HP2741H�=�=�+tF�BL=�;È,t0�Ä�F>+-=1H�{P+�HwD5?L.�{P+-=G,�8�2-H�FNFQ0 qwñ c c�Y H�=1muy�DA;È=G,n0�,54�+�D5+�0o.GF>,�~T V�X�Yh_<q ZNZT V�X�Yåa¬c�q',BZ

Page 131: Functional programming using Caml Light Michel Mauny January 1995

� � �E3�������z� ���-�v���@���h�����¿���[� �Ý���@�'����� �

T Y �Uôñ�V#X�c,X¤a¬cÃZT _#a�Y�,bò:U1ò�X$X � U1ò�X�X ¤ñ d òy� +�T V JX� <XGX�cYkGV1a¬c#X � Z �-3 n&3 � d ò:� �>oT ��aLòGX � s �¤a�V c JXB3K_%q>3��T ` XA+��V JX� <XGX�cYkGV1a¬c#X � 3�\Gc�^rc1ñ�_rcdX�^<qGX�V¤Y#asñwcS_�,!a�V�X ñ�V9X�céa¬c�� 3 ��Z �>oT ��aLòGX � s �¤a�V c JXB3K_%q>3��T a-cdV:XsY � q', � Jò��5V1a¬c#X�ò-�OZtqLñ c c¤Y a-c,q#,T a¬c V #a¬c¤Y%X¤a¬c�YBq', ��Jò.oT V #a¬c¤Y%X�ò�Y 9a¬c���3 q', � ��q�Y1X 1ò�� 3,oT V #a¬c¤Y%X¤a¬c�YôVJa¬c9XGò.oT V #a¬c¤Y%X�ò�Y 9a¬c���3ýVJa-c#X�ò 5 � c�3T o$o��� � |��:�<����� ���h��� �����B�������7�.zBL.�=G,o;>=�? �GXsY%q��V ��òGò:_�k ?w;ÈKr+�0-R

T _<qB3 ��X�Y<q���V �Gò�ò:_�k 3 o$o� � �����B� � {:�%{��W��z��Y|�� �����]}��K�.z:|8�� � ��� �����#�$�

*��1- * ��6�- � �*#+-,/.10�D5+�2-H�FNF�,74�+�mG+tÄ1=G;È,A;ÈBr=103B�C�,74�+�,�ÁGy1+ Y¤ñW^JX�c Hw=1mWB�C�,74�+�F>+t��;Q2-H�FzH�=1H�F>ÁGè-+-D�RT Y$UWV9X½Y�ñ�^JX�ctZT � �W\ � ` m a \ � `bf m � � ` � m�� ` ��� i � ` ��� i �T�` m a�f ñLZ a-c�Y8o�ov�wyx1z]�$� � z � ��z��%�K�.z��1�T�� j � V ��q�XGòhj��T V�X�Y 1X�qÃò�V ��q�XGò[Z[Z c c,qsY#a�ñ�cT � . / � � ` � � Y � ` � � c���ovò�V ��q�XGòhX�� � �� � �T�` � .�� � �� � �>o$o|Kx.{��$z�|?� � � {:�t|��:��zW{�� ���h��� �����B�������7�T�� jhm�c¤YJXy�JX 1òhj-�T V�X�Yba-c�Y<XLñrZ<X�k1a��#a�YSZ�Z c c,qsY#asñwcT � � � 5 5 � � � �GòSq��� � a¬c�Y<XLñLZ%X�q#, ��tq�� � a¬c�Y<XLñLZ%X�q#, �� � � �:�T�` X�+� ��aLòGX � s �¤a�V c JXB3tc1ñLY � kJa��9a�Y73��>o$o��� �W~��:�Y~����K� ��� � � � {:�2���t�K� ���B��Y���7�T V�X�Y 1X�qda¬c¤YJXy�JX cBZ[Z c c�q�Y9a�ñwcT � . / � � � 525 � � � �Gòhq.o � a¬c¤YJX:�1X � � ��j�cB�ba¬c¤Y%XwñrZ%X�kJa�#a�YSq-�+� 2� � �� T�` � .�� � ��¿c�o�o��� ��z��.z�� � �K� �����B� � {y�t|��y�,z�{�� ���t�K� ���B��Y���7�T�� j f ,9XæV:X�^9aWq �LV ��c �LV�U � X Nj��T V�X�Y 1X�qæV:Xs^JX�ò Z d �sY%q',åò�_9a�Y�,

Page 132: Functional programming using Caml Light Michel Mauny January 1995

� �

T � . / � � ��oêò�V �$qGX�òhX�� � �� � . / ��� i �8ovV:Xs^JX dòA� �T�` � . / � � ��oêò�V �$qGX�òhX�� � �� � . / ��� i �8ovV:Xs^JX dòA� �T�` � . / � � ��oêò�V �$qGX�òhX�� � �� � . / ����\ � ovV:Xs^JX dòA� �T�` � . / � ��oêò�V �$qGX�òhX�� � �� � . / m a \ � ovV�X�^JX�ò�� �T�` � . / �)j ��oêò�V �$qGX�òhX�� � �� � . / f m � � ovV�X�^JX�ò�� �T�` � . / � � ��oêò�V �$qGX�òhX�� � �� � . / � m�� ovV�X�^1X ò�� �T�` � . / � � � 5 5 � � � ��òhq�o � a-c�Y1X:�JX� � a-c�Y<XLñrZ<X�k1a��#a�Ytq����}c ohò�V �$qGX�òhX�� �T +� � . /�m a$f c�oêV�X�^JX�ò�� � o�o}<z�,z� � � � {y�t|��y�,z�{�� ���t�$� � z ��|��:�,z�{����B��Y���7���4�+�y1H�Dt0o+-D/41HL0�,74�+�05H�{�+�0o41H�y1+�Hr0�,54�+�?LDnHw{P{@H�D�RT V�X�Y 1X�qÃX�^�V SZ[Z c c,qsY#asñwcT � . /�m a�f c�� � +�ýcT�` � . / � �W\ � oxX�^�V bX=�,oxX�^�V X ,� � +�eX>� ��X�,T�` � . / m a \ � oxXs^WV X=�,o}Xs^WV X�,� � ��ÃX=� GX�,T�` � . / f m � � oxXs^WV X=�,o}Xs^WV X�,� � ��ÃX=�:jGX�,T�` � . / � m � oêX�^WV bX=� oêX�^WV X�,� � +�[X=� �GX , o�oz��x,� � �$� � z���|��y�,z�{�� ���t�K� ���B��Y���7�T Xs^WV � V�X�^JX� � òsY 1X � d XLñLZ%XGòsY 9a¬c��43��+3��+�>o�o� � ��� ��� �

T Xs^WV � V�X�^JX� � òsY 1X � d XLñLZ%XGòsY 9a¬c��43 �4� j�, ��3���� o�o� � ��� ��� �

*��1-% ��6�- � ���4�+WBL=GF>Á½=�+-O C¢.�=12t,A;ÈBr= ,541H�,�O�+W=�+-+�mý;Q0uHlCM.�=12t,o;>BL= ,nHw6L;>=�?¿HL0�H�D5?L.�{P+-=G,PHh2741H�DnHL2t,5+-Du0o,5D5+�H�{l8zH�=1mD5+-,5.�D7=G;È=�?u,54�+3Ä1Dn0A,�;QmG+-=�,o;NÄ1+-D�B�C',541H�, 0o,7D5+�H�{v~'jk,32tBL.GFQmWI1+UO/Do;>,5,5+-=vHr0-RT V�X�Ybayk:X�c�Y%X e�c ZSZ d �:^1X�X�ò�Y 9a¬c�� ��� �$o�o����z � �W~-@���� �L|��:�<���$��� � �

T V�X�Y 1X�qda:k�X�c¤YÃV:X�cBZ[Z c c�q�Y9a�ñwcT � . / � � � 525 � � � ` � i � 5 5 ��� � �GòSq.oT � a�ZV�X�c2��Z ��YD,9X�c a:k�X�c�YôV:X�cT XwV:òGX e X:�9a¬cT òGXsY%X�c�YD,�X�q#, � da:k�X�c¤Y%X e$c ZÃV�X�c q�oT a:k�X�c¤Y � ò c q�qæV�X�c��T X�c<k=�[ò�� � ��ÃòT�` � .�� � ��æò c�e XGòsY #a-c��bayk:X�c�Y%X e�c Z��ÃV:X�c�o$o����z � � � ��� � ���B� � {:�t|��:�,z�{�� ���h|��:�<���$���B���Y������4�+�F>+t��;Q2-H�F�Hw=1H�F>Á�è-+-D�O�;NFNF#Ä1Dn0o,�,5D5Á�,5BUD5+�2tBL?L=G;>è-+�H�= HsFÈy�41HwI1+-,o;Q2�2741H�DnHr2t,5+-D���8r,54�+-=@y�.�,��/Hw,zy1BG0<;>,o;>BL= � B�Ca:k�X�c¤Y%X e$c Z 8�H�=1m�2-H�FNF a:k�X�c¤Y � BL=�,74�+ED5+�0o,!B�C�,54�+z2741H�DnHL2t,7+-D�0o,5D5+�Hw{v~ í F>y�41H�IJ+-,o;Q2/2741H�DnHL2t,5+-Dt01+-=12tBr.�=�,5+-D7+�mO�;NFNF�IJ+�0o,7BLD5+�m·;È=l,54�+�0A,5Do;>=�?PI�.Gü!+-D a:k�X�c¤Y%X e$c Z 8r.�yv,5B�,54�+ � ,54!~1��.�D7,54�+-D H�F>y�41H�IJ+-,o;Q2�2741H�DnHr2t,5+-Dn0�O�;NFNF�IJ+0o6r;>y�y1+�m#~���;>=1H�FNF>ÁL89HP0A.�I10o,5Do;>=�?uB�C�,54�+UI�.Güé+-D�O�;NFpFEI1+UD5+-,5.�D5=�+�mWHr0�D5+�0o.GF>,�~

Page 133: Functional programming using Caml Light Michel Mauny January 1995

� � �E3�������z� ���-� ���@���h�����¿���[� �Ý���@�'����� �

T V�X�Yò Zò�Y JX � d XwñrZ<XGò�Y #a-c��B3¬Y¤ñrY¤ñ �+3 o$o| � � � {:�N|��y�,z�{����B�W{+@W|��:���T ayk:X�c�Y��ò�o$o� � |��y�%�K����� �K�$���$� �T�� j��JXsY c ò[ò�XGX[_D, ��Y 1X d �¤a¬c9òÃa¬cdYD,9X[ò�Y JX � d j��T�d ��Y<q',bò[_#a�YD, � . /�q�� � +�hq�o$o� � � � {:�2�����T V�X�Yò Zò�Y JX � d XwñrZ<XGò�Y #a-c��B3 �¤ñwc��%m�k�X�c¤Y#a�Z9arX�23,o�o| � � � {:�N|��y�,z�{����B�W{+@W|��:���T ayk:X�c�Y��ò�o$o� � |��y�%�K����� � <���$������z ��T�d ��Y<q',bò[_#a�YD, � . /�q�� � +�hq�o$o� � � � {:�2�����

��4�+�mG+tÄ1=G;>,o;>BL=10�BwCz,54�+�=�+-O Y�ñ�^JX�c ,�ÁGy1+�H�=1mlB�Cz,54�+�FÈ+t�G;Q2-H�F�Hw=1H�F>Á�è-+-D3;Q03,5Do;>Kr;QH�Fk8!H�=1mWO�+P0o41H�FNFEBL{�;>,,54�+-{v~ í 0�Fp;>?L4G,oF>Áv{�BLD5+�2tBr{PyGF>+t�vF>+t��;Q2-H�FzH�=1H�F>ÁGè-+-D�D5+�2tBL?L=G;>èt;>=�?u;QmG+-=�,A;pÄ1+-Dt0�|MF>B�O�+-Dn2-HL0o+�BL=GF>Á � ;Q03?�;>KL+-=�;>=0o+�2t,o;>BL= �#� ~ � ~ � ;>=v,74G;)0�y1H�D5,�~

* * - * ��6�- !1*� j d ��a¬c 5 d V j��V:XsYNq', � 1òhZSqLñ c c�Y1X %X$X�c9X:_��1o�oV:XsYÃVJa-c#X�òhZSqLñ c c�Y1X %X$X�c9X:_��1o�o

V:XsYNqLñ c c¤Y%X�Z9a�V�X½Z#asV:X�c � d X[ZV:XsYba¬c�X�q', ��cBZÃñ:V#X�c�X�a-cÃZ#asV:X�c � d X[a-cY $U_D,éa�V:X Y c X kGñV:X�YBqhZba-c�V c Y%X$q', ��a-c,X$q', ��cåa¬cqwñ c c�YJX�%X$X�a¬c�q Sq', � Jò.oa�ZNq Z�� � c �WYD,9X�c�qwñ c c�YJX�%X$X�a¬c�q æVJa-c#XGò

kGñ�c#X_#a�YD, �rcYkYXwñrZ%XsZ#asV:X���qLV�ñ:òGX$X�a-cåa¬c�X�q', ��c

o�o

Z�ñ ba[Z�� Y¤ñ]gJX$q�Y<XLV:X�c���YD,bòyUJò�X$X�qwñ d�d ��cYkYXLV1a¬c9X<2��k�ñqLñ c c�Y<X�Z9a�V:X ò:U1ò�X$X�qLñ d�d ��c<k�XLV1a¬c#X 5 � a��

kGñ�c#X.oV 9a¬c¤Y%X�a-c�Y � qLñ c c�Y1X <X�X 1X ��k q#, � 1ò-� oV 9a¬c¤Y%XGòsY 9a¬c��43]q', � �$q�Y1X Jò��&3,oV 9a¬c¤Y%X�a-c�Y � qLñ c c�Y1X <X�X 1X ��k�V1a¬c#X�ò-� oV 9a¬c¤Y%XGòsY 9a¬c��43½VJa-c#XGò 5 � c�3 oX�^9a�Y��1o�o

Page 134: Functional programming using Caml Light Michel Mauny January 1995

� ��������� ���

� ��� & ��� # � ��� # �"� , ��� $ �%( * $ $�*��", ��� �

h+P41H�KL+�=�BL,�IJ+-+-=¿+t��41H�.10o,A;ÈKr+�;>=h,54�+@mG+�052tDA;Èy�,A;ÈBr=¿B�C�,54�+�.�Hw{�Fù*9;È?r4�,�C¢+�H�,7.�D5+�0-~ h+PBr=GFÈÁl;>=G,5D5B�mG.12t+�m?L+-=�+-DnHsF�2tBL=12t+-y�,t0�;È=ôC¢.�=12t,o;>BL=1HsF�y�D5BL?LDnHw{P{�;>=�?18/H�=1m�O�+v41H�KL+�;È=10�;)0A,5+�m[BL=[,54�+lCM+�H�,5.�D5+�0�.10o+�m ;>=Ã,54�+y�D5BL,7BL,oÁ�yG;>=�?PB�C í ��*ER#H�,o;>=GÁ@{�B¤mG+tF�BwC .�Hw{�F�*J;>?L4�,3,oÁ�yG;>=�?@Hw=1mv0o+-{@Hw=�,o;Q2-0-~

��4�+�D7+tC¢+-D5+-=12t+�{@H�=G.1H�F�� ��� " y�D5B�KL;QmG+�0�Hw=ê+t��41H�.10o,A;ÈKr+@mG+�052tDo;>y�,o;>BL=ýB�C�,74�+%.�H�{�Fz*J;>?L4�,�FQH�=�?L.1H�?L+L8é;>,n0FN;>I�DnH�Do;>+�0-8#2tBL{P{@Hw=1m�0/H�=1mW+t��,5+-=10<;>BL=10¬~

��4�B�0o+PO/4�BlD5+�HLm �:D5+-=1274¿H�D5+PD7+tC¢+-D5D7+�mx,5B � �'" 8�H�y�D5BL?LD5+�070<;>KL+L8!I�.�,�,54�BLD7BL.�?L4l;>=�,5D7B¤mG.12t,o;>BL=½,7BWy�D5B�?LDnHw{P{�;>=�?u;>= .�H�{�Fz*J;>?L4G,�8!O�;È,74h{@H�=GÁu;>=�,5+-D7+�0o,o;>=�?v+t�1H�{PyGF>+�0-8'H�=1mx,5B � � �#" 8#,54�+'��D5+-=1274x+�mr;È,A;ÈBr=¿B�C�,54�+.�H�{·F�*9;È?r4�,3D5+tCM+-D5+-=12t+�{@Hw=�.1H�Fk~

03+�072tDo;>y�,o;>BL=hH�I1BL.�, �'.�Hw{�F �L,5D5Br=�? �@Hw=1mW.10o+tCM.GFE;>=GC¢BLD7{@H�,o;>BL=xH�I1BL.�,3y�D5BL?rDnH�{P{�;>=�?�;>= .�H�{�Fz2-H�=vIJ+CMBL.�=1mu;>= � �#" H�=1m��! � " ~

í =u;>=�,7D5B¤mG.12t,A;ÈBr=v,5B�FQH�{�I#m�H:k2-H�FQ2t.GF>.10�H�=1mW,oÁGy1+�0oÁ�0o,5+-{@0�2-H�=WI1+�C¢BL.�=1m ;>= � � � " 8 � �'�#" H�=1m�� ��" ~��4�+�mG+�052tDo;>y�,o;>BL=}B�C�,54�+�;>{PyGF>+-{P+-=�,tH�,o;>BL=hB�C�2-HsFpF MIGÁ$MK�H�F>.�+PCM.�=12t,o;>BL=1H�Fzy�D7BL?LDnH�{�{�;>=�?PFQH�=�?L.1Hw?L+�0�2-H�=

I1+�C¢Br.�=1m�;È= � �L�:" ~��4�+�;>{PyGF>+-{P+-=�,tH�,o;>BL=ýB�CzFQH�è-ÁlCM.�=12t,o;>BL=1H�FzFQH�=�?r.1H�?L+�03;Q0�mG+�052tDo;>IJ+�mx;>=6� ���'" |k,5DnHw=10<FQH�,5+�ml;>=O�:D5+-=1254ýHL0

�! �'" � ~ í =W;>=G,5D5B�mG.12t,o;>BL=v,7B�y�D7BL?LDnH�{�{�;>=�?�;>=WFQH�è-ÁuCM.�=12t,o;>BL=1H�F!FQH�=�?L.1Hw?L+�0/2-H�=lI1+�CMBL.�=1m�;>= � �:" ~

� �

Page 135: Functional programming using Caml Light Michel Mauny January 1995

� � �ù ���������b����� �/��� �ù� ���L�-���@�v����� ���'���� ���d���z���3�����

Page 136: Functional programming using Caml Light Michel Mauny January 1995

� ��! ��� ����$��"� (��

� �*" äU~ í IJ+tF)0ABL=vH�=1m þ ~���~ �L.1050o{@Hw=!~ �9ÌMÐ � ��Ì���ÐoÎ�ÑLÏGF �nÏJÌMÎ�Ð ø9ÐoÎ�ÌMÑLÌ�� ÊLÏlÊ � -�ÊLÉ�ø���ÌMÎ�Ð���ÐoÊnÍLÐoÑLÉUË-~!��4�+�övjo�ìùD5+�050-8 � ����� ~

� � " í ~ í 4�B18���~ �L+-,54G;k8/H�=1m��~�õ�FpF>{@Hw=!~+-zÊLÉ�ø�� ÒpÎ�Ð5Ë����Ð �QÏ��#� ø9ÒNÎ-Ë � 1Î � 9�ÏG���#�GÎ-Ë@ÑrÏGF� 1Ê�ÊrÒ°Ë-~ í m�mr;Q0oBr= h+�0�FÈ+-ÁL8 � ��� � ~

�! " ��~!Å�HL276G.10-~-.�H�=vy�D5Br?LDnH�{P{·;È=�?WIJ+UFp;>IJ+-DnH�,5+�m%C¢D7BL{Â,74�+��EBr=¿î/+-.�{uH�=�=h0o,oÁLF>+�Æ í C¢.�=12t,o;>BL=1HsF�0o,oÁLF>+H�=1m�;È,t0zH�F>?L+-I�DnH�B�C9y�D7BL?LDnH�{u0-~Gjk= -zÊLÉ�É ��Ï�� �tÑLÌ�� ÊLÏ�Ë/Ê � Ì 9GÎ9/ -43ê8�KLB�F>.�{P+ ��� 8�y1H�?L+�0 � � �� �K��� 8 � ��� � ~

� �D" äU~°ì'~9Å�H�D7+-=1mGD5+-?L,�~� �9�Î �!ÑLÉ 1�FLÑ:� -�ÑLÒ �#�GÒ �rË���nÌ Ë��#÷sÏJÌMÑ:�@ÑLÏ�F �9Î�É�ÑrÏ1Ì��E�-Ë-8�KLB�F>.�{P+ ��� �B�C �9Ì��2F�� Î-Ë � Ï�!ÊnÍD� ��ÑLÏ�F@Ì 9GÎ��!Ê��GÏGFrÑLÌ��QÊrÏ�Ë�Ê � 3xÑLÌ 9�Î�É�ÑLÌ��E�-Ë-~zî�BLD5,54�kä�B�FNFQH�=1m#8 � ���:� ~

� � " ��~JÅE;>DnmuH�=1mWì'~ ýHLmrF>+-D�~ �nÏ1ÌMÐoÊ#FD� ��Ì��QÊLÏWÌMÊ�����Ï���Ì�� ÊLÏ1ÑrÒ���ÐoÊtÍLÐoÑLÉ�É �QÏGÍL~ �L+-Do;>+�0�;>=�.zBL{�y�.�,5+-D ��27;>+-=12t+L~ìùD5+-=�,A;)2t+Kkä3H�FNFEjk=G,5+-D5=1H�,o;>BL=1HsF 8 � ��� � ~

� � " í ~ .z4G.�Dn274!~� �9�Î-zÑLÒ �'��Ò �EÊ ���!ÑLÉ 1�FLÑ.-�ÊLÏ���Î�Ð7Ë�� ÊLÏ1~'ìEDo;>=12t+-,5Br=êõ�=G;ÈKr+-Dn0<;>,oÁvìED5+�050¬8 � �:�1� ~� �'" 0�~ .EF��+-{�+-=�,�8���~B03+�0oyJ+-Á�D5Br.G�é8���~�03+�0oy1+-ÁGD5BL.G�!8zH�=1m þ ~ ��H�4�=!~ í 0<;>{PyGF>+xH�y�yGFN;)2-Hw,o;>KL+WFQH�=�?L.1Hw?L+LR

ö�;>=G; köê*ù~�j<=!��ÐoÊ#�tÎnÎ F�� Ï�Í�Ë�Ê ��Ì 9�Î / -43 �nÏ1ÌMÎ�ÐnÏJÑLÌ��QÊrÏ1ÑLÒ -zÊLÏ � Î�Ð�Î�ÏG�tÎ�ÊLÏ ��)Ëkø¿ÑrÏGF����GÏG��Ì��QÊLÏJÑLÒ"��Ð�Ê��ÍrÐ�ÑrÉ�É � Ï�Ír8�y1H�?L+�0 � �� ��� 8 � ����� ~

� � " þ ~.zBr.10<;>=�+�H�.!8 ì'~ k*E~ .z.�Do;>+-=!8�H�=1m�ö¿~�öêHw.�=�ÁL~��4�+h2-H�,5+-?LBLDA;)2-HsFÝH�I10o,5DtHL2t,P{@HL274G;>=�+L~jk=�����Ï��K�Ì�� ÊLÏ1ÑrÒ ��ÐoÊtÍLÐoÑLÉ�É �QÏGÍ �!ÑLÏGÍ��GÑ�ÍLάË�ÑLÏ�F -�ÊLÉ�ø���ÌMÎ�Ð /�Ð �:92�QÌMÎ ��Ì��GÐoÎ�8#=G.�{�IJ+-D �L�:� ;È=ý*#+�2t,5.�D5+Wî/Br,5+�0�;>=.zBr{Py�.�,5+-D���27;>+-=12t+L8#y1H�?L+�0 �L� � �:� ~ �Ly�Do;>=�?L+-D#�E+-DoFQH�?18 � ����� ~

� � " þ ~ .zBL.10<;>=�+�H�.xH�=1m þ ~Jä/.�+-,�~���4�+ . í öê*%y�Do;>{P+-D�~��!+�274�=G;Q2-H�F$��+-y1BLD5, �#��� 8Gj�î#��j í 8 � ���L� ~� ��� " îU~ 03+ÝÅ�D5.G;`�o=!~ �!ÑLÉ 1�FrÑ:���tÑLÒ �#�GÒ �LË�Ï1ÊLÌMÑrÌ��QÊLÏ ���QÌ 9uÏ1ÑLÉ�Î�ÒNάËnË�FD��É�É �QÎ¬Ë EÑuÌMÊ�ÊLÒ �-ÊLÐ ÑD��ÌMÊLÉ�ÑLÌ��E� � ÊrÐnÉ �GÒpÑ

É�ÑLÏ��`ø��GÒNÑLÌ�� ÊLÏ1~Ej<=1m�H�?1~#öxH�,54!~>8 � ����� ~

� �L�*" öý~ þ BLDnmGBr=!8%��~sö�;NF>=�+-D�8�*ù~LövBrD5Do;Q0-8�ö¿~�î�+-O�+-ÁL8LHw=1m-.3~� ¿HrmGO�BrD5,54!~ í {�+-,nH�FQH�=�?L.1H�?r+zCMBLD�;>=�,5+-DtHL2t,o;>KL+y�D5BGB�Ck0�;>=ê* .���~�j<=&��Ð�Ê'�nÎtÎ F��QÏGÍ�Ë Ê � / -43 �#÷�É/ø�Ê�Ë � �GɧÊLÏ'��Ð � ÏG�#� ø9ÒNÎ-Ë�Ê �(��Ð�ÊtÍLÐoÑLÉ�É �QÏGÍ �!ÑLÏGÍ��GÑ�ÍLÎ¬Ë 8y1H�?r+�0 �L� � � � � 8 � ��� � ~

� �#� " ��~)��~Eä�;>=1mrF>+-Á H�=1m*��~°ì'~ �L+tFQmr;>=!~�nÏ1ÌMÐoÊ'F�� ��Ì��QÊrϽÌMÊ�-zÊLÉ 1 � Ï1ÑrÌMÊLÐ5ËuÑLÏGF ] ���tÑLÒ �#�GÒ �LË-~W*#BL=1mGBL=½öxH�,54�+K{@Hw,o;Q2-H�F �LB�27;È+-,oÁL8 �L,5.1mG+-=G, �!+t��,n0-~ .�H�{�I�Do;QmG?L+�õ�=G;ÈKr+-Dn0<;>,oÁvìED5+�050¬8 � ����� ~

� � " . ~ í ~���~1ä/BGH�D5+L~�+/.G;Q256�0oBLD5,�~ -zÊLÉ�ø��GÌMÎ�Ð-,¤Ê��GÐtÏ1ÑLÒN8 � | � � 8 � ����� ~� �

Page 137: Functional programming using Caml Light Michel Mauny January 1995

� � ��� ���#� �����/���z �

� �K�D" b~ í ~1ä�BsO/H�Dtm#~� �9�Î �-ÊLÐnÉ �GÒNÑLÎK�oÑ�Ë)�oÌM÷7ø¤ÎPÏJÊLÌ��QÊrÏhÊ � �tÊLÏ�Ë-ÌMÐ �2��Ì�� ÊLÏJ8�y1H�?L+�0 � � � � ���r� ~ í 2-HLmG+-{·;)2�ìùD5+�050-8� � �L� ~

� � � " ì'~Eä/.1m�Hw6¿H�=1mýì�~ ¿HLmrF>+-D�~ ��+-y1BrD5,�BL=¿,74�+@y�D5Br?LDnH�{P{·;È=�?�FQH�=�?L.1H�?L+Wä3HL0o6L+tFNFk~ê��+�274�=G;)2-HsF ��+-y1BrD5,� í *!�zõ��80 . ��� ���� ��� 8��zH�F>+�õ/=G;>KL+-Dn0�;È,oÁL8 � ���L� ~

� �� " ��~"��BL4�=1070oBL=!~ � ( 27;>+-=�,�2tBr{PyG;NF)Hw,o;>BL=xB�CEFQH�è-ÁW+-KsH�F>.1H�,A;ÈBr=!~ j<=*��ÐoÊ#�tÎnÎ F�� Ï�ÍwËÝÊ � / -43�-zÊLÏ � Î�ÐoÎ�ÏG�tÎ�ÊrÏ-zÊrÉ/ø �QÒNÎ�Ð -�ÊLÏ�Ë-ÌMÐ �2��Ì�� ÊLÏJ8�y1H�?L+�0 � � � ��� 8 � ���:� ~

� � �'" ��~ k*E~��3Do;>KL;>=�+L~ �!ÑLÉ 1�FLÑ:���tÑLÒ �#�GÒ �ÌM÷7ø¤Î¬ËÝÎ�Ì�É�Ê#F��Î�ÒNÎ-Ë-~!�E,5.1mG+�0�+-,�D5+�274�+-Dn274�+�0z+-=�;>=GC¢BrD5{@H�,o;Qqr.�+L~�öêHr050oBL=!8� � �L� ~

� � � " ì'~�*!H�=1mr;>=!~z��4�+3=�+t��, ���L� y�D5BL?LDnHw{P{�;>=�?�FQH�=�?L.1Hw?L+�0-~!j<=�-zÊLÉ�É ��Ï�� �tÑLÌ�� ÊLÏ�Ë�Ê ��Ì 9�Î / -43x8�KLB�F>.�{P+ � 8y1H�?r+�0 � ��� � ��:� 8 � ����� ~

� � � "� ~1*#+-D5B�ÁWH�=1mvì'~ }+t;)0¬~�3êÑLÏ���Î�Ò�FLÎ�Ð�Î���Î�ÐoÎ�Ï��nÎ F��vÒNÑLÏGÍLÑ�ÍrÎ -�ÑLÉ�Òp~'j<=�,5+-D ��zmr;>,o;>BL=10-8 � ��� :~� �L� "� ~s*é+-D5B�ÁL~¤��4�+ Jj�î .ê+t��y1+-Do;>{P+-=G,�REH�=U+�2tBL=�BL{�;Q2-H�F�;>{PyGF>+-{P+-=G,nH�,o;>BL=�B�C1,54�+�öx*·FQH�=�?L.1H�?L+L~���+�254�=G;Q2-H�F

��+-yJBLD5, �L� � 8Gjoî ��j í 8 � ���r� ~� ���*"� ~�*#+-D7BsÁL~!��4�+ .�Hw{�F9*J;>?L4G,�0AÁ¤0o,7+-{v8LD5+tF>+�HL0A+ � ~ ��� 03B�2t.�{P+-=G,nH�,o;>BL=@Hw=1mP.10o+-D �°0E{@Hw=�.1H�Fk~!��+�254�=G;Q2-H�F

D5+-yJBLD5,�8:j�î#��j í 8 � ��� �~'jk=127F>.1mG+�m�;>=x,54�+ .�H�{�F�*J;>?L4G, � ~ � mr;Q0o,5Do;>I�.�,o;>BL=!~� ��� " ��~#öxHL2'.�H�D7,54�ÁL~ ��)Ë<ø������ ��ÐoÊnÍrÐ�ÑrÉ�É�Î�Ð�� Ë 3êÑLÏ���ÑrÒp~�övjo�ÃìED7+�050-8�.�H�{�I�Do;QmG?L+L81öxHL070-~>8 � ����� ~� � " 0�~GöêHr2�+/.�+-+-=!~�ölB¤mG.GF>+�0�CMBLD �L,nHw=1m�H�Dnmuöê*ù~#jk='��ÐoÊ#�tÎnÎ F�� Ï�ÍwË�Ê ��Ì 9�Î / -43 -zÊLÏ � Î�Ð�Î�ÏG�tÎ/ÊLÏ ��)ËkøvÑLÏ�F

���GÏG��Ì�� ÊLÏJÑLÒ ��ÐoÊnÍrÐ�ÑrÉ�É � Ï�Ír8 � ���:� ~� �:�D" öý~#öêHw.�=�ÁWH�=1m 0�~JmG+��/H�.�?wF)Hw.1mGD5+L~ ìEH�Dt0o+-Dn0�;>=höx*E~�jk= ��ÐoÊ#�tÎnÎ F�� Ï�ÍwË Ê �PÌ 9�Î / - 3"-zÊLÏ � Î�ÐoÎ�ÏG�tÎ�ÊrÏ

���>Ë<øhÑLÏGF�����Ï���Ì�� ÊLÏ1ÑLÒ ��Ð�ÊtÍLÐoÑLÉ�É �QÏGÍL8 � ���D� ~� ��� " öý~/öxH�.�=GÁæH�=1m í ~ �L.��H�D5+-èL~ jk{PyGF>+-{P+-=G,o;>=�?�C¢.�=12t,o;>BL=1HsF�F)Hw=�?L.1H�?L+�0�;>=Ã,54�+ý2-H�,5+-?LBLDA;)2-HsF�H�I10A,5DnHL2t,

{@Hr254G;>=�+L~Pj<=��ÐoÊ#�tÎnÎ F�� Ï�Í�Ë�Ê �·Ì 9GÎ / -43 �nÏJÌMÎ�ÐtÏ1ÑLÌ�� ÊLÏJÑLÒ�-zÊLÏ � Î�Ð�Î�ÏG�tÎ�ÊLÏ ���)Ëkø½ÑLÏGF'����Ï���Ì�� ÊLÏ1ÑrÒ ��Ð�Ê��ÍrÐ�ÑrÉ�É � Ï�Ír8�y1H�?L+�0 � ��� � ��� � 8 � � ��� ~

� ��� " öý~1öxH�.�=GÁL~1��.�=12t,o;>BL=1H�FEy�D5BL?rDnH�{P{�;>=�?�.10<;>=�? . í öx*E~��!+�274�=G;Q2-H�F$��+-y1BLD5, �#��� 8�joî ��j í 8 � � ��� ~� ���'" ��~Lö�;NF>=�+-D�~ í ,54�+-BLD7Á�B�C1,oÁ�yJ+�yJB�F>Á�{�BLD5y�4G;Q0o{b;>=Py�D7BL?LDnH�{�{�;>=�?1~ , � -zÊLÉ�ø��GÌ � �9÷�Ë-Ì ��� �#���>8 � � R ��� � � � 8

� ��� � ~� ��� " ��~#ö�;NFÈ=�+-D�~ í y�D5BLy1BG05H�F#C¢BrD��L,nH�=1m�H�Dtmvöx*E~�jk=&��ÐoÊ#�tÎnÎ F�� Ï�Í�Ë3Ê ��Ì 9�Î2/ -43"-�ÊLÏ �-Î�ÐoÎ�Ï��nÎUÊLÏ ��)Ë<ø%ÑLÏ�F

���GÏG��Ì�� ÊLÏJÑLÒ ��ÐoÊnÍrÐ�ÑrÉ�É � Ï�Ír8 � ����� ~� ��� " �1~°*ù~/ì'+-Á�,5Br=� ��BL=�+�0-~ 59�Î �nÉ�ø9ÒNÎ�É�Î�ÏJÌMÑLÌ��QÊrÏÃÊ � ����Ï���Ì�� ÊLÏ1ÑLÒ ��ÐoÊnÍrÐ�ÑrÉ�É � Ï�Í �!ÑLÏ�ÍD��Ñ�ÍLÎ-Ë-~ �L+-DA;È+�0 ;>=

.zBr{Py�.�,5+-D���27;>+-=12t+L~!ìED7+-=�,o;Q2t+Kkä3H�FNF�j<=�,7+-D5=1H�,o;>BL=1H�Fk8 � ����� ~�! � " �1~°*ù~/ì'+-Á�,5Br=� ��BL=�+�0-~+3��>Ë-ÎhÎ�Ï��� ��ÐoÎ FLάËêÒNÑLÏ�ÍrÑ�ÍLάË��-ÊLÏG��Ì��QÊrÏ1Ï1Î�Ò�Ë FLÎuø9ÐoÊnÍrÐoÑLÉ�É�ÑrÌ��QÊLÏJ~ öxH�=G.�+tFQ0

j<=GC¢BLD7{@H�,o;Qqr.�+�0 öxHL050ABL=!~�öêHr050oBL=!8 � ���r� ~�! �*" ��~%��+-+�0EH�=1m� b~D.EFN;È=�?r+-D�~1��4�+�D5+-KL;Q0o+�m ) D5+-yJBLD5,'BL=�,74�+�HsFÈ?rBLDo;>,54�{�;Q2ùFQH�=�?L.1H�?L+ ��274�+-{P+L~Gjk= ��������� /��

��ÊLÌ��E�nÎ¬Ë 8GKLB�F>.�{P+ ��� 8 � ����� ~

Page 138: Functional programming using Caml Light Michel Mauny January 1995

��� ���#�-���/�/���z � � �

�! � " ��~ í ~ ��BLIG;>=10oBr=!~ .zBL{Py�.�,tH�,o;>BL=1H�F'F>BL?�;Q2�R3,54�+�.�=G;pÄ92-Hw,o;>BL=¿2tBL{Py�.�,tH�,o;>BL=!~3jk=�3xÑ��:92�QÏJÎ �nÏ1ÌMÎ�ÒQÒ �NÍLÎ�ÏG�tÎ�8KLBwFÈ.�{�+ � B�C /�É�Î�Ð �E�nÑLÏ���Ò�Ë-Î �#� Î�Ðt~�Å3~1öl+tFÈ,7è-+-D H�=1m 0�~�ö�;>,n274G;È+�|��zm�0 � 8 � ���G� ~

�! � " ��~ �L+�mG?L+-O�;Q2769~ /�Ò`ÍLÊLÐ �QÌ 9GÉ�Ë-~ í m�mr;Q0oBL= }+�0<F>+-ÁL8 � � ��� ~�! �D" 0�~1��.�D5=�+-D�~ � í ��*%FQH�=�?L.1H�?L+U{@H�=G.1H�Fk~z��+�254�=G;Q2-H�FED5+-y1BrD5,�8�L, í =1mGD5+-O 03õ/=G;>KL+-Dn0�;È,oÁL8 � ��� � ~�! � " 0�~L��.�D5=�+-D�~���Î �'��Ð7Ë �QÊLÏ�Î �'��ÑLÌ�� ÊLÏ:Ë�ÑwË�Ñ�ø9ÐoÊtÍLÐoÑLÉ�É �QÏGÍ�ÒNÑLÏGÍ��GÑ�ÍLÎ�8�y1H�?L+�0 � � � � ~ .�Hw{�I�DA;)mG?r+�õ�=G;>KL+-Dn0<;>,oÁ

ìùD5+�050-8 � ����� ~�! � " 0�~��!.�D7=�+-D�~åö�;>DnH�=1m�H�RhHý=�BL=�k0A,5Do;Q2t,uC¢.�=12t,A;ÈBr=1H�F FQH�=�?r.1H�?L+xO�;>,54[y1B�F>ÁG{PBLD5y�4G;Q2x,oÁGy1+�0-~j<= ����Ï��K�

Ì�� ÊLÏ1ÑrÒ ��ÐoÊtÍLÐoÑLÉ�É �QÏGÍ �!ÑLÏGÍ��GÑ�ÍLάË�ÑLÏ�F -�ÊLÉ�ø���ÌMÎ�Ð /�Ð �:92�QÌMÎ ��Ì��GÐoÎ�8#=G.�{�IJ+-D �L�:� ;È=ý*#+�2t,5.�D5+Wî/Br,5+�0�;>=.zBr{Py�.�,5+-D���27;>+-=12t+L8#y1H�?L+�0 � � �� ~�Ly�Do;>=�?L+-D#�E+-DoFQH�?18 � ����� ~

�! �'" ì'~ h+t;Q0-8'ö¿~ ��~ í yJBL=G,5+L8 í ~#*!H�Kr;pFNF>+L8Eöý~!öêHw.�=�ÁL8#H�=1m í ~ �L.��HwD5+-èL~���4�+�. í öx*ýD5+tCM+-D5+-=12t+�{@H�=G.1H�Fk~��+�254�=G;Q2-H�F ��+-yJBLD5, �#��� 8Gj�î#��j í 8 � ���L� ~

�! � " ì'~ h+t;Q03H�=1m � ~�*#+-D5B�ÁL~ �!Î�ÒNÑLÏ�ÍrÑ�ÍLÎ -zÑLÉ�ÒN~Ejk=G,5+-D ���mr;È,A;ÈBr=10-8 � ��� �~