From uk1o@rz.uni-karlsruhe.de Sun Dec 2 12:17:46 2001 From: uk1o@rz.uni-karlsruhe.de (Hannah Schroeter) Date: Sun, 2 Dec 2001 13:17:46 +0100 Subject: Lazy Sound File IO In-Reply-To: <2782.129.137.66.11.1003849260.squirrel@diopter.storrs> References: <2782.129.137.66.11.1003849260.squirrel@diopter.storrs> Message-ID: <20011202131745.B7713@rz.uni-karlsruhe.de> Hello! On Tue, Oct 23, 2001 at 11:01:00AM -0400, Carl McTague wrote: > Please let me refine my question. > Is there a general way to coerce an [Int] or [Double] etc. into a String, > so that it may be written out to a binary file with hPutStr? There is > toEnum, but this doesn't seem like a real solution, since it only works for > Int values <256. I'd write some format at least readable by programs like sox. E.g. raw headerless 16-bit signed integers w/ a fixed sample rate. Maybe even stereo if you are generating stereo sounds. Now, let's do simple 16-bit integer lists, assume we have a stream of Ints which additionally are between -2^15 and 2^15 - 1. And assume we want network byte order (high byte first). writeInts :: [Int] -> IO () writeInts = putStr . ints2Str ints2Str :: [Int] -> String ints2Str = concatMap int2str where int2str i | i >= -32768 && i <= 32767 = map Char.chr [(i `mod` 65536) `div` 256, i `mod` 256] That's it. If you want to write stereo, you should interleave the Ints, such as nullElement :: Int -- the sample value for silence mixStereo :: [Int] -> [Int] -> ([Int], [Int]) mixStereo [] [] = [] mixStereo l [] = zip l (repeat nullElement) mixStereo [] l = zip (repeat nullElement) l mixStereo (x:xs) (y:ys) = (x,y) : mixStereo xs ys Hope that helps, even if late. Kind regards, Hannah. From vcomic@speed.sender.com Mon Dec 3 07:46:07 2001 From: vcomic@speed.sender.com (vcomic@speed.sender.com) Date: Mon, 3 Dec 2001 02:46:07 -0500 (EST) Subject: ±¬Ð¦Ê±ÊÂÂþ»­ 12-3 Message-ID: <20011203074607.9CFF7255C2@www.haskell.org> н¨ÍøÒ³ 1

ʱʶ¯ÂþÒ»Öܾ«´â£º2001Äê11ÔÂ26ÈՠÿÖÜÒ»·¢ËÍ

Ï£ÍûÿÌì¶¼¿´µ½ÇëÔÚ´ËÊäÈëEMAILµØÖ·

²»Ï£ÍûÔÙÊÕµ½±¾Óʼþ£¬ÇëÔÚ´ËÍ˶©

ʱÊÂÂþ»­ Á¬ÔØÂþ»­ ¶ÌƪÂþ»­ µ¥·ùÂþ»­ FLASH ¶¯»­Æ¬ ¶¯Âþ¾ãÀÖ²¿

ÒªÎÅ

ËþÀû°à½ÊËÀÒ»ÄÐ×Ó Éí¹ÒÎÀÐǵ绰ÒÉΪÃÀ¹ú¼äµý

¡¡

À´¡¼ViaComicʱʶ¯Âþ¡½ÂÛ̳£¬·¢±í¸öÈ˹۵ã

Éú»î

¡°¹·±ÈÅ®È˺á±Òý·¢¹Ù˾

¡¡

À´¡¼ViaComicʱʶ¯Âþ¡½ÂÛ̳£¬·¢±í¸öÈ˹۵ã

Éú»î

±±¾©Ò»·¨ÂÖ¹¦³ÕÃÔÕß×ò¿³ËÀ¼ÒÈË ²Ò°¸ÈÔÔÚµ÷²éÖÐ

¡¡

À´¡¼ViaComicʱʶ¯Âþ¡½ÂÛ̳£¬·¢±í¸öÈ˹۵ã

¡¡


--±¾ÓʼþÓÉV¶¯ÂþÍøÕ¾±à¼­³ö°æ£¬»¶Ó­¸÷·½ÃæºÏ×÷--

½üÆÚ¾«²ÊÄÚÈݻعË

2001-11-29 ÃÀ¾üËø¶¨Á½´¦À­µÇ²ØÄä´¦ µ¼µ¯Çãк¶øÏÂ
2001-11-29 ÄêÇáÈË»¼½¡ÍüÖ¢Óë¾­³£Ê¹Óõç×Ó²úÆ·ÓйØ
2001-11-26 Ïò¹úÍõÖÀÏÚ±ý 16ËêÉÙÄê±»Ö¸¿Ø
2001-11-27 °×¹¬ÖØÉ겼ʲ×Üͳ°Ù·ÖÖ®°Ù·´¶Ô¸´ÖÆÈËÀà

[µã»÷½øÈë¿´¸ü¶à]

¡¡

±¾¿¯ÎïËùÓÐÎÄÕ¼°ÄÚÈݰæÈ¨Îªwww.viacomic.com V¶¯ÂþÍøÕ¾ËùÓУ¬Î´¾­ÊéÃæÊÚȨÈκÎýÌå²»µÃ×ªÔØ

 
¡¡

¡¡
From mpc02@ukc.ac.uk Mon Dec 3 11:51:28 2001 From: mpc02@ukc.ac.uk (mpc02) Date: Mon, 3 Dec 2001 11:51:28 +0000 (GMT) Subject: Mathematics of Program Construction, 2nd CFP Message-ID: [Apologies for multiple copies] MPC 2002 6th International Conference on MATHEMATICS OF PROGRAM CONSTRUCTION ----------------------------------- http://www.cs.ukc.ac.uk/conf/mpc2002/ Organised in conjunction with WCGP '02 8--10 July, 2002 Dagstuhl, Germany INVITED SPEAKERS include: Robert Giegerich Dexter Kozen CALL FOR PAPERS This conference aims to promote the development of mathematical principles and techniques that are demonstrably useful and usable in the process of constructing computer programs (whether implemented in hardware or software). The focus of the conference is on techniques that combine precision with conciseness, enabling programs to be constructed by formal calculation. Within this theme, the scope of the conference is very diverse. We welcome contributions to programming methodology (for example, formal methods for program specification and transformation), to programming paradigms (for example, generic programming techniques and type systems) and to language design (for example, programming calculi and programming language semantics). Theoretical contributions are welcome provided their relevance to program construction is evident; discussion of applications is welcome provided the mathematical basis is evident. The conference will be organised in conjunction with the IFIP TC2 Working Conference on Generic Programming, WCGP '02. There will also be a number of co-located workshops, including CMPP. IMPORTANT DATES Deadline for submission of papers: 6th January, 2002 Notification of acceptance/rejection: 4th March, 2002 Final papers due: 25th April, 2002 Full papers should be submitted in Postscript or pdf format by e-mail to mpc02@ukc.ac.uk by 6th January, 2002. PROGRAMME COMMITTEE Roland Backhouse (UK) Eerke Boiten (UK, co-chair) Michael Butler (UK) Ernie Cohen (USA) Jules Desharnais (Canada) Jeremy Gibbons (UK, GP liaison) David Gries (USA) Lindsay Groves (New Zealand) Ian Hayes (Australia) Eric Hehner (Canada) Zhenjiang Hu (Japan) John Hughes (Sweden) Bart Jacobs (The Netherlands) Johan Jeuring (The Netherlands, GP liaison) Dick Kieburtz (USA) Dexter Kozen (USA) K. Rustan M. Leino (USA) Christian Lengauer (Germany, CMPP liaison) Erik Meijer (The Netherlands/USA) Bernhard Moeller (Germany, co-chair) David Naumann (USA) J.N. Oliveira (Portugal) Alberto Pardo (Uruguay) Peter Pepper (Germany) Kaisa Sere (Finland) Mark Utting (New Zealand) FURTHER INFORMATION Please refer to the web page for further details. http://www.cs.ukc.ac.uk/conf/mpc2002/ -- Mathematics of Program Construction '02 at Dagstuhl Eerke Boiten, Computing Laboratory, University of Kent at Canterbury, UK +44.1227.827615 (fax 762811) From thiemann@informatik.uni-freiburg.de Mon Dec 3 13:51:27 2001 From: thiemann@informatik.uni-freiburg.de (Peter Thiemann) Date: 03 Dec 2001 14:51:27 +0100 Subject: PEPM'02 -- call for participation Message-ID: CALL FOR PARTICIPATION 2002 ACM SIGPLAN Workshop on Partial Evaluation and Semantics-Based Program Manipulation (PEPM'02) Portland, Oregon, USA, January 14-15, 2002 (colocated with POPL'02) http://www.informatik.uni-freiburg.de/~thiemann/pepm02 The PEPM'02 workshop will bring together researchers working in the areas of semantics-based program manipulation, partial evaluation, and program generation. The workshop focuses on techniques, supporting theory, and applications of the analysis and manipulation of programs. PRELIMINARY PROGRAM Monday, 14 January 2002 BREAKFAST 8:45 WELCOME (chair: PT) 9:00 Invited Talk: Staged Compilation Craig Chambers (U Washington) 10:00 BREAK 10:30 Towards Bridging the Gap Between Programming Languages and Partial Evaluation Anne-Francoise Le Meur, Julia L. Lawall, Charles Consel (INRIA/LaBRI, France) 11:00 Online Partial Evaluation for Shift and Reset Kenichi Asai (Ochanomizu University, Japan) 11:30 Growing Languages with Metamorphic Syntax Macros Claus Brabrand, Michael I. Schwartzbach (BRICS, University of Aarhus, Denmark) 12:00 LUNCH 14:00 From Checking to Inference via Driving and Dag Grammars Jens Peter Secher and Morten Heine Sørensen (DIKU, Denmark) 14:30 Cost-Augmented Narrowing-Driven Specialization Germán Vidal (DSIC, Technical University of Valencia, Spain) 15:00 Path Dependent Analysis of Logic Programs Lunjin Lu (Oakland University, USA) 15:30 BREAK 16:00 Automatic Time-Bound Analysis for a Higher-Order Language Gustavo Gómez and Yanhong A. Liu (Indiana University, USA) 16:30 Compositionality in the Puzzle of Semantics Roberto Giacobazzi, Isabella Mastroeni (Dipartimento di Informatica, Universita' degli studi di Verona, Italy) 17:00 PC REPORT Tuesday, 15 January 2002 BREAKFAST 9:00 shared WITS-Session "Non-Interference and Probability" 10:30 BREAK 11:00 Invited Talk: Implementation of Automatic Differentiation Tools Christian Bischof (Technical University of Aachen, Germany), Paul Hovland, Boyana Norris (Argonne National Laboratory, USA), 12:00 LUNCH 14:00 Program Optimization Using Indexed and Recursive Data Structures Yanhong A. Liu and Scott D. Stoller (State University of New York at Stony Brook, USA) 14:30 Mixed-Initiative Interaction = Mixed Computation Naren Ramakrishnan, Robert Capra, Manuel Perez-Quinones (Department of Computer Science, Virginia Tech, USA) 15:00 CPS Translating Inductive and Coinductive Types Gilles Barthe (INRIA, France), Tarmo Uustalu (University of Minho, Portugal) 15:30 CLOSING From ad@dcs.st-and.ac.uk Tue Dec 4 09:38:49 2001 From: ad@dcs.st-and.ac.uk (Tony Davie) Date: Tue, 4 Dec 2001 09:38:49 +0000 Subject: We need "Documentation" (Was: Re: Integer to String Conversion?) In-Reply-To: References: Message-ID: --============_-1204663764==_ma============ Content-Type: text/plain; charset="us-ascii" ; format="flowed" >-----BEGIN PGP SIGNED MESSAGE----- >Hash: SHA1 > >On Tuesday 04 December 2001 02:51, you wrote: >> On Tue, 4 Dec 2001, Chris wrote: >> > is there a function that converts Integers to Strings and vice versa? >> >> Prelude> (reads "123 abc") :: [(Integer, String)] >> [(123," abc")] >> Prelude> show 123 > > "123" >> > ... >Why doesn't an author or two who have written Haskell books consider opening >their books for public use on the Internet? "The Craft Of ..." especially >seems great. I'm sure many coders would appreciate a non-dead-tree version of >that book or a shortened version of the book. > >The material we have is simply lacking. What we need is a good tutorial and a >comprehensive reference book. ... I suggest you look at http://www.haskell.org/bookshelf/, specifically the section on Papers available on the Web. This gives numerous tutorials and introductions. -- Tony Davie Computer Science (retired), St.Andrews University G.F. Handel Site: http://bruichladdich.dcs.st-and.ac.uk/HandelWWW/HandelCat.html Handel was half German, half Italian, and half English. He was very large. (from a music exam) --============_-1204663764==_ma============ Content-Type: text/html; charset="us-ascii" Re: We need "Documentation" (Was: Re: Integer to Strin
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Tuesday 04 December 2001 02:51, you wrote:
> On Tue, 4 Dec 2001, Chris wrote:
> > is there a function that converts Integers to Strings and vice versa?
>
> Prelude> (reads "123 abc") :: [(Integer, String)]
> [(123," abc")]
> Prelude> show 123
> "123"
>
...
Why doesn't an author or two who have written Haskell books consider opening
their books for public use on the Internet? "The Craft Of ..." especially
seems great. I'm sure many coders would appreciate a non-dead-tree version of
that book or a shortened version of the book.

The material we have is simply lacking. What we need is a good tutorial and a
comprehensive reference book.

...

I suggest you look at http://www.haskell.org/bookshelf/, specifically the section on
Papers available on the Web. This gives numerous tutorials and introductions.

--

Tony Davie
Computer Science (retired), St.Andrews University
G.F. Handel Site:
http://bruichladdich.dcs.st-and.ac.uk/HandelWWW/HandelCat.html

Handel was half German, half Italian, and half English.  He was very
large. (from a music exam)
--============_-1204663764==_ma============-- From simonpj@microsoft.com Tue Dec 4 12:02:31 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 4 Dec 2001 04:02:31 -0800 Subject: Haskell 98 Revised Message-ID: <1113DDB24D4A2841951BFDF86665EE19066542@RED-MSG-10.redmond.corp.microsoft.com> Gentle Haskellers The December issue of the Haskell 98 Report is done. http://research.microsoft.com/~simonpj/haskell98-revised As usual, changes are highlighted in the overall bugs list thus: [Dec 2001], so you can find them easily. There are the usual crop of presentational improvements (thanks esp to Ian Lynagh, George Russel, Feliks Kluzniak for much careful reading). There are two non-trivial changes that I decided to adopt: 1. Add showIntAtBase, showOct and showHex to the Numeric library. 2. Remove the wart concerning qualified names in instance declarations. This a breaking change, in the sense that exotic Haskell programs may have to change, but I judge it worth it, after some consultation. In particular:=20 * if you use H/Direct, you'll have to re-generate your Haskell files with a different flag * if you use the Edison library, you'll need a new copy of the library (this isn't a problem in practice because it comes bundled with your compiler) The other thing I'd ask you to look at particularly is the layout algorithm. George and Ian have both pointed out bugs, but it's very easy to get wrong so a few more eyeballs on it would be a Good Thing. The only unresolved thing I have in my pile is some stuff about the lexical syntax of comments, which I find it hard to get excited about. We are definitely converging. My earnest hope is to finally freeze the Report at Christmas. So this is your last chance. I hope. Thanks Simon =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D The instance decl wart In Haskell 98 as she stands, when you give an instance declaration, the method name is treated as an *occurrence* and so has to be=20 qualified if it is ambiguous: module Foo where compare =3D instance Ord T where Prelude.compare =3D ... -- NB! You have to say "Prelude.compare" on the LHS, because both Prelude.compare and Foo.compare are in scope. This is reasonable on the RHS, of course, but it is plain silly on the LHS, because it=20 *must* refer to the compare from the Ord class! After all, its an instance declaration for Ord. =20 Not only is it surprising (most people think that plain "compare" should be fine) but it also adds a whole new big production to the grammar (qfunlhs). So, after some consulation, I have decided to remove this wierd thing. The analogy is with type signatures, where we can already write module Foo where compare :: Int -> Int compare =3D ... Note that we don't have to write "Foo.compare :: Int -> Int" in the type signature. =20 The remaining question is how to explain this point in the Report. My initial conclusion is that simply deleting the offending text was enough. Explaining the problem (given that it isn't really a problem) seems to complicate matters. Nevertheless I'm entirely happy to add an explanation, if people want it and say what they'd like to see. The relevant section is 4.3.2. page 46 of the Report. From biene2xxl@mail.com Tue Dec 4 17:25:41 2001 From: biene2xxl@mail.com (biene2xxl@mail.com) Date: Tue, 4 Dec 2001 10:25:41 -0700 (MST) Subject: hallo Message-ID: <200112041725.KAA0000018394@int.iwhm.com> Mein Geheimnis ist, daß ich immer Lust auf Erotik habe. Bin ich eine Nymphomanin? Oder fehlt mir nur der richtige Partner/in? Könntest Du das sein? Ja? Dann besuch mich doch mal auf meiner kleinen Homepage http://free.adult-freespace.de/coolgirl22/ cu bis bald Biene From diatchki@cse.ogi.edu Tue Dec 4 18:40:55 2001 From: diatchki@cse.ogi.edu (Iavor S. Diatchki) Date: Tue, 4 Dec 2001 10:40:55 -0800 Subject: Haskell 98 Revised In-Reply-To: <1113DDB24D4A2841951BFDF86665EE19066542@RED-MSG-10.redmond.corp.microsoft.com> References: <1113DDB24D4A2841951BFDF86665EE19066542@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <200112041840.KAA20987@church.cse.ogi.edu> hello, it seems that if the qualified names in instance declarations are removed, the qualified methods (data constructors) in exports ought to be removed as well. example: currently in Haskell one may write module M ( P.C(Q.f) ) where import qualified P import qualified Q ... qualifying the method (or data cosntructor) does not give any additional information. however if i read the current report correctly (and i don't think it is quite clear on that) omitting the qualifier of "f" results in an invalid program as there is no method "f" in scope (there probably are "P.f" and "Q.f"however). having said that, GHC accepts the program without the qualifier,so it seems that it essentailly ignores the qualifiers of "subordinate" names in export lists. so why not adjust the report so that such qualified names are just not allowed? bye iavor From diatchki@cse.ogi.edu Tue Dec 4 19:13:39 2001 From: diatchki@cse.ogi.edu (Iavor S. Diatchki) Date: Tue, 4 Dec 2001 11:13:39 -0800 Subject: hiding imports Message-ID: <200112041913.LAA13918@church.cse.ogi.edu> hello, i was wondering if there was a reasong why "hiding imports" have different semantics from "importing imports" and "exports". what i mean is, if one writes: module A(T) where data T = T only the type constructor T is exported. simillarly if i write: module A where data T = T module B where import A(T) only the type constructor is imported, but if i write (module A as above) module B where import A hiding (T) both the type constructor and the value constructor are hidden. this seems not only irregular, but may also be inconvinient in practise as sometimes it happens that a type constructor and a data constructor have the same name, but the data constructor does not "belong" to the type constructor. for example: module A where type T = TGen Int data TGen a = T a | S module B where import A hiding (T) -- intending to just hide the type T genF = T -- error T not in scope! so if i wanted to ignore the type T, but still have the data constructor i have to explicitly import it, i.e. write: module B where import A hiding (T) import A (TGen(T)) which is kind of ugly. is this strange behaviour for historical reasons, or was there a practical reason why this decision was made? bye iavor From afelty@site.uottawa.ca Tue Dec 4 19:34:18 2001 From: afelty@site.uottawa.ca (Amy Felty) Date: Tue, 4 Dec 2001 14:34:18 -0500 (EST) Subject: CFP: Special Journal Issue on Proof-Carrying Code Message-ID: Call for Papers JOURNAL OF AUTOMATED REASONING Special issue on PROOF-CARRYING CODE Proof-carrying code is a technology that allows a host, or code consumer, to safely run code delivered by an untrusted code producer. The code producer delivers both a program and a formal proof that verifies that the code meets the desired safety policies. Safety policies generally express properties that prohibit the code from harmful behavior such as accessing private data, overwriting important data, accessing unauthorized resources, or consuming too many resources. Ideally, a proof is constructed automatically, and proof search may be directed using information that is passed on from the code producer's compiler. Proofs provided semi-automatically or interactively using a proof assistant are possible as well. Upon receiving the code and proof, the code consumer uses a mechanical proof checker to check the proof before executing the code. This special issue will be devoted to the topic of proof-carrying code and related approaches which use formal reasoning to enhance safety and reliability of software. Manuscripts emphasizing original results and study of tools and methods for proof generation, proof checking, and their integration with code generation/compilation are of particular interest. Manuscripts should be unpublished works and not submitted elsewhere. Revised and enhanced 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 originality. Information on JAR submissions can be found at URL http://www-unix.mcs.anl.gov/JAR/. Please format your submissions using JAR macros (available at http://www.wkap.nl/kaphtml.htm/STYLEFILES). Submissions should be sent to the guest editor in postscript format, preferably gzipped and uuencoded. In addition, please send as plain text, the title, authors, abstract, and contact information for the paper. The submission deadline is February 22, 2002. Guest Editor: Amy Felty, University of Ottawa, afelty@site.uottawa.ca This information is available on the web at: http://www.site.uottawa.ca/~afelty/jar-pcc/ From simonpj@microsoft.com Wed Dec 5 10:42:18 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Wed, 5 Dec 2001 02:42:18 -0800 Subject: hiding imports Message-ID: <1113DDB24D4A2841951BFDF86665EE1906655A@RED-MSG-10.redmond.corp.microsoft.com> I think it's an ill-thought-out exception. The point is this: if a data constructor cannot appear on its own in a hiding list, then you can't hide the constructor without hiding the type. Currently you can say import Maybe hiding( Just ) It would be simpler and more uniform to only allow data constructors inside parens, just as for exports, but then I'd have to say import Maybe hiding( Maybe(Just) ) and now the type constructor Maybe is hidden too. I say "ill thought out" because the exception doesn't actually solve the problem, as you point out. You may accidentally hide things you didn't mean to. So perhaps the cure is as bad as the disease. Changing this would be technically easy (delete a sentence) but it might break some programs, so that suggests the status quo. Simon | -----Original Message----- | From: Iavor S. Diatchki [mailto:diatchki@cse.ogi.edu]=20 | Sent: 04 December 2001 19:14 | To: haskell@haskell.org | Subject: hiding imports |=20 |=20 | hello, |=20 | i was wondering if there was a reasong why "hiding imports"=20 | have different semantics from "importing imports" and=20 | "exports". what i mean is, if one=20 | writes: |=20 | module A(T) where | data T =3D T | only the type constructor T is exported. simillarly if i write: |=20 | module A where | data T =3D T |=20 | module B where | import A(T) |=20 | only the type constructor is imported, but if i write | (module A as above) |=20 | module B where | import A hiding (T) |=20 | both the type constructor and the value constructor are hidden. |=20 | this seems not only irregular, but may also be inconvinient=20 | in practise as sometimes it happens that a type constructor=20 | and a data constructor have the same name, but the data=20 | constructor does not "belong" to the type constructor. for example: |=20 | module A where | type T =3D TGen Int | data TGen a =3D T a | S |=20 | module B where | import A hiding (T) -- intending to just hide the type T | genF =3D T -- error T not in scope! |=20 | so if i wanted to ignore the type T, but still have the data=20 | constructor i=20 | have to explicitly import it, i.e. write: | module B where | import A hiding (T) | import A (TGen(T)) | which is kind of ugly. is this strange behaviour for=20 | historical reasons,=20 | or was there a practical reason why this decision was made? |=20 | bye | iavor |=20 |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From simonpj@microsoft.com Wed Dec 5 10:42:17 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Wed, 5 Dec 2001 02:42:17 -0800 Subject: Haskell 98 Revised Message-ID: <1113DDB24D4A2841951BFDF86665EE19066559@RED-MSG-10.redmond.corp.microsoft.com> A good point. You are right that the report is not very explicit on this point; and right that omitting the qualifier would be in the spirit of the story for type sigs and instance decls. =20 I'd be interested to know what others think. Simon | -----Original Message----- | From: Iavor S. Diatchki [mailto:diatchki@cse.ogi.edu]=20 | Sent: 04 December 2001 18:41 | To: haskell@haskell.org | Subject: Re: Haskell 98 Revised |=20 |=20 | hello, |=20 | it seems that if the qualified names in instance declarations=20 | are removed, the qualified methods (data constructors) in=20 | exports ought to be removed as=20 | well. example: currently in Haskell one may write |=20 | module M ( P.C(Q.f) ) where | import qualified P | import qualified Q | ... | qualifying the method (or data cosntructor) does not give=20 | any additional=20 | information. however if i read the current report correctly=20 | (and i don't=20 | think it is quite clear on that) omitting the qualifier of=20 | "f" results in an=20 | invalid program as there is no method "f" in scope (there=20 | probably are "P.f"=20 | and "Q.f"however). having said that, GHC accepts the=20 | program without the=20 | qualifier,so it seems that it essentailly ignores the qualifiers of=20 | "subordinate" names in export lists. so why not adjust the=20 | report so that=20 | such qualified names are just not allowed? |=20 | bye | iavor |=20 |=20 |=20 |=20 |=20 |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From simonpj@microsoft.com Wed Dec 5 11:13:54 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Wed, 5 Dec 2001 03:13:54 -0800 Subject: Haskell 98 Revised Message-ID: <1113DDB24D4A2841951BFDF86665EE1906655B@RED-MSG-10.redmond.corp.microsoft.com> Folks, Concerning the recent change about instance declarations, should this be valid? module M( C(op1) ) where -- NB: op2 not exported class C a where op1 :: a->a op2 :: a->a module N where import M instance C Int where op1 =3D ... op2 =3D ... -- Is this ok? The point here is that M does not export op2. Can we still bind it in the instance declaration in N? The old Report was silent on this point, and so is the new one. I'd like to say "no, this is illegal". Haskell uses hiding as its main abstraction mechanism, and if op2 is hidden then an importing module should not be able to see it in any way. I'll clarify this; but I thought I should point out the issue. Simon | -----Original Message----- | From: Simon Peyton-Jones [mailto:simonpj@microsoft.com]=20 | Sent: 04 December 2001 12:03 | To: haskell@haskell.org | Cc: Simon Peyton-Jones | Subject: Haskell 98 Revised |=20 |=20 | Gentle Haskellers |=20 | The December issue of the Haskell 98 Report is done. |=20 | http://research.microsoft.com/~simonpj/haskell98-revised |=20 | As usual, changes are highlighted in the overall bugs list=20 | thus: [Dec 2001], so you can find them easily. |=20 | There are the usual crop of presentational improvements=20 | (thanks esp to Ian Lynagh, George Russel, Feliks Kluzniak for=20 | much careful reading). There are two non-trivial changes that=20 | I decided to adopt: |=20 | 1. Add showIntAtBase, showOct and showHex to the Numeric library. |=20 | 2. Remove the wart concerning qualified names in instance=20 | declarations. | This a breaking change, in the sense that exotic Haskell programs | may have to change, but I judge it worth it, after some=20 | consultation. | In particular:=20 | * if you use H/Direct, you'll have to re-generate your | Haskell files with a different flag | * if you use the Edison library, you'll need a new copy of | the library (this isn't a problem in practice because it | comes bundled with your compiler) |=20 | The other thing I'd ask you to look at particularly is the=20 | layout algorithm. George and Ian have both pointed out bugs,=20 | but it's very easy to get wrong so a few more eyeballs on it=20 | would be a Good Thing. |=20 | The only unresolved thing I have in my pile is some stuff | about the lexical syntax of comments, which I find it hard to=20 | get excited about. We are definitely converging. My earnest=20 | hope is to finally freeze the Report at Christmas. So this=20 | is your last chance. I hope. |=20 | Thanks |=20 | Simon |=20 | = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D | The instance decl wart |=20 | In Haskell 98 as she stands, when you give an instance=20 | declaration, the method name is treated as an *occurrence*=20 | and so has to be=20 | qualified if it is ambiguous: |=20 | module Foo where |=20 | compare =3D |=20 | instance Ord T where | Prelude.compare =3D ... -- NB! |=20 | You have to say "Prelude.compare" on the LHS, because both=20 | Prelude.compare and Foo.compare are in scope. This is=20 | reasonable on the RHS, of course, but it is plain silly on=20 | the LHS, because it=20 | *must* refer to the compare from the Ord class! After all,=20 | its an instance declaration for Ord. =20 |=20 | Not only is it surprising (most people think that plain=20 | "compare" should be fine) but it also adds a whole new big=20 | production to the grammar (qfunlhs). |=20 | So, after some consulation, I have decided to remove this=20 | wierd thing. The analogy is with type signatures, where we=20 | can already write |=20 | module Foo where |=20 | compare :: Int -> Int | compare =3D ... |=20 | Note that we don't have to write "Foo.compare :: Int -> Int"=20 | in the type signature. =20 |=20 |=20 | The remaining question is how to explain this point in the=20 | Report. My initial conclusion is that simply deleting the=20 | offending text was enough. Explaining the problem (given that=20 | it isn't really a problem) seems to complicate matters. =20 | Nevertheless I'm entirely happy to add an explanation, if=20 | people want it and say what they'd like to see. |=20 | The relevant section is 4.3.2. page 46 of the Report. |=20 |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From kff@it.kth.se Wed Dec 5 13:13:43 2001 From: kff@it.kth.se (Karl-Filip Faxen) Date: Wed, 05 Dec 2001 14:13:43 +0100 Subject: Haskell 98 Revised In-Reply-To: Your message of Wed, 05 Dec 2001 03:13:54 -0800. <1113DDB24D4A2841951BFDF86665EE1906655B@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <200112051313.OAA14174@mail2.it.kth.se> Hi! For whatever that is worth, my semantics agrees with Simon's point here, ie in the example code module M( C(op1) ) where -- NB: op2 not exported class C a where op1 :: a->a op2 :: a->a module N where import M instance C Int where op1 = ... op2 = ... -- Is this ok? the method binding for op2 is not allowed. But then there *is* a scope issue with instance declarations. What about the following example: module M( C(..) ) where -- NB: both methods exported ... class C a where op1 :: a->a op2 :: a->a module N where import M hiding (op2) -- ... but op2 is not imported instance C Int where op1 = ... op2 = ... -- Is this ok? As far as I've understood, the current revision of the Report states that a 'hiding' clause affects the qualified names as well as the unqualified names. Then 'op2' is not visible either qualified or unqualified. So, should it be legal to make a method declaration for it? Cheers, /kff From martin.odersky@epfl.ch Thu Dec 6 09:14:48 2001 From: martin.odersky@epfl.ch (Martin Odersky) Date: Thu, 6 Dec 2001 10:14:48 +0100 Subject: FOOL 9 Call for Participation Message-ID: <200112060914.KAA16836@lamppc11.epfl.ch> CALL FOR PARTICIPATION The Ninth International Workshop on Foundations of Object-Oriented Languages FOOL 9 Sponsored by ACM SIGPLAN January 19, 2002 Portland, Oregon Following POPL '02 The search for sound principles for object-oriented languages has given rise to much work on the theory of programming languages during the past 15 years, leading to a better understanding of the key concepts of object-oriented languages and to important developments in type theory, semantics, and program verification. The FOOL workshops bring together researchers to share new ideas and results in these areas. The next workshop, FOOL 9, will be held in Portland, Oregon, on Saturday January 19, 2002, the day after POPL'02. To register for the workshop, use the standard registration form, available through: http://www.cse.ogi.edu/PacSoft/conf/popl -------------------------------------------------------------------------- Preliminary schedule Saturday, January 29, 2002 8:40 Start 8:45-9:45 Invited Talk Distributed Objects - The Next 10 Years Andrew Black 9:45-10:15 Break 10:15-12:15 Session 1 Modular Typechecking for Hierarchically Extensible Datatypes and Functions Todd Millstein, Craig Chambers Type-checking multi-methods in ML (A modular approach) Daniel Bonniot First-Class Modules for Haskell Mark Shields, Simon Peyton Jones Extensible Objects Without Labels Christopher Stone 12:15-14:00 Lunch 14:00-15:30 Session 2 Modern Concurrency Abstractions for C# Nick Benton, Luca Cardelli, Cedric Fournet OO languages late-binding signature Antoine Beugnard A Semantics for Advice and Dynamic Joint Points in Aspect-Oriented Programming Mitchell Wand, Gregor Kiczales, Christopher Dutchyn 15:30-16:00 Break 16:00-17:30 Session 3 Automatic Discovery of Read-Only Fields, Jens Palsberg, Tian Zhao, Trevor Jim. Generation of Verification Conditions for Abadi and Leino's Logic of Objects Francis Tang, Martin Hofmann Simple Type Inference for Structural Polymorphism Jacques Garrigue ------------------------------------------------------------------------- Steering Committee: Martin Abadi, University of California, Santa Cruz Kim Bruce, Williams College Luca Cardelli, Microsoft Research Kathleen Fisher, AT&T Labs Benjamin Pierce, University of Pennsylvania (chair) Didier Remy, INRIA Rocquencourt Program Committee: Viviana Bono, Universita di Torino Craig Chambers, University of Washington Erik Ernst, University of Aalborg Giorgio Ghelli, University of Pisa Atsushi Igarashi, University of Tokyo Shriram Krishnamurthi, Brown University Martin Odersky, EPFL (chair) Clemens Szyperski, Microsoft Research Jan Vitek, Purdue University From ng13@mcs.le.ac.uk Thu Dec 6 12:25:43 2001 From: ng13@mcs.le.ac.uk (N Ghani) Date: Thu, 06 Dec 2001 12:25:43 +0000 Subject: Rewriting Implementations Message-ID: <200112061225.fB6CPgD24023@ithaca.mcs.le.ac.uk> Is there any Haskell implementations of rewriting tools. This could be any of string, term, equational or whatever forms of rewriting. Also are there any Haskell packages including data structures for algebriac objects like monoids, groups, rings, modules, graphs, categories, enriched categories, K-algebras (ie monoids in K-modules), kan extensions .... Finally, are there any haskell packages for computing quotients of such structures (perhpas using rewriting) Neil From herrmann@infosun.fmi.uni-passau.de Thu Dec 6 19:19:02 2001 From: herrmann@infosun.fmi.uni-passau.de (Ch. A. Herrmann) Date: Thu, 6 Dec 2001 20:19:02 +0100 Subject: Strict foldl Message-ID: <15375.50342.279681.360674@reger.fmi.uni-passau.de> Hi Haskellers, which compiler settings do I have to pass to ghc-5.02 in order to achieve that the strictness analyzer recognizes strictness of (+) in foldl and computes sum in constant space? Prelude> sum [1..10000000] had the following effect: PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 23542 herrmann 20 0 250M 130M 97500 R 66.3 52.4 0:21 ghc-5.02 Of course, one could define a strict foldl oneself: > sfoldl f e [] = e > sfoldl f e (x:xs) = (sfoldl f $! (f e x)) xs ( > sfoldl (+) 0 [1..10000000] returns 50000005000000 in about a minute interpreted using 18MB of total space.) But with the own definition one has to redefine many of the prelude functions. Thanks in advance -- Christoph Herrmann From hdaume@ISI.EDU Thu Dec 6 19:19:31 2001 From: hdaume@ISI.EDU (Hal Daume III) Date: Thu, 6 Dec 2001 11:19:31 -0800 (PST) Subject: class parameters to existential datatypes Message-ID: Hi, I would like to be able to write something like this: > data Foo c = forall a . c a => Foo a Unfortunately, this isn't allowed (apparently) because it's an illegal class assertion (or at least that's what ghc tells me). My motivation for doing this is I want to have something like List, but a class list where all you know is that every element is a member of some class. I would write something like: > data CList c = CNil > | forall a . (c a) => CCons a (CList c) that way I could have something like the prototypical: > class Shape a where { area :: a -> Double } > data Circle = Circle Double > data Rectangle = Rectangle Double Double > instance Shape Circle where { area (Circle r) = 2 * pi * r } > instance Shape Rectangle where { area (Rectangle l w) = l*w } > MyList :: CList Shape > MyList = CCons (Circle 5) (CCons (Rectangle 2 3) CNil) and then maybe have a function: > totalArea :: (CList Shape) -> Double > totalArea = sum . map area obviously this function declaration is also invalid. so I have two questions: 1) Is there any particular reason whey we can't do this (it would break some type safety things or whatever) 2) Any ways to get around it? Thanks! - Hal From rjmh@cs.chalmers.se Thu Dec 6 21:04:46 2001 From: rjmh@cs.chalmers.se (John Hughes) Date: Thu, 6 Dec 2001 22:04:46 +0100 (MET) Subject: class parameters to existential datatypes Message-ID: <200112062104.WAA11520@hotlips.cs.chalmers.se> I would like to be able to write something like this: > data Foo c = forall a . c a => Foo a Unfortunately, this isn't allowed (apparently) because it's an illegal class assertion (or at least that's what ghc tells me). ... so I have two questions: 1) Is there any particular reason whey we can't do this (it would break some type safety things or whatever) 2) Any ways to get around it? Thanks! - Hal Hmm. Interesting. I wrote a paper a couple of years ago, on "Restricted Data Types", which discusses among other things how to simulate abstraction over a class by abstraction over the corresponding dictionary type. You might find the technique useful. It's at http://www.cs.chalmers.se/~rjmh/Papers/restricted-datatypes.ps John Hughes From ashley@semantic.org Thu Dec 6 21:11:07 2001 From: ashley@semantic.org (Ashley Yakeley) Date: Thu, 6 Dec 2001 13:11:07 -0800 Subject: class parameters to existential datatypes Message-ID: <200112062111.NAA02412@mail4.halcyon.com> At 2001-12-06 13:04, John Hughes wrote: > > data Foo c = forall a . c a => Foo a What are you trying to say? In 'data Foo c' you are saying that c is a type (as a parameter). In 'c a =>' you are saying that c is a class. So naturally Haskell complains. -- Ashley Yakeley, Seattle WA From ashley@semantic.org Thu Dec 6 21:12:59 2001 From: ashley@semantic.org (Ashley Yakeley) Date: Thu, 6 Dec 2001 13:12:59 -0800 Subject: class parameters to existential datatypes Message-ID: <200112062112.NAA02509@mail4.halcyon.com> At 2001-12-06 13:11, Ashley Yakeley wrote: >At 2001-12-06 13:04, John Hughes wrote: > >> > data Foo c = forall a . c a => Foo a > >What are you trying to say? In 'data Foo c' you are saying that c is a >type (as a parameter). In 'c a =>' you are saying that c is a class. So >naturally Haskell complains. I'm sorry, I'm not paying attention today... -- Ashley Yakeley, Seattle WA From chak@cse.unsw.edu.au Thu Dec 6 23:34:40 2001 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Fri, 07 Dec 2001 10:34:40 +1100 Subject: Strict foldl In-Reply-To: <15375.50342.279681.360674@reger.fmi.uni-passau.de> References: <15375.50342.279681.360674@reger.fmi.uni-passau.de> Message-ID: <20011207103440M.chak@cse.unsw.edu.au> "Ch. A. Herrmann" wrote, > which compiler settings do I have to pass to ghc-5.02 > in order to achieve that the strictness analyzer > recognizes strictness of (+) in foldl and computes > sum in constant space? > > Prelude> sum [1..10000000] > > had the following effect: > > PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND > 23542 herrmann 20 0 250M 130M 97500 R 66.3 52.4 0:21 ghc-5.02 Is this what I think it is? Do you benchmark the interpreter? Interpreted code isn't optimised. When I compile main = print $ sum [1..10000000] with -O2, it takes 13s on a 600MHz P3 and runs in 1.5MB of space. Now, you may think that `sum' should have been compiled optimised in the Prelude and you just call this optimised version from the interpreter. However, this reasoning is flawed for a number of reasons (one being that you won't make use of specialised versions of Prelude functions in this way). > Of course, one could define a strict foldl oneself: > > > sfoldl f e [] = e > > sfoldl f e (x:xs) = (sfoldl f $! (f e x)) xs > > ( > sfoldl (+) 0 [1..10000000] > returns 50000005000000 in about a minute interpreted > using 18MB of total space.) > > But with the own definition one has to redefine many of the prelude functions. GHC's Prelude does not define `sum' in terms of foldl; instead, it uses the definition sum :: (Num a) => [a] -> a sum l = sum' l 0 where sum' [] a = a sum' (x:xs) a = sum' xs (a+x) The Prelude also defines a specialisation of the function for `Integer' (which is what you get in your example) by way of {-# SPECIALISE sum :: [Integer] -> Integer #-} I haven't checked the Core code produced for the above definition, but as I know GHC, I am pretty sure that it compiles the Prelude definition into a nice tight loop making use of all available strictness. Cheers, Manuel From hdaume@ISI.EDU Thu Dec 6 23:43:08 2001 From: hdaume@ISI.EDU (Hal Daume III) Date: Thu, 6 Dec 2001 15:43:08 -0800 (PST) Subject: Strict foldl In-Reply-To: <20011207103440M.chak@cse.unsw.edu.au> Message-ID: Hi, > Is this what I think it is? Do you benchmark the > interpreter? Interpreted code isn't optimised. When I > compile > > main = print $ sum [1..10000000] > > with -O2, it takes 13s on a 600MHz P3 and runs in 1.5MB of > space. Out of curiousity, why doesn't this get compiled down to main = print 50000005000000 ? That is, why doesn't the compiler carry out the calculation and then just embed that in the compiled version? I know that some C compilers do (at least somewhat) similar things when, for example, you say: x = y * 4 it will rewrite this as x = y << 2 and even do more complicated stuff, like if you say x = y * 12 it will give x = 3 * (y << 2) or whatnot. can I expect this from ghc/nhc/etc? - hal From chak@cse.unsw.edu.au Fri Dec 7 02:33:13 2001 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Fri, 07 Dec 2001 13:33:13 +1100 Subject: Strict foldl In-Reply-To: References: <20011207103440M.chak@cse.unsw.edu.au> Message-ID: <20011207133313X.chak@cse.unsw.edu.au> Hal Daume III wrote, > > Is this what I think it is? Do you benchmark the > > interpreter? Interpreted code isn't optimised. When I > > compile > > > > main = print $ sum [1..10000000] > > > > with -O2, it takes 13s on a 600MHz P3 and runs in 1.5MB of > > space. > > Out of curiousity, why doesn't this get compiled down to > > main = print 50000005000000 > > ? > > That is, why doesn't the compiler carry out the calculation and then just > embed that in the compiled version? Because the compiler can't be sure that the computation terminates. If it doesn't, the compiler would not terminate, which usually makes users quite unhappy ;-) > I know that some C compilers do (at least somewhat) similar things when, > for example, you say: > > x = y * 4 > > it will rewrite this as > > x = y << 2 > > and even do more complicated stuff, like if you say > > x = y * 12 > > it will give > > x = 3 * (y << 2) > > or whatnot. > > can I expect this from ghc/nhc/etc? These kinds of optimisations are different from the use of a Prelude function like `sum', because they don't affect the termination behaviour of the compiler. With -fvia-C GHC will generate C code that is, then, run through the C compiler. If you take this route, then optimisations, such as those you describe, are performed by the C compiler on your Haskell code. The natice code generator probably also performs some of those optimisations, but I am not sure exactly which. Cheers, Manuel From max630@mail.ru Fri Dec 7 02:45:11 2001 From: max630@mail.ru (Max A . K .) Date: Fri, 7 Dec 2001 08:45:11 +0600 Subject: class parameters to existential datatypes In-Reply-To: ; from hdaume@ISI.EDU on Thu, Dec 06, 2001 at 11:19:31AM -0800 References: Message-ID: <20011207084511.B1617@max.home> On Thu, Dec 06, 2001 at 11:19:31AM -0800, Hal Daume III wrote: > 2) Any ways to get around it? Is the following what you want? > data ShapeType = forall t. (Shape t) => ShapeType t > instance Shape ShapeType where { area (ShapeType a) = area a } > class Shape a where { area :: a -> Double } > data Circle = Circle Double > data Rectangle = Rectangle Double Double > instance Shape Circle where { area (Circle r) = 2 * pi * r } > instance Shape Rectangle where { area (Rectangle l w) = l*w } > myList :: [ShapeType] > myList = [ShapeType (Circle 5), ShapeType (Rectangle 2 3)] and then maybe have a function: > totalArea :: [ShapeType] -> Double > totalArea = sum . map area works OK with ghc -fglasgow-exts Max. From michael.vorin@eds.com Fri Dec 7 03:20:45 2001 From: michael.vorin@eds.com (Vorin, Michael) Date: Fri, 7 Dec 2001 13:20:45 +1000 Subject: Haskell Persistence Message-ID: <1D1A08E56535D111BD0400805F59041A03C14514@AUADM100> I am interested in pursuing practical development of persistence in Haskell. To this end I have been looking for code/systems which have been developed previously to build upon - not wishing to reinvent the wheel. I have found some references in the literature but have been enable to track down any "artefacts". I was hopping someone could help me. I have found: (1) Efficient Persistent Haskell, Tony Davie, Kevin Hammond, and Juan Quintela Division of Computer Science, University of St Andrews, 1998 (2) Models for Persistence in Lazy Functional Programming Systems, McNally, University of St Andrews, 1993. (3) A Functional Database (1989) (Correct) Phil Trinder (4) Two Models For Integrating Persistence and Lazy Functional Languages (1991) David J. McNally, Antony J.T. Davie (5) Realizing State-Based Database Concepts in a Non-Strict, Statically Typed, Purely Functional Persistent Programming Language Yoshihiko Ichikawa Department of Information Sciences, Ochanomizu University From trb@eastpac.com.au Fri Dec 7 04:02:35 2001 From: trb@eastpac.com.au (Tim Barbour) Date: Fri, 7 Dec 2001 15:02:35 +1100 (EST) Subject: Haskell Persistence In-Reply-To: <1D1A08E56535D111BD0400805F59041A03C14514@AUADM100> References: <1D1A08E56535D111BD0400805F59041A03C14514@AUADM100> Message-ID: <15376.16219.746147.59447@hermes.virtue> Vorin, Michael writes: > I am interested in pursuing practical development of persistence in Haskell. > To this end I have been looking for code/systems which have been developed > previously to build upon - not wishing to reinvent the wheel. I am implementing persistent memory for Linux (i.e. like virtual memory, but non-volatile, with ACID transaction semantics). Perhaps something will be working sometime in 2002. It is my hope that persistent memory will serve as a foundation for making functional data structures persistent, eventually leading towards a functional operating system. Tim -- "They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety." -- Benjamin Franklin From herrmann@infosun.fmi.uni-passau.de Fri Dec 7 09:34:05 2001 From: herrmann@infosun.fmi.uni-passau.de (Ch. A. Herrmann) Date: Fri, 7 Dec 2001 10:34:05 +0100 Subject: Strict foldl In-Reply-To: <20011207103440M.chak@cse.unsw.edu.au> References: <15375.50342.279681.360674@reger.fmi.uni-passau.de> <20011207103440M.chak@cse.unsw.edu.au> Message-ID: <15376.36109.341751.586793@reger.fmi.uni-passau.de> Hi Manuel, >> PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 23542 >> herrmann 20 0 250M 130M 97500 R 66.3 52.4 0:21 ghc-5.02 Manuel> Is this what I think it is? Do you benchmark the Manuel> interpreter? Interpreted code isn't optimised. not really. I wanted to have a strict foldl (for a different purpose than sum) and could not figure out how to tell the compiler. I tried different things, precompile just one module, compile the entire program, using -fglasgow-exts, but nothing seems to work. Thus, I reduced the problem to sum to make it simpler for you. However, the sum computation based on my sfold definition did not take too long even with the interpreter. Thus, I wondered why the predefined sum computation behaves that bad. Manuel> GHC's Prelude does not define `sum' in terms of foldl; Manuel> instead, it uses the definition ... Where can I find the ghc prelude? Is there also the definition of the mysterious foldl' function which I saw from time to time before it disappeared again? Manuel> I haven't checked the Core code produced for the above Manuel> definition, but as I know GHC, I am pretty sure that it Manuel> compiles the Prelude definition into a nice tight loop Manuel> making use of all available strictness. One would expect that ghci uses a compiled version of sum. Does it or not? Cheers -- Christoph From v-julsew@microsoft.com Fri Dec 7 10:03:13 2001 From: v-julsew@microsoft.com (Julian Seward (Intl Vendor)) Date: Fri, 7 Dec 2001 02:03:13 -0800 Subject: Strict foldl Message-ID: <68B95AA1648D1840AB0083CC63E57AD60F23D4@red-msg-06.redmond.corp.microsoft.com> | > Prelude> sum [1..10000000] | >=20 | > had the following effect: | >=20 | > PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND | > 23542 herrmann 20 0 250M 130M 97500 R 66.3 52.4 0:21 ghc-5.02 |=20 | Is this what I think it is? Do you benchmark the | interpreter? Interpreted code isn't optimised. When I | compile |=20 | main =3D print $ sum [1..10000000] |=20 | with -O2, it takes 13s on a 600MHz P3 and runs in 1.5MB of | space. I should point out that the interpreter's (byte-)code generator is simplistic, and does not emit code to stub (make NULL) stack slots=20 which are known to be dead. This is probably causing the=20 space behaviour you are seeing. In contrast the compiled-code back ends do do stack stubbing. If anyone wants to rewrite the byte code generator to keep track of stack slot liveness and emit suitable stub insns, that would be a service to us all :) [constant folding] | The natice code generator probably also performs some of | those optimisations, but I am not sure exactly which. Yes, it tries quite hard to fold literal trees and usually=20 succeeds well enough that the generated code is pretty much identical to that emitted by gcc. J From kort@science.uva.nl Fri Dec 7 11:05:20 2001 From: kort@science.uva.nl (Jan Kort) Date: Fri, 07 Dec 2001 12:05:20 +0100 Subject: Strict foldl References: <15375.50342.279681.360674@reger.fmi.uni-passau.de> Message-ID: <3C10A270.8D53744F@wins.uva.nl> "Ch. A. Herrmann" wrote: > > Hi Haskellers, > > which compiler settings do I have to pass to ghc-5.02 > in order to achieve that the strictness analyzer > recognizes strictness of (+) in foldl and computes > sum in constant space? > > Prelude> sum [1..10000000] > > had the following effect: > > PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND > 23542 herrmann 20 0 250M 130M 97500 R 66.3 52.4 0:21 ghc-5.02 > > Of course, one could define a strict foldl oneself: > > > sfoldl f e [] = e > > sfoldl f e (x:xs) = (sfoldl f $! (f e x)) xs There is a foldl' in the Hugs Prelude that does this: foldl' :: (a -> b -> a) -> a -> [b] -> a foldl' f a [] = a foldl' f a (x:xs) = (foldl' f $! f a x) xs There are some functions in the Hugs Prelude that use foldl (or foldl1) and some use foldl'. Maybe someone can explain why certain functions use foldl: reverse, maximum, minimum and readInt, while others use foldl': length, sum and product. I can understand why reverse would use foldl, but why do maximum, minimum and readInt use foldl ? Maybe the function foldl1 was based on foldl' at one time ? Jan From Pierre.Lescanne@ens-lyon.fr Fri Dec 7 12:59:00 2001 From: Pierre.Lescanne@ens-lyon.fr (Pierre Lescanne) Date: Fri, 7 Dec 2001 13:59:00 +0100 Subject: RTA 2002 - Call for Papers Message-ID: <15376.48404.703938.420647@tourblanche.ens-lyon.fr> RTA 2002 - Call for Papers The 13th International Conference on Rewriting Techniques and Applicati= ons RTA'02 will take place from July 22, 2002 to July 24, 2002 in Copenhage= n, Denmark, as part of the Federated Logic Conference FLoC'02. Topics RTA is the major forum for the presentation of research on all aspects = of rewriting. Typical areas include (but are not limited to): * Applications: case studies; rule-based programming; symbolic and algebraic computation; theorem proving; functional and logic programming; proof checking. * Foundations: matching and unification; completion techniques; strategies; constraint solving; explicit substitutions. * Frameworks: string, term, and graph rewriting; lambda-calculus and= higher-order rewriting; conditional rewriting; proof nets; constra= ined rewriting and deduction; categorical and infinitary rewriting. * Implementation: compilation techniques; parallel execution; rewrit= ing tools. * Semantics: equational logic; rewriting logic. Best Paper Award A prize of 500 EUR will be given to the best paper as judged by the pro= gram committee. The program committee may decline to make the award or may s= plit it among several papers. Submissions Submissions must be original and not submitted for publication elsewher= e. Submissions should fall into one of the following categories: 1. Regular research papers describing new results; they will be judged = on correctness and significance. 2. Papers describing the experience of applying rewriting techniques in= other areas; they will be judged on relevance and comparison with other= approaches. 3. Problem sets that provide realistic and interesting challenges in th= e field of rewriting. 4. System descriptions; they should contain a link to a working system = and will be judged on usefulness and design. All submissions will be judged on originality. Submissions in the first= three categories can be up to 15 proceedings pages long, system descrip= tions 4 proceedings pages. Authors are strongly encouraged to use LaTeX2e and= the Springer llncs class file, available at http://www.springer.de/comp/lncs/authors.html. The title page should in= clude the submission category. Proofs of theorems should be provided in the p= aper, or, if space does not permit, should be made accessible otherwise (e.g.= , as an appendix to the submission or via the Web). Submission is by email: = Send a self-contained postscript file to Proceedings Accepted papers will be published in the proceedings of the symposium (Lecture Notes in Computer Science, Springer-Verlag). Simultaneous submission to other conferences with published proceedings is not allow= ed. Important dates * Tue January 15, 2002 - paper submission * Fri March 22, 2002 - author notification * Thu April 25, 2002 - camera-ready papers due Program Committee * chair: Sophie Tison LIFL - Laboratoire d'Informatique Fondamentale de Lille URA CNRS 369 Universit=E9 de Lille 1 Cit=E9 Scientifique --- Bat. M3 59655 Villeneuve d'Ascq cedex, FRANCE +33 03 20 43 43 09 +33 03 20 43 47 24 (secretary) +33 03 20 43 45 66 (fax) * Andrea Corradini , Pisa * Daniel J. Dougherty , Wesleyan * J=FCrgen Giesl , Aachen U of Tech= nology * Bernhard Gramlich , Vienna U of Technology * Th=E9r=E8se Hardin , Paris VI * Christopher Lynch , Clarkson * Jerzy Marcinkowski , Wroclaw * Aart Middeldorp , Tsukuba * Joachim Niehren , Saarland * Femke van Raamsdonk , Vrije U of Amsterdam * Albert Rubio , Technical U of Catalonia * Ralf Treinen , Paris-Sud From alms@cin.ufpe.br Fri Dec 7 14:38:04 2001 From: alms@cin.ufpe.br (Andre Santos) Date: Fri, 07 Dec 2001 11:38:04 -0300 Subject: Haskell Persistence References: <1113DDB24D4A2841951BFDF86665EE19066593@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <3C10D44C.7060400@cin.ufpe.br> Hi, a paper describing what a student and I did is in http://www.cin.ufpe.br/~alms/ps/persiste.ps.gz . The idea was to have a class supporting the persistence operations (more in the style of serialization) and to have specific data structures to allow a quicker retrieval of the data ("Persistence Containers"). This is similar to what we have in some Object Oriented Databases. For the low level implementation we used the work on Binary I/O work of Wallace/Runciman. But in order to get more portability we reimplemented parts of it using Strings/Chars for I/O, which ended up very inneficient in Haskell. Some things that might help are: - better binary I/O and/or to interface with some low level existing persistence mechanism. - I believe a kind of reflection mechanism would make things much easier and more efficient to implement. Although automatic derivation of the instances helps. There are some other references in the paper. cheers, Andre. > | -----Original Message----- > | From: Vorin, Michael [mailto:michael.vorin@eds.com] > | Sent: 07 December 2001 03:21 > | To: haskell@haskell.org > | Subject: Haskell Persistence > | > | > | I am interested in pursuing practical development of > | persistence in Haskell. To this end I have been looking for > | code/systems which have been developed previously to build > | upon - not wishing to reinvent the wheel. > | > | I have found some references in the literature but have been > | enable to track down any "artefacts". > | > | I was hopping someone could help me. > | > | I have found: > | (1) Efficient Persistent Haskell, Tony Davie, Kevin Hammond, > | and Juan Quintela Division of Computer Science, University of > | St Andrews, 1998 > | > | (2) Models for Persistence in Lazy Functional Programming > | Systems, McNally, University of St Andrews, 1993. > | > | (3) A Functional Database (1989) (Correct) Phil Trinder > | > | (4) Two Models For Integrating Persistence and Lazy > | Functional Languages > | (1991) David J. McNally, Antony J.T. Davie > | > | (5) Realizing State-Based Database Concepts in a Non-Strict, > | Statically Typed, Purely Functional Persistent Programming > | Language Yoshihiko Ichikawa Department of Information > | Sciences, Ochanomizu University > | > | > | _______________________________________________ > | Haskell mailing list > | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell > | > From anatoli@yahoo.com Fri Dec 7 16:29:44 2001 From: anatoli@yahoo.com (anatoli) Date: Fri, 7 Dec 2001 08:29:44 -0800 (PST) Subject: class parameters to existential datatypes In-Reply-To: Message-ID: <20011207162944.61676.qmail@web14205.mail.yahoo.com> In similar cases I'm doing this: > module Shapes where > class Shape s where > area :: s -> Double > data Rectangle = Rectangle Double Double > data Circle = Circle Double > instance Shape Rectangle where > area (Rectangle l w) = l*w > instance Shape Circle where > area (Circle r) = 2*pi*r > data ShapeRef = forall shape . Shape shape => ShapeRef shape > instance Shape ShapeRef where > area (ShapeRef s) = area s Now, for a heterogeneous list of shapes I can use [ShapeRef]. The last three (== 2+N, where N is the number of methods in the class) lines of code form a repeating pattern. The situation is begging for a language feature! I propose the following syntax: > object ShapeRef of Shape :) --- Hal Daume III wrote: > Hi, > > I would like to be able to write something like this: > > > data Foo c = forall a . c a => Foo a > > Unfortunately, this isn't allowed (apparently) because it's an illegal > class assertion (or at least that's what ghc tells me). > > My motivation for doing this is I want to have something like List, but a > class list where all you know is that every element is a member of some > class. I would write something like: > > > data CList c = CNil > > | forall a . (c a) => CCons a (CList c) > > that way I could have something like the prototypical: > > > class Shape a where { area :: a -> Double } > > data Circle = Circle Double > > data Rectangle = Rectangle Double Double > > instance Shape Circle where { area (Circle r) = 2 * pi * r } > > instance Shape Rectangle where { area (Rectangle l w) = l*w } > > MyList :: CList Shape > > MyList = CCons (Circle 5) (CCons (Rectangle 2 3) CNil) > > and then maybe have a function: > > > totalArea :: (CList Shape) -> Double > > totalArea = sum . map area > > obviously this function declaration is also invalid. > > so I have two questions: > > 1) Is there any particular reason whey we can't do this (it would > break some type safety things or whatever) > 2) Any ways to get around it? > > Thanks! __________________________________________________ Do You Yahoo!? Send your FREE holiday greetings online! http://greetings.yahoo.com From info@tvcuddleblanket.com Fri Dec 7 16:08:34 2001 From: info@tvcuddleblanket.com (TV Cuddle Blanket) Date: 7 Dec 2001 16:08:34 -0000 Subject: TV Cuddle Blanket The gift everybody will want !!! Message-ID: <20011207160834.5038.qmail@net-logik.com> ------10077476423c10e9820565d Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Click the link to read the message. http://www.tvcuddleblanket.com/email//read_mail.php?c=7&u=6328 ------10077476423c10e9820565d Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit


Open this message in a new window ------10077476423c10e9820565d-- From icsmif@unisannio.it Fri Dec 7 17:19:51 2001 From: icsmif@unisannio.it (icsmif@unisannio.it) Date: Fri, 7 Dec 2001 18:19:51 +0100 (CET) Subject: Icsm 2002 Call for Papers Message-ID: <200112071719.fB7HJpr18309@unisannio.it> Dear Colleague I would like to invite you at the IEEE International Conference on Software Maintenance, 2002, and associated workshops: SCAM, WSE, and WESS next October 2002 in Montreal, Canada. Outstanding Keynotes such as Jon Pincus, Microsoft, Industrial and experience papers, reseach papers, tutorials, tool expositions, dissertation forum, workshops, panels, and other exciting activities have been planned. We hope that this CFP will be useful for your work. Please forward the following to anybody who you think may be interested. Our apologies if you received multiple copy of this. If you would like to be removed from our list please send an email to icsm2002.info@unisannio.it with REMOVE in the subject. ICSM2002 Giuliano Antoniol, Program CoChair Ira D. Baxter, Program CoChair ============================================================================ IEEE International Conference on Software Maintenance 2002 Sponsored by IEEE ICSM-2002, Montreal, Canada, 3-6 October 2002 http://www.icsm2002.org icsm2002.info@unisannio.it Call for Papers Theme: Maintaining distributed heterogeneous systems ICSM is the major international conference in the field of software and systems maintenance, evolution, and management. This year's theme elaborates on last year's theme of "systems and software evolution in the era of the internet". Standalone legacy applications of yesterday and novel applications using today's technologies are rapidly becoming integrated as part of enterprise-wide and industry-wide systems. The need for rapid integration has led to many distributed heterogeneous systems that are very challenging to maintain and evolve. ICSM 2002 will address these new scenarios and the major challenges on maintenance and evolution. The focus of the conference will be on the new challenges that heterogeneous systems pose for software maintenance, and the new opportunities for researchers and practitioners. A main goal of ICSM is to promote interaction between researchers and practitioners. ICSM 2002 will bring together researchers, practitioners, developers and users of tools, technology transfer experts, and project managers. Jon Pincus (Microsoft) will describe how Microsoft handles software enhancements. Other outstanding Keynote speakers are being arranged. Past conferences have had Parnas, Rombach, McCabe, and Jacobson. ICSM-2002 will offer technical presentations and demonstrations from academia and industry. We are particularly interested in exchanging concepts, prototypes, research ideas, and other results that could contribute to the academic arena and also benefit business and the industrial community. ICSM 2002 will be participatory, with working collaborative sessions and presentations of industry projects. The Conference will be held in conjunction with: WESS -- Workshop on Empirical Studies of Software Maintenance. SCAM -- Source Code Analysis and Manipulation WSE -- Workshop on WEBsite Evolution Topics of interest include but are not restricted to the following aspects of maintenance and evolution: - Methods and theories - Maintenance and/or productivity metrics - Organizational frameworks - Preventive maintenance - Design for maintenance - Tools and environments - Life cycle and process control - Models/methods for error prediction - User interface evolution - Commercial off-the-shelf (COTS) - Third party maintenance - Freeware and open source applications - Program comprehension - Software and system visualisation - Knowledge based systems - Measurement of software - Formal methods - Legal aspects and standards - Software reusability - Internet and distributed systems - Empirical studies - Testing and regression testing - Remote, tele-work - Version and configuration management - Processes and strategies - Management and organisation - Co-operative applications - Source code analysis and manipulation - Processes and strategies - Impact of new software practices - Programming languages - Reengineering and reverse engineering - Multimedia systems RESEARCH PAPERS: Research papers should describe original and significant work in the research and practice of software maintenance and evolution. Case studies, empirical research, and experiments are particularly welcome. We also welcome papers that present leading edge and novel ideas in maintenance. Papers must not exceed 5000 words (10 pages IEEE style) in length, in English. To encourage strong submissions a prize will be awarded for the "Best Paper as Submitted". This Prize is offered by John Wiley & Sons, the publishers of the Journal of Software Maintenance and Evolution. The Program Committee will select the winner and a formal presentation of the Prize will be made in Montreal at ICSM 2002. FAST TRACK PAPERS: Fast Track papers should describe on-going research activities, or summarize the experience in software maintenance and evolution. Papers must not exceed 4 pages, IEEE style, in length, in English. Accepted fast-track papers will be included in a dedicated section of the conference proceedings. DISSERTATION FORUM: We welcome submissions of young researchers that have delivered their dissertation (Masters or Ph.D.) in the last three years. An award will be issued for the best submission. Four page summaries of accepted dissertations will be included in the conference proceedings and a special forum section will be organised at the conference. INDUSTRIAL APPLICATIONS: Proposals for presentations of Industrial Applications are welcome. These can be state-of-the-art descriptions, experience reports and survey reports from real projects, industrial practices and models, or tool demonstrations. A dedicated sub-committee of the program committee will review Industrial Application proposals and a 1-page summary of accepted proposals will be included in the conference proceedings. TUTORIALS: Tutorials should present software maintenance and evolution topics of interest to practitioners. Tutorials may be full day or half-day in length. SUBMISSION STYLE: PDF and/or Postscript electronic submission only. Papers longer than 15 pages or 6000 words will be returned to the authors. Acceptance notification will occur June 1, 2002. IMPORTANT DATES Research Papers deadline: 15 Feb. 2002 mailto:icsm2002.full@unisannio.it Fast Track Papers deadline: 1 May 2002 mailto:icsm2002.short@unisannio.it Dissertation Forum deadline: 15 Febr. 2002 mailto:icsm2002.thesis@unisannio.it Industrial Applications deadline: 15 March 2002 mailto:icsm2002.industry@unisannio.it Tutorials deadline: 15 Feb. 2002 mailto:icsm2002.tutorial@unisannio.it From XxHackerabwehrxX@mail.com Sun Dec 9 02:22:37 2001 From: XxHackerabwehrxX@mail.com (XxHackerabwehrxX@mail.com) Date: Sat, 8 Dec 2001 19:22:37 -0700 (MST) Subject: Wichtig Message-ID: <200112090222.TAA0000028236@int.iwhm.com> Hi, wir unterlagen einem Angriff verantwortungsloser ausländischer Hacker, deshalb sind wir aus Sicherheitsgründen auf einen besseren Server umgezogen. Es kam zu kurzen Ausfällen, wir bitten Sie um Verständnis. Wir zeigen in der neuen Auflage der *Hackerschule*, wie Sie die teuren ***0190 Dialer*** umgehen und so die kostenpflichtigen (zB. Sex-) Angebote zum Nulltarif nutzen! Wir zeigen Ihnen wie Sie einen beliebigen (AOL, AIM, Yahoo usw.) Chatraum total kontrollieren und mit mehreren Namen on sind! Wir haben natürlich auch SMS Programme die funzen..;-) Natürlich bezahlen Sie noch immer alle SMS über Ihr Handy. Wie lange noch ????...den Code gibts hier: Sie kennen die Konten Ihres Nachbarn noch nicht?...;-) In Ihrem Postfach tummeln sich Sexanbieter? Wir zeigen Ihnen, wie Sie diese loswerden...:-) http://tip.nu/hackerabwehr Das gesammte Wissen und die Toolz der erfolgreichsten Hacker! Sie finden ständig in der *Hackerschule* Mailbomber, Nuker, Scanner, IRC-Bots, Trojaner (Netbus, BO, Sub7...), Handy-Sicherheits-Software (Sie wissen schon... falls ein "Sicherheits"-Code vergessen wurde.. ), Virii, Worms, Crack-Tools, Calling-Card-Generatoren, Creditcard-Tools, DoS-Tools, POD-Tools uvm... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ACHTUNG: Wir dürfen hier aus rechtlichen Gründen nicht alles nennen... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **WMHS** From marks@desertsurf.com Sat Dec 8 02:55:31 2001 From: marks@desertsurf.com (LIL DRIVER) Date: Sat, 08 Dec 2001 18:55:31 1600 Subject: Kid's Holiday Gift of the Year Message-ID: <1007866531.852@com> Golf Cart For Kids - The Lil Driver Golf Cart golf gift of the year

LIL DRIVER GOLF CART
"The Perfect Holiday Gift"
for the 3 to 7 year old golfer! 
Lil Driver golf cart features high-gloss finish on impact-resistant
plastic. The cart drives as good as it looks -- like the real thing!

Rechargeable battery operated, rugged chassis, tough wheels and tires, solid steel chromed axles and suspension, heavy duty motor and gearbox. Two to four hours drive time depending on the child's weight and driving surface.  Includes removable canopy, golf bag and clubs.

**Buy Direct**  $279. + $16. S&H
  
For Telephone Orders
Call: 760-345-4734
Reference # CA1101

  
"Seeing our granddaughter's smile while driving her Lil Driver Golf Cart was wonderful"
 Lee & Helen - La Quinta, CA

The Lil Driver Ride-On Golf Cart features a high-gloss finish on the impact-resistant plastic body. Luxurious features include the seat and back rest with side bars, fold over nylon sun shade canopy, a Velcro strap to hold the Golf Bag in place. The smooth steering-wheel's 3 buttons operates the horn, motor sound and music melodies. Chrome handlebar and drinking cup space on dash, the forward and reverse shifter on the dash, accelerator/brake pedal on the floor, front and rear bumpers and a new automatic safety out-off switch, the Lil Driver is precision built using quality materials throughout.
  
Engineered for years of trouble free driving, the Lil Driver features a rugged chassis, tough wheels and tires, solid steel-chromed axles and suspension, heavy duty motor and gearbox, and 2 to 4 hour driving time depending on the child's weight and driving surface. 10-12 hour recharge time puts this vehicle in a class of its' own.
  
The Lil Driver is virtually maintenance free as well. Just keep it clean with a damp cloth and plastic polish. To recharge the battery simply plug the charging cord into the rear receptacle after use. Children will enjoy years of driving fun and playing golf!

LIL DRIVER FAX ORDER FORM
Please Print and Fax Toll Free to (888) 969-0559
Reference # CA1101

  Number of Golf Carts @ $279 each:        _____
  Shipping :  STANDARD at $16 each car  _____   EXPRESS  at $28 each car _____
  
  Name:                            ____________________________
  
  Address:                        ____________________________
  
 
City, State, Zip:              ____________________________
  
 
Email Address:               ____________________________
  
 
Phone Number:              ____________________________
  
 
Credit Card Type:          ____________________________
  
 
Credit Card Name:         ____________________________
  
 
Credit Card Number:      ____________________________
  
 
Credit Card Expiration:   ____________________________
  
 
Sub Total:                                                          ________________

 
CA Sales Tax (CA Shipping destinations only):   ________________
  
 
Total amount authorized to be charged:               ________________

  Shipping Address (if different from billing address):
  
 
Name:                  _______________________________
  
 
Address:               _______________________________
  
 
City, State, Zip:     _______________________________
  
 
Phone Number:     _______________________________
 
  Card Holder Signature:   ________________________________________
 

From welcome" To be removed from this list simply reply with remove in the subject line. Dear Webmaster, Okay you have a great web site? Submitted to all of the search engines? Even hired some college kid to "promote" you to all of the FFA boards that nobody ever reads? If so I guess that you monthly site traffic is probably in the region of 10 to 100 visitors if you are lucky and you are feeling rather depressed - right? Well we have the definitive answer - we positively guarantee you high quality, genuine traffic to your web site. We make just one 100% guaranteed and solid promise to you - "WE WILL GET PEOPLE LOOKING AT YOUR WEB SITE WITHIN A MONTH - AND IF WE DON'T GET THE AMOUNT OF VISITORS TO YOU THAT WE PROMISE YOU CAN HAVE YOUR MONEY BACK - period" Take a few seconds to see what you get from TrafficFusion.Com The Ultimate Traffic Source ! http://www.trafficfusion.com This the one and only package of it's kind you will never find a more complete source to drive traffic to your web site and it is only being offered for a limited time! Here's What You'll Get: 1,000 Guaranteed Visitors every month for one full year! ($19.95 Value every Month!) 5,000 FREE Banner Impressions Guaranteed every month for one full year! ($24.95 Value every Month!) $500 in FREE Keywords on a Major Search Engine! (That's 50,000 targeted visitors) Free Submission of your Press Release to over 2,500 Media Sources Nationwide every month for one full year! (That's $249 Value!) E-Mail over 1,000,000 Opt-in subscribers daily! Spam Free! (That's a $199 monthly Value) That's a yearly Value of Over $3500 Yours for less than you pay for hosting every month!! You'll Also Get "Guaranteed Hits Secrets Exposed" This package shows you how to generate up to 1,000 hits per hour anytime you want to (and even shows you how to make that 1,000 hits equal even more!). You will have Full Resale Rights to resell the "Guaranteed Hits Secrets Exposed" for any price you choose! (This sells daily on eBay for $199) You'll Also Get: Instant Access To To 1,000's of Resources! Free multi-submission to 100,000's of sites; Instantly! 1000's of FREE reports, ebooks, tutorials and more! Dozens of FREE traffic building tools! Huge collection of home-based internet business links and resources! FREE software including submission utilities, FREE ebook compiler software, meta-tag optimization tools, etc.! Links to over 10,000 FREE ad sites including search engines, classifieds, ffa pages, etc.! FREE webmaster services such as link and html checkers, keyword utilities, doorway page generators, color and graphics tools, etc. FREE web graphics for your website including logo templates, borders & backgrounds, buttons, ebook graphics ,etc. Plus much more! http://www.trafficfusion.com If you are serious about the success of your site give us a shot! There will never be another opportunity to get such a complete promotional package! This is not a quick fix! We will deliver traffic to your site month after month! This is a Full 1 Year membership in our program! We are the traffic professionals! Thanks http://www.trafficfusion.com From igloo@earth.li Sun Dec 9 21:09:24 2001 From: igloo@earth.li (Ian Lynagh) Date: Sun, 9 Dec 2001 21:09:24 +0000 Subject: --+ not treated as a start of a comment In-Reply-To: <15379.52874.123770.335674@vatten.crt.se>; from feliks@crt.se on Sun, Dec 09, 2001 at 09:50:18PM +0100 References: <20011209184346.A18100@stu163.keble.ox.ac.uk> <15379.52874.123770.335674@vatten.crt.se> Message-ID: <20011209210924.A18851@stu163.keble.ox.ac.uk> On Sun, Dec 09, 2001 at 09:50:18PM +0100, Feliks Kluzniak wrote: > > > while the report (and hugs) believe "--+ 1" is a comment. > > If a bystander is allowed to comment... > > Actually, the newer versions of the report say you can use "--" to begin a legal > lexeme (Sec. 2.3, p. 6). Euch. Is --- the start of a comment? Either way the lexical syntax needs to be changed, either to comment -> dashes {any} newline dashes -> -- {-} or to comment -> dashes {any} newline dashes -> -- Thanks Ian From gramlich@logic.at Sat Dec 8 17:14:18 2001 From: gramlich@logic.at (Bernhard Gramlich) Date: Sat, 8 Dec 2001 18:14:18 +0100 (CET) Subject: CFP: WRS 2002 - 2nd WS on Reduction Strategies in Rewriting and Programming Message-ID: <15378.19050.57437.328858@alpha.logic.tuwien.ac.at> [Apologies for multiple copies of this announcement] ************************************************************************** *************** first call for papers and participation **************** ************************************************************************** Second International Workshop on Reduction Strategies in Rewriting and Programming (WRS 2002) http://www.dsic.upv.es/users/elp/WRS2002 held in conjunction with RTA 2002 Copenhagen, Denmark, July 21, 2002 -------------------------------------------------------------------------- BACKGROUND AND AIMS Reduction strategies in rewriting and programming have attracted an increasing attention within the last years. New types of reduction strategies have been invented and investigated, and new results on rewriting / computation under particular strategies have been obtained. Research in this field ranges from primarily theoretical questions about reduction strategies to very practical application and implementation issues. The need for a deeper understanding of reduction strategies in rewriting and programming, both in theory and practice, is obvious, since they bridge the gap between unrestricted general rewriting (computation) and (more deterministic) rewriting with particular strategies (programming). Moreover, reduction strategies provide a natural way to go from operational principles (e.g., graph and term rewriting, narrowing, lambda-calculus) and semantics (e.g., normalization, computation of values, infinitary normalization, head-normalization) to implementations of programming languages. Therefore any progress in this area is likely to be of interest not only to the rewriting community, but also to neighbouring fields like functional programming, functional-logic programming, and termination proofs of algorithms. The workshop wants to provide a forum for the presentation and discussion of new ideas and results, recent developments, new research directions, as well as of surveys on existing knowledge in this area. Furthermore we aim at fostering interaction and exchange between researchers and students actively working on such topics. The workshop will be held in conjunction with RTA 2002 in Copenhagen (Denmark) on July 21, 2002. The workshop is (co-)organized by TU Valencia and TU Wien. TOPICS OF INTEREST Topics of interest include, but are not restricted to, - theoretical foundations for the definition and semantic description of reduction strategies - strategies in different frameworks (term rewriting, graph rewriting, infinitary rewriting, lambda calculi, higher order rewriting and explicit substitutions, conditional rewriting, rewriting with built-ins, narrowing, constraint solving, etc.) and their application in (equational, functional, functional-logic) programming (languages) - properties of reduction strategies / computations under strategies (e.g., completeness, computability, decidability, complexity, optimality, (hyper-)normalization, cofinality, fairness, perpetuality, context-freeness, neededness, laziness, eagerness, strictness) - interrelations, combinations and applications of reduction under different strategies (e.g., equivalence conditions for fundamental properties like termination and confluence, applications in modularity analysis, connections between strategies of different frameworks, etc.) - program analysis and other semantics-based optimization techniques dealing with reduction strategies - rewrite systems / tools / implementations with flexible / programmable strategies as essential concept / ingredient - specification of reduction strategies in (real) languages - data structures and implementation techniques for reduction strategies. SUBMISSIONS We solicit papers on all aspects of reduction strategies in rewriting and programming. Submissions should describe unpublished work, except for survey papers which are explicitly welcome, too. Submissions should not exceed 10 pages (however, survey papers may be longer) and be sent in postscript format to the PC co-chairs to the following e-mail address: wrs02@dsic.upv.es before April 15, 2002. Submissions should include the title, authors' names, affiliations, addresses, and e-mail. Selection of papers by the PC will be based on originality, significance, and correctness. Accepted papers will be included in the workshop proceedings that will be available at the workshop, and electronically on the web. Final versions will be due by June 17, 2002. PUBLICATION Accepted papers will be included in the workshop proceedings that will be available at the workshop, and electronically on the web. A special issue of the Journal of Symbolic Computation on Reduction Strategies in Rewriting and Programming will be designated for revised and extended versions of selected contributions from both WRS 2001 (Utrecht, May 2001) and WRS 2002. PROGRAM COMMITTEE Sergio Antoy Portland (USA) Roberto Di Cosmo Paris VII (France) Bernhard Gramlich (co-chair) Wien (Austria) Michael Hanus Kiel (Germany) Claude Kirchner Nancy (France) Paul Klint CWI Amsterdam (The Netherlands) Salvador Lucas (co-chair) Valencia (Spain) Manfred Schmidt-Schauss Frankfurt am Main (Germany) Yoshihito Toyama Tohoku (Japan) ORGANIZERS Bernhard Gramlich (co-chair) Technische Universitaet Wien Salvador Lucas (co-chair) Universidad Politecnica de Valencia IMPORTANT DATES Deadline for submissions: April 15, 2002 Notification: May 27, 2002 Final versions due: June 17, 2002 Workshop: July 21, 2002 FURTHER INFORMATION WRS 2002 website: http://www.dsic.upv.es/users/elp/WRS2002 WRS 2002 e-mail address: wrs02@dsic.upv.es RTA 2002 website: http://www.ericsson.com/cslab/rta2002/ FLoC 2002 website: http://floc02.diku.dk WRS 2002 website at FLoC: http://floc02.diku.dk/WRS ************************************************************************** From ahey@iee.org Mon Dec 10 05:49:41 2001 From: ahey@iee.org (Adrian Hey) Date: Mon, 10 Dec 2001 05:49:41 +0000 Subject: Another question about sharing Message-ID: <01121005121200.01267@localhost.localdomain> Hello, If I have.. data Path = L Path | R Path | T paths = T : branch paths branch (p:ps) = L p : R p : branch ps This will be a CAF which can never be garbage collected, but may grow indefinitely large as it gets reduced. Correct? Is it possible to avoid this problem somehow? What I have in mind is a special thunk which get's copied (as a normal thunk) before it gets reduced. Pointer references are preserved during copying, except self referential pointers, which are updated to point to the new thunk. Alternatively.. I had thought maybe a function with a dummy argument like this would do.. paths x = let paths' = T : branch paths' in paths' But the paths' will just be lambda lifted as a CAF (I believe) This seems to solve the lambda lifting problem.. paths x = T : branch (paths x) but I'm not sure how compilers will treat this. I think I'll also loose the sharing of earilier paths in new paths, unless the compiler optimises the self reference. If I redefined my datatype.. data Path x = L (Path x) | R (Path x) | T x I could then use the function with dummy argument solution.. paths x = let paths' = T x : branch paths' in paths' This seems to solve both problems, but there's yet another problem I anticipate.. When using any of these dummy argument solutions I have to make sure the argument is not a constant (or I'm back to the lambda lifting problem again). So it has to be any handy unknown variable (argument)? This presents the problem that the unknown variable may itself be quite large, and have it's lifetime unduly prolonged because it's now referenced by many paths. Any advice? Thanks -- Adrian Hey From simonmar@microsoft.com Mon Dec 10 11:18:52 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 10 Dec 2001 11:18:52 -0000 Subject: Another question about sharing Message-ID: <9584A4A864BD8548932F2F88EB30D1C607AADBDB@TVP-MSG-01.europe.corp.microsoft.com> > If I have.. > data Path =3D L Path | R Path | T > paths =3D T : branch paths > branch (p:ps) =3D L p : R p : branch ps >=20 > This will be a CAF which can never be garbage collected, but > may grow indefinitely large as it gets reduced. Correct? GHC will collect the CAF when it can determine that it is no longer required. In GHCi, the CAF will only be collected if you turn on ':set +r', otherwise evaluated CAFs are retained between evaluations. Cheers, Simon From Malcolm.Wallace@cs.york.ac.uk Mon Dec 10 13:33:33 2001 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Mon, 10 Dec 2001 13:33:33 +0000 Subject: Another question about sharing In-Reply-To: <01121005121200.01267@localhost.localdomain> Message-ID: > If I have.. > data Path = L Path | R Path | T > paths = T : branch paths > branch (p:ps) = L p : R p : branch ps > > This will be a CAF which can never be garbage collected, but > may grow indefinitely large as it gets reduced. Correct? Any decent compiler will garbage collect the CAF when it is no longer needed. However, this does not solve the problem that the CAF could grow very large whilst its value is still required. Regards, Malcolm From ralf@informatik.uni-bonn.de Mon Dec 10 14:26:26 2001 From: ralf@informatik.uni-bonn.de (Ralf Hinze) Date: Mon, 10 Dec 2001 15:26:26 +0100 Subject: WAAAPL 2002, preliminary announcement Message-ID: <20011210142250.D19C770CBA@postfix.informatik.uni-bonn.de> Apologies if you receive multiple copies... ============================================================================ PRELIMINARY CALL FOR PAPERS [Deadline for submission: 3rd June 2002] WAAAPL 2002 Workshop on Algorithmic Aspects of Advanced Programming Languages Part of PLI'02 (approval pending) Pittsburgh, PA, USA date to be announced (probably Oct 7 or Oct 8, 2002) http://www.cs.uni-bonn.de/~ralf/waaapl02.{html,pdf,ps,dvi,txt} ============================================================================ 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: to be announced (probably Oct 7 or Oct 8, 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 accepted papers will be published as a University of Bonn technical report. 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 ============================================================================ From lhe@L4i.se Mon Dec 10 09:26:27 2001 From: lhe@L4i.se (Lars-Henrik Eriksson) Date: Mon, 10 Dec 2001 10:26:27 +0100 Subject: FME'2002, 2nd CFP Message-ID: apologies if you receive multiple copies... FORMAL METHODS EUROPE FME 2002 "Formal Methods: Getting IT Right" International Symposium and Tutorials http://floc02.diku.dk/FME/ 20-24 July 2002 Second Call for Papers ********************** =46ME 2002 is the eleventh in a series of symposia organised by Formal Methods Europe, an independent association whose aim is to stimulate the use of, and research on, formal methods for software development. These symposia have been notably successful in bringing together a community of users, researchers, and developers of precise mathematical methods for software development. In 2002 the symposium will be held in conjunction with the third Federated Logic Conference (FLoC'02) in Copenhagen, Denmark. The theme of FME 2002 is Formal Methods: Getting IT Right. The double meaning is intentional. On the one hand, the theme acknowledges the significant contribution formal methods can make to Information Technology, by enabling computer systems to be described precisely and reasoned about with rigour. On the other hand, it recognises that current formal methods are not perfect, and further research and practice are required to improve their foundations, applicability and effectiveness. =46ME seeks papers in all aspects of formal methods for computer systems, including the following: * theoretical foundations * practical use and case studies * specification and modelling techniques * software development and refinement * tool support and software engineering environments for formal methods * verification and validation * hidden formal methods, and making benefits available to non-experts * reusable domain theories * method integration * hardware verification In addition to presentations of submitted papers, the symposium will offer tutorials, workshops, invited speakers, and tool demonstrations. PAPERS =46ull papers should be submitted in Postscript or PDF format by e-mail to reach the Program Co-chairs by 15 January 2002. Papers will be refereed by the Program Committee and must be original research papers that have not been submitted elsewhere for publication. Accepted papers will be published in the symposium proceedings. Papers should not exceed twenty pages, although longer papers will be considered if their content justifies it. LNCS format should be used: see http://www.springer.de/comp/lncs/authors.html for details. Please include a short list of keywords on a separate line at the end of the abstract, beginning with the word "Keyword:" in boldface. OTHER SYMPOSIUM ACTIVITIES Tutorials and workshops will be held on 20-21 July 2002. Each tutorial will last one-half or one day. Proposals are welcome, and should be directed to the Program Co-chairs by 15 January 2002; more details will appear on the web-site above. Tool demonstrations will also take place during the symposium, with the opportunity for presentations to be made about each tool. Proposals for tool demonstrations should be made to the Tool Demonstration Coordinator, with whom provison of necessary computing facilities should be discussed. PEOPLE Organising Chair Dines Bj=F8rner Informatics and Mathematical Modelling Building 322, Richard Petersens Plads Technical University of Denmark DK-2800 Lyngby, Denmark Tel: +45 4525 3720 Email: db@imm.dtu.dk Programme Co-chairs Lars-Henrik Eriksson, Industrilogik L4i AB Box 6205, SE-102 34 Stockholm, Sweden Tel: +46 8 670 37 10 Fax: +46 8 32 12 82 Email: lhe@L4i.se Peter Lindsay, Software Verification Research Centre The University of Queensland, Queensland 4072, Australia Tel: +61 7 3365 2005 Fax: +61 7 3365 1533 Email: Peter.Lindsay@svrc.uq.edu.au Programme Committee Bernhard Aichernig Graz University of Technology, Austria Juan Bicarregui Rutherford Appleton Laboratory, UK Ernie Cohen Telcordia Technologies, USA Ben Di Vito NASA Langley Research Center, USA Cindy Eisner IBM Haifa Research Laboratory, Israel Lars-Henrik Eriksson (co-chair) Industrilogik, Sweden John Fitzgerald Transitive Technologies Ltd, UK Jim Grundy Intel Corporation, USA Yves Ledru LSR/IMAG, France Peter Lindsay (co-chair) University of Queensland, Australia Markus Montigel University of New Orleans, USA Richard Moore IFAD, Denmark Tobias Nipkow Technische Universit=E4t M=FCnchen, Germany Colin O'Halloran Qinetiq (ex-DERA), UK Jose Oliveira Universidade do Minho, Portugal Nico Plat West Consulting, The Netherlands Jeannette Wing Carnegie Mellon University, USA Jim Woodcock Oxford University, UK Joakim von Wright =C5bo Akademi University, Finland Pamela Zave AT&T Laboratories, USA Tool Demonstration Coordinator Paul Mukherjee The Institute of Applied Computer Sciense (IFAD) Forskerparken 10, DK-5230 Odense M, Denmark Tel: +45 6315 7131 Fax: +45 6593 2999 Email: paul.mukherjee@ifad.dk IMPORTANT DATES Submission of papers, tutorial proposals and workshop proposals: 15 January 2002 Notification of acceptance/rejection: 27 March 2002 Camera ready final version of papers due: 10 May 2002 l From ahey@iee.org Mon Dec 10 14:37:37 2001 From: ahey@iee.org (Adrian Hey) Date: Mon, 10 Dec 2001 14:37:37 +0000 Subject: Another question about sharing In-Reply-To: <9584A4A864BD8548932F2F88EB30D1C607AADBDB@TVP-MSG-01.europe.corp.microsoft.com> References: <9584A4A864BD8548932F2F88EB30D1C607AADBDB@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: <01121014205200.01052@localhost.localdomain> On Monday 10 December 2001 11:18 am, Simon Marlow wrote: > > If I have.. > > data Path = L Path | R Path | T > > paths = T : branch paths > > branch (p:ps) = L p : R p : branch ps > > > > This will be a CAF which can never be garbage collected, but > > may grow indefinitely large as it gets reduced. Correct? > > GHC will collect the CAF when it can determine that it is no longer > required. In GHCi, the CAF will only be collected if you turn on ':set > +r', otherwise evaluated CAFs are retained between evaluations. Thanks, I'm curious, how does GHC determine that the CAF is no longer required if it is referenced by code (somehow)? If code was also some kind of heap allocated data structure I guess this would be possible, but I thought this wasn't so with GHC. But in any case, I'm not sure this really helps me. I don't really mind if the unreduced form of the CAF is garbage collected or not (it's only going to be a few words of memory). The effect I'm trying to get is to ensure that the (partially) reduced form of the CAF only lives as long as any (non code) heap object which references it. Does that make sense? (probably not:-) This code was originally written in Clean, and the Clean designers addressed this problem by allowing the programmer to distinguish between constants and functions with no arguments. (The latter being a fragment of code which reconstructs the constant each time it's called, rather than having just one occurrence as a CAF.) It's typically used to inhibit sharing. I don't believe there is any such distinction in Haskell. I thought maybe there was a trick you could use in Haskell to achieve the same effect, but I don't think there is (unless I'm missing something). Regards -- Adrian Hey From simonmar@microsoft.com Mon Dec 10 14:49:56 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 10 Dec 2001 14:49:56 -0000 Subject: Another question about sharing Message-ID: <9584A4A864BD8548932F2F88EB30D1C607AADC72@TVP-MSG-01.europe.corp.microsoft.com> > I'm curious, how does GHC determine that the CAF is no longer required > if it is referenced by code (somehow)? If code was also some kind of > heap allocated data structure I guess this would be possible, but I > thought this wasn't so with GHC. GHC actually tracks references to top-level entities from code, so that the GC can trace the transitive closure of live code and hence find all the reachable CAFs. It's a real pain, but worth it. > But in any case, I'm not sure this really helps me. I don't really > mind if the unreduced form of the CAF is garbage collected or not > (it's only going to be a few words of memory). The effect I'm trying > to get is to ensure that the (partially) reduced form of the CAF only > lives as long as any (non code) heap object which references it. > Does that make sense? (probably not:-) If I understand correctly, that's the behaviour you'll get with GHC, and (I think) nhc98. Cheers, Simon From Malcolm.Wallace@cs.york.ac.uk Mon Dec 10 14:51:28 2001 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Mon, 10 Dec 2001 14:51:28 +0000 Subject: Another question about sharing In-Reply-To: <01121014205200.01052@localhost.localdomain> Message-ID: > > data Path = L Path | R Path | T > > paths = T : branch paths > > branch (p:ps) = L p : R p : branch ps > This code was originally written in Clean, and the Clean designers > addressed this problem by allowing the programmer to distinguish > between constants and functions with no arguments. (The latter > being a fragment of code which reconstructs the constant each time > it's called, rather than having just one occurrence as a CAF.) > It's typically used to inhibit sharing. > > I don't believe there is any such distinction in Haskell. > I thought maybe there was a trick you could use in Haskell to > achieve the same effect Well, how about the following little circular program? paths :: () -> [Path] paths () = let r = T : branch r in r As far as I can understand what you are looking for, I think this meets the bill. Every use of the expression `paths ()' will re-evaluate the infinite structure to the extent its context requires it, and the expanded value will be thrown away as soon as the value of this instance of `paths ()' is no longer required. Regards, Malcolm From simonmar@microsoft.com Mon Dec 10 15:04:06 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 10 Dec 2001 15:04:06 -0000 Subject: Another question about sharing Message-ID: <9584A4A864BD8548932F2F88EB30D1C607AADC79@TVP-MSG-01.europe.corp.microsoft.com> > Well, how about the following little circular program? >=20 > paths :: () -> [Path] > paths () =3D let r =3D T : branch r in r >=20 > As far as I can understand what you are looking for, I think=20 > this meets > the bill. Every use of the expression `paths ()' will re-evaluate > the infinite structure to the extent its context requires it, and the > expanded value will be thrown away as soon as the value of this > instance of `paths ()' is no longer required. You can't rely on adding dummy arguments to cause re-evaluation: full-laziness (enabled when optimisation is on in GHC) will do the opposite transformation. Cheers, Simon From Malcolm.Wallace@cs.york.ac.uk Mon Dec 10 15:13:35 2001 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Mon, 10 Dec 2001 15:13:35 +0000 Subject: Another question about sharing In-Reply-To: <9584A4A864BD8548932F2F88EB30D1C607AADC79@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: > You can't rely on adding dummy arguments to cause re-evaluation: > full-laziness (enabled when optimisation is on in GHC) will do the > opposite transformation. Well in this case, you may find it harder to claim that the full laziness transformation constitutes an `optimisation'. Maybe the GHC manual should have a section on "Flags for worsening the space behaviour of programs". :-) Seriously, would it be difficult to detect when performing this `optimisation' would introduce a CAF and perhaps back it out appropriately? Regards, Malcolm From simonmar@microsoft.com Mon Dec 10 15:32:48 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 10 Dec 2001 15:32:48 -0000 Subject: Another question about sharing Message-ID: <9584A4A864BD8548932F2F88EB30D1C607AADC8B@TVP-MSG-01.europe.corp.microsoft.com> > > You can't rely on adding dummy arguments to cause re-evaluation: > > full-laziness (enabled when optimisation is on in GHC) will do the > > opposite transformation. >=20 > Well in this case, you may find it harder to claim that the full > laziness transformation constitutes an `optimisation'. Maybe the > GHC manual should have a section on "Flags for worsening the space > behaviour of programs". :-) >=20 > Seriously, would it be difficult to detect when performing this > `optimisation' would introduce a CAF and perhaps back it out > appropriately? The problem isn't restricted to CAFs - full laziness always trades space for time. We found that it can be a large win in some cases: if repeated computation is replaced by sharing in an inner loop, then the gains can be dramatic. We didn't meet any cases where it caused space problems, so you get it by default[1] when optimisation is turned on in GHC. You can always disable it with -fno-full-laziness. Cheers, Simon [1] Actually what you get is almost-full-laziness: GHC won't split adjacent lambda abstractions if it finds it can float an expression past some of the lambdas but not all. From igloo@earth.li Mon Dec 10 16:34:47 2001 From: igloo@earth.li (Ian Lynagh) Date: Mon, 10 Dec 2001 16:34:47 +0000 Subject: Clarification of \begin{code} ... \end{code} stuff In-Reply-To: <20011210160327.A24481@stu163.keble.ox.ac.uk>; from igloo@earth.li on Mon, Dec 10, 2001 at 04:03:27PM +0000 References: <20011210160327.A24481@stu163.keble.ox.ac.uk> Message-ID: <20011210163447.A24643@stu163.keble.ox.ac.uk> On Mon, Dec 10, 2001 at 04:03:27PM +0000, Ian Lynagh wrote: > > In the thread "Literate scripts not handled correctly" Simon Marlow > said: > > > Yes, it looks like GHC's unlit program removes whitespace when looking > > for \begin{code}, but not for \end{code}. The report isn't explicit > > about whether whitespace is allowed on these lines, but I would tend to > > the view that it isn't. > > Can you please clarify this in the report [...] Here's an interesting snippet: \begin{code} foo = "hello\ \end{code}" \end{code} which nhc and hugs accept, GHC says "error in character literal". I think this is a good reason for at least non-whitespace to not be allowed on the \begin{code} and \end{code} lines (or rather, for lines with other non-whitespace on them not to be treated as such). Thanks Ian From simonpj@microsoft.com Tue Dec 11 09:15:17 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 11 Dec 2001 01:15:17 -0800 Subject: FW: Clarification of \begin{code} ... \end{code} stuff Message-ID: <1113DDB24D4A2841951BFDF86665EE190665BB@RED-MSG-10.redmond.corp.microsoft.com> > In the thread "Literate scripts not handled correctly" Simon Marlow > said: >=20 > > Yes, it looks like GHC's unlit program removes whitespace when=20 > > looking for \begin{code}, but not for \end{code}. The report isn't=20 > > explicit about whether whitespace is allowed on these lines, but I=20 > > would tend to the view that it isn't. >=20 > Can you please clarify this in the report [...] I'm sure the "\begin{code}" and "\end{code}" should be at the beginning of a line. Whether anything else should be allowed on that line is moot. Maybe not. What would the layout be for this? \begin{code} f x =3D x \end{code} On the other hand it would be painful if a block of code was omitted because of a trailing space on the \begin{code} line; an easy error. I therefore propose code starts on the line *following* a line beginning with \begin{code}. And similarly stops on a line beginning \end{code}. For Ian's snippet: \begin{code} foo =3D "hello\ \end{code}" \end{code} I think it's clear that the first \end{code} should be scanned as part of the string literal. Simon From simonpj@microsoft.com Tue Dec 11 09:37:05 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 11 Dec 2001 01:37:05 -0800 Subject: GCD Message-ID: <1113DDB24D4A2841951BFDF86665EE190665BD@RED-MSG-10.redmond.corp.microsoft.com> About the GCD operator, the Haskell Report currently says: "gcd x y is the greatest integer that divides both x and y.=20 lcm x y is the smallest positive integer that both x and y divide." Why does 'lcm' say 'positive' while 'gcd' does not? What is gcd -3 -6 Presumably 3, not -3. You could say that is obvious, since 3 > -3. So I propose to add "positive" to the gcd spec: gcd x y is the greatest POSITIVE integer=20 that divides both x and y.=20 I don't think that changes the specification in fact, but experience has led me to always check these things! Simon From herrmann@infosun.fmi.uni-passau.de Tue Dec 11 10:06:28 2001 From: herrmann@infosun.fmi.uni-passau.de (Ch. A. Herrmann) Date: Tue, 11 Dec 2001 11:06:28 +0100 Subject: GCD In-Reply-To: <1113DDB24D4A2841951BFDF86665EE190665BD@RED-MSG-10.redmond.corp.microsoft.com> References: <1113DDB24D4A2841951BFDF86665EE190665BD@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <15381.55972.799338.486379@reger.fmi.uni-passau.de> >>>>> "Simon" == Simon Peyton-Jones writes: Simon> gcd x y is the greatest POSITIVE integer that divides Simon> both x and y. Simon> I don't think that changes the specification in fact, but Simon> experience has led me to always check these things! I find it confusing to read a definition which contains redundant information. Instead, I'd suggest to add something like: "Note: this number is always positive" Cheers -- Christoph Herrmann From simonpj@microsoft.com Tue Dec 11 10:07:39 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 11 Dec 2001 02:07:39 -0800 Subject: Instance declarations and class exports Message-ID: <1113DDB24D4A2841951BFDF86665EE190665C2@RED-MSG-10.redmond.corp.microsoft.com> Folks, Iavor has made two excellent points, upon which I have been ruminating (and consulting). Consider module Foo( M.Ix( index ) ) where import qualified Ix as M( Ix ) import qualified Ix as T( index ) instance M.Ix MyType where index a =3D ... index v =3D ... -- A local declaration Notice that: * The Ix class is in scope as "M.Ix", but its index method is in scope ias "T.index". =20 * Nevertheless, it's 100% clear what we mean in the instance declaration * It's also 100% clear what we mean in the export list M.Ix( index ) (The report is currently silent about whether this is legal.) * These two situations are very similar, and should be=20 resolved in the same way * I think we all agree that it woudl be illegal to mention the 'range' method of the Ix class, either in the instance cecl, or in theexport list. Why? Because 'range' is not imported. I therefore want to propose: 1. "subordinate" names in export lists are always unqualified Thus, we can have M.Ix( index ), but not M.Ix( T.index ). 2. A subordinate name in an export list is legal if the entity (class operation or data constructor) is in scope in the module, regardless of whether it is in scope under a qualified or unqualified name. =20 (In the example, T.index.) 3. The exact same rule is used to determine whether the class method name on the LHS of an instance-decl binding is legal. This time I have implemented the rule first, and it seems fine. These are basically clarifications. Objections? Comments? I'd like to find a better wording for (2) above. Simon From drs@dmu.ac.uk Tue Dec 11 10:16:11 2001 From: drs@dmu.ac.uk (David Smallwood) Date: Tue, 11 Dec 2001 10:16:11 GMT Subject: haxml Message-ID: <200112111016.fBBAGBG00226@crazy-horse.cs.cse.dmu.ac.uk> Does anyone know of a mirror site where I can download the latest version of HaXml. (Connection to York is - and has been for a while - apparently down: ftp://ftp.cs.york.ac.uk/pub/haskell/HaXml/HaXml-1.02.tar.gz, that is) Many thanks d. -- David Smallwood Dept. of Computing Science De Montfort University The Gateway Leicester LE1 9BH, UK drs@dmu.ac.uk From john@repetae.net Tue Dec 11 10:17:18 2001 From: john@repetae.net (John Meacham) Date: Tue, 11 Dec 2001 02:17:18 -0800 Subject: GCD In-Reply-To: <15381.55972.799338.486379@reger.fmi.uni-passau.de>; from herrmann@infosun.fmi.uni-passau.de on Tue, Dec 11, 2001 at 11:06:28AM +0100 References: <1113DDB24D4A2841951BFDF86665EE190665BD@RED-MSG-10.redmond.corp.microsoft.com> <15381.55972.799338.486379@reger.fmi.uni-passau.de> Message-ID: <20011211021718.A1728@momenergy.repetae.net> On Tue, Dec 11, 2001 at 11:06:28AM +0100, Ch. A. Herrmann wrote: > >>>>> "Simon" == Simon Peyton-Jones writes: > Simon> gcd x y is the greatest POSITIVE integer that divides > Simon> both x and y. > > Simon> I don't think that changes the specification in fact, but > Simon> experience has led me to always check these things! > > I find it confusing to read a definition which contains redundant > information. Instead, I'd suggest to add something like: > > "Note: this number is always positive" yeah. I strongly agree with this wording. precision without confusion is a really nice feature in specifications. mainly i know that if i were to read the redundant version I would invariably spend several brain cycles trying to figure out why it isn't redundant, only to conclude that it is. John -- --------------------------------------------------------------------------- John Meacham - California Institute of Technology, Alum. - john@repetae.net --------------------------------------------------------------------------- From S.M.Kahrs@ukc.ac.uk Tue Dec 11 10:20:39 2001 From: S.M.Kahrs@ukc.ac.uk (S.M.Kahrs) Date: Tue, 11 Dec 2001 10:20:39 +0000 Subject: GCD Message-ID: The natural reading of 'greatest' is, of course, the greatest in the divisibility preorder (it's partial order on natural numbers but only a preorder on integers). Thus, gcd 0 0 =3D 0. 3 and -3 are equivalent in that preoder. Thus, an additional comment may be in order. Stefan From Malcolm.Wallace@cs.york.ac.uk Tue Dec 11 10:36:27 2001 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Tue, 11 Dec 2001 10:36:27 +0000 Subject: Instance declarations and class exports Message-ID: > I therefore want to propose: > > 1. "subordinate" names in export lists are always unqualified > Thus, we can have M.Ix( index ), but not M.Ix( T.index ). I don't see a compelling reason to outlaw the latter. We can permit the subordinate name to be unqualified, but why should we enforce it? Ditto for method names in instance decls. > I'd like to find a better wording for (2): > > 2. A subordinate name in an export list is legal if the entity (class > operation or data constructor) is in scope in the module, regardless > of whether it is in scope under a qualified or unqualified name. > (In the example, T.index.) Suggestion: A method name, constructor, or field name is permitted to be used unqualified in a subordinate position of an export list, iff the entity it refers to is in scope in the module, regardless of whether the name must be used qualified elsewhere in the module. There is a distinction between a subordinate name (e.g. the index method of Ix), and its use in a subordinate position (e.g. in Ix(index)). In the example, it would be perfectly legal to say module Foo( T.index ) where import qualified Ix as M( Ix ) import qualified Ix as T( index ) index v = ... -- A local declaration where the method name (but not its class) is re-exported. Regards, Malcolm From Keith.Wansbrough@cl.cam.ac.uk Tue Dec 11 10:42:55 2001 From: Keith.Wansbrough@cl.cam.ac.uk (Keith Wansbrough) Date: Tue, 11 Dec 2001 10:42:55 +0000 Subject: GCD In-Reply-To: Your message of "Tue, 11 Dec 2001 11:06:28 +0100." <15381.55972.799338.486379@reger.fmi.uni-passau.de> Message-ID: > Simon> gcd x y is the greatest POSITIVE integer that divides > Simon> both x and y. > > I find it confusing to read a definition which contains redundant > information. Instead, I'd suggest to add something like: > > "Note: this number is always positive" Or, perhaps easier on the eye, "gcd x y is the greatest (positive) integer that divides both x and y." --KW 8-) -- Keith Wansbrough http://www.cl.cam.ac.uk/users/kw217/ University of Cambridge Computer Laboratory. From simonpj@microsoft.com Tue Dec 11 11:02:37 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 11 Dec 2001 03:02:37 -0800 Subject: Instance declarations and class exports Message-ID: <1113DDB24D4A2841951BFDF86665EE190665C8@RED-MSG-10.redmond.corp.microsoft.com> | > 1. "subordinate" names in export lists are always=20 | unqualified Thus,=20 | > we can have M.Ix( index ), but not M.Ix( T.index ). |=20 | I don't see a compelling reason to outlaw the latter. We can=20 | permit the subordinate name to be unqualified, but why should=20 | we enforce it? Ditto for method names in instance decls. Allowing qualified names on the *lhs* of instance decls involves two new productions (qfunlhs, etc) that I have only just nuked. I sent mail about that some while ago, to see if anyone really thought we should keep it. Then, for export lists, the argument becomes one of uniformity=20 (with instance decls) and simplicity. It seems compelling enough to me. Thanks for your wording suggestions. Simon From mechvel@math.botik.ru Tue Dec 11 11:28:49 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Tue, 11 Dec 2001 14:28:49 +0300 Subject: gcd 0 0 Message-ID: People write about the Report definition of gcd x y as of greatest integer that divides x and y, and mention > gcd 0 0 = 0 But 2 also divides 0, because 2*0 = 0. Does the Report specify that gcd 0 0 is not defined? For an occasion: probably, it is better to specify this. ----------------- Serge Mechveliani mechvel@botik.ru From kentk@md.chalmers.se Tue Dec 11 16:10:59 2001 From: kentk@md.chalmers.se (Kent Karlsson) Date: Tue, 11 Dec 2001 17:10:59 +0100 Subject: GCD In-Reply-To: Message-ID: <000101c1825e$6ce26e80$b4e21081@chalmers95a69n> I don't think preorders of any kind should be involved here. Just the ordinary order on integers. No divisibility preorder (I'm not sure how that is even defined, so how it could be natural beats me), no absolute value. I find the unaltered text Simon quoted to be fine as is. But for those who like to be more precise (forgive the TeXese): % Most of you may wish to stop reading at this point. % I is the set of integers representable in the integral datatype. % result_I may return "overflow" or the argument, as appropriate. \begin{example}\atab $gcd_I : I \times I \rightarrow I \cup \{\overflow, \infinitary\}$ \end{example} \begin{example}\atab $gcd_I(x,y)$ \>$= result_I(\max\{v \in \ZZ ~~|~~ v|x $ and $v|y\})$\\ \> \>if $x,y \in I$ and ($x \neq 0$ or $y \neq 0$)\\ \>$= \infinitary(\posinf)$ \>if $x = 0$ and $y = 0$ \end{example} % There is no need to say "v>0" above, since there are always positive values in that % set, and max picks the largest/greatest one. 0 has all integer values except(!) 0 % as divisors. So for gcd 0 0 (maximum, supremum really, of the intersection of the two % sets of divisors) the result is really positive infinity, which should be the result % returned when representable (recommendable for Haskell's Integer datatype). gcd will % overflow for instances like gcd (minBound::Int) (minBound::Int). \begin{example}\atab\\ $lcm_I : I \times I \rightarrow I \cup \{\overflow\}$ \end{example} \begin{example}\atab $lcm_I(x,y)$ \>$= result_I(\min\{v \in \ZZ ~~|~~ x|v $ and $ y|v $ and $ v > 0\})$\\ \> \>if $x,y \in I$ and $x \neq 0$ and $y \neq 0$\\ \>$= 0$ \>if $x,y \in I$ and ($x = 0$ or $y = 0$) \end{example} % the "v>0" is needed here, since the set here would otherwise always contain % infinitely many negative values, and then minimum of that... Kind regards /kent k > -----Original Message----- > From: haskell-admin@haskell.org [mailto:haskell-admin@haskell.org]On > Behalf Of S.M.Kahrs > Sent: den 11 december 2001 11:21 > To: haskell@haskell.org > Subject: Re: GCD > > > The natural reading of 'greatest' is, of course, > the greatest in the divisibility preorder (it's partial order > on natural numbers but only a preorder on integers). > Thus, gcd 0 0 = 0. > > 3 and -3 are equivalent in that preoder. > > Thus, an additional comment may be in order. > > Stefan > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell From ger@tzi.de Tue Dec 11 17:18:31 2001 From: ger@tzi.de (George Russell) Date: Tue, 11 Dec 2001 18:18:31 +0100 Subject: gcd 0 0 Message-ID: <3C163FE7.15D7F3F3@tzi.de> S.D.Mechveliani wrote > Does the Report specify that gcd 0 0 is not defined? Yes. The Report definition says gcd :: (Integral a) => a -> a -> a gcd 0 0 = error "Prelude.gcd: gcd 0 0 is undefined" gcd x y = gcd' (abs x) (abs y) where gcd' x 0 = x gcd' x y = gcd' y (x `rem` y) On reflection, this is quite right. a divides b <=> there is an integer n with na = b. Thus any integer divides 0, and so the "greatest common divisor" would have to be the greatest integer, which is nonsense. Of course if you adopt Stephan Kahrs definition of "greatest", taken with respect to the partial order a<=b <=> a divides b, then gcd 0 0 = 0, because 0 is indeed the greatest integer in this ordering. Mathematically this makes sense, but it's not necessarily what people expect. From Alan@LCS.MIT.EDU Tue Dec 11 18:07:51 2001 From: Alan@LCS.MIT.EDU (Alan Bawden) Date: Tue, 11 Dec 2001 13:07:51 -0500 (EST) Subject: gcd 0 0 In-Reply-To: <3C163FE7.15D7F3F3@tzi.de> (message from George Russell on Tue, 11 Dec 2001 18:18:31 +0100) References: <3C163FE7.15D7F3F3@tzi.de> Message-ID: <11Dec2001.125247.Alan@LCS.MIT.EDU> From: George Russell Date: Tue, 11 Dec 2001 18:18:31 +0100 ... Yes. The Report definition says gcd :: (Integral a) => a -> a -> a gcd 0 0 = error "Prelude.gcd: gcd 0 0 is undefined" gcd x y = gcd' (abs x) (abs y) where gcd' x 0 = x gcd' x y = gcd' y (x `rem` y) On reflection, this is quite right. a divides b <=> there is an integer n with na = b. Thus any integer divides 0, and so the "greatest common divisor" would have to be the greatest integer, which is nonsense. Of course if you adopt Stephan Kahrs definition of "greatest", taken with respect to the partial order a<=b <=> a divides b, then gcd 0 0 = 0, because 0 is indeed the greatest integer in this ordering. Mathematically this makes sense, but it's not necessarily what people expect. If you take the point-of-view that gcd is actually an operation on ideals, then gcd(0, 0) is 0. I.e. define gcd(x, y) to be the smallest z >= 0 such that {m*x + n*y | m, n in Z} = {n*z | n in Z}. This is probably the most natural and general definition of gcd, and is, in fact, what many mathematicians would expect. Also, it is nice to be able to know that gcd(x, 0) = x for -all- x. From fstaylo@alpha.ncsc.mil Tue Dec 11 19:31:53 2001 From: fstaylo@alpha.ncsc.mil (Frank Seaton Taylor) Date: Tue, 11 Dec 2001 14:31:53 -0500 Subject: gcd 0 0 In-Reply-To: <11Dec2001.125247.Alan@LCS.MIT.EDU> Message-ID: <200112111935.OAA14617@orion.ncsc.mil> Folks, Let me chime in in favor of gcd(0,0) = 0 rather than undefined. On Tuesday, December 11, 2001, at 01:07 , Alan Bawden wrote: > Also, it is nice to be able to know that gcd(x, 0) = x for -all- x. Alan is in good company: 1. Steele in "Common Lisp: The Language" says the same thing. 2. Knuth in "The Art of Computer Programming" defines gcd(0,0)=0. ---Frank From igloo@earth.li Tue Dec 11 23:16:39 2001 From: igloo@earth.li (Ian Lynagh) Date: Tue, 11 Dec 2001 23:16:39 +0000 Subject: Layout rule (again) Message-ID: <20011211231639.A2444@stu163.keble.ox.ac.uk> I'm afraid it doesn't seem to be quite right yet :-( Consider instance Foo Maybe where foo = 5 => {4}instance Foo Maybe where {4}foo = 5 => {instance Foo Maybe where {}}foo = 5 The second {4} has meant there is no <4> to cause an implicit semicolon to be inserted. This can be fixed by changing L ({n}:ts) (m:ms) = { : (L ts (n:m:ms)) if n > m, (Note 1) = { : } : (L ts (m:ms)) otherwise to L ({n}:ts) (m:ms) = { : (L ts (n:m:ms)) if n > m, (Note 1) = { : } : (L (:ts) (m:ms)) otherwise Thanks Ian, having a bad day, predominantly due to the layout rule :-( From petersen@redhat.com Wed Dec 12 01:18:04 2001 From: petersen@redhat.com (Jens Petersen) Date: 12 Dec 2001 10:18:04 +0900 Subject: haxml In-Reply-To: <200112111016.fBBAGBG00226@crazy-horse.cs.cse.dmu.ac.uk> References: <200112111016.fBBAGBG00226@crazy-horse.cs.cse.dmu.ac.uk> Message-ID: David Smallwood writes: > Does anyone know of a mirror site where I can download the latest > version of HaXml. (Connection to York is - and has been for a > while - apparently down: ftp://ftp.cs.york.ac.uk/pub/haskell/HaXml/HaXml-1.02.tar.gz, that is) The above url seemed to work for me just now. Jens From chak@cse.unsw.edu.au Wed Dec 12 05:52:01 2001 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Wed, 12 Dec 2001 16:52:01 +1100 Subject: ANN: GHC 5.02.1 RPMs including xlib and HGL packages Message-ID: <20011212165201G.chak@cse.unsw.edu.au> The following might be of special interest to people who are using Paul Hudak's Haskell textbook for teaching and or study and would like to run the SOE graphics examples with GHC - or if you simply want to have an X-based graphics library for an application. GHC's source distribution contains the two library packages `xlib' and `HGL' (Alastair Reid's Haskell Graphics Library) as part of hslibs, which are not by default built and installed. For our local teaching needs at the University of New South Wales, we have produced a patched version of GHC 5.02.1 that includes the aforementioned libraries in a working form. Haskell modules can be compiled or linked against these libraries, by providing the command line options `-package xlib' and `-package HGL', respectively (or you can specify them using the :s command in the interpreter). RPM packages for x86 GNU/Linux based on glibc 2.2 (eg, RedHat 7.x) containing GHC 5.02.1 including the xlib and HGL packages are available as ftp://ftp.cse.unsw.edu.au/pub/users/chak/jibunmaki/i386/ghc-5.02.1-graphics.1.i386.rpm ftp://ftp.cse.unsw.edu.au/pub/users/chak/jibunmaki/i386/ghc-prof-5.02.1-graphics.1.i386.rpm ftp://ftp.cse.unsw.edu.au/pub/users/chak/jibunmaki/i386/ghc-doc-5.02.1-graphics.1.i386.rpm with the source RPM at ftp://ftp.cse.unsw.edu.au/pub/users/chak/jibunmaki/src/ghc-5.02.1-graphics.1.src.rpm The source RPM contains a patched source tar ball and build instructions in the form of an RPM .spec that may be used to build the packages for other Linux distributions and on other Unix systems. (NB: GreenCard need not be installed to build this package, as a throw-away version of GreenCard is included in the tar ball - ie, it is used in the build process, but not installed.) Cheers, Manuel From ahey@iee.org Wed Dec 12 07:47:44 2001 From: ahey@iee.org (Adrian Hey) Date: Wed, 12 Dec 2001 07:47:44 +0000 Subject: Another question about sharing In-Reply-To: <9584A4A864BD8548932F2F88EB30D1C607AADC8B@TVP-MSG-01.europe.corp.microsoft.com> References: <9584A4A864BD8548932F2F88EB30D1C607AADC8B@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: <01121207463700.03104@localhost.localdomain> On Monday 10 December 2001 3:32 pm, Simon Marlow wrote: > The problem isn't restricted to CAFs - full laziness always trades space > for time. We found that it can be a large win in some cases: if > repeated computation is replaced by sharing in an inner loop, then the > gains can be dramatic. We didn't meet any cases where it caused space > problems, so you get it by default[1] when optimisation is turned on in > GHC. You can always disable it with -fno-full-laziness. and Malcolm Wallace wrote: > Well, how about the following little circular program? >       paths :: () -> [Path] >       paths () = let r = T : branch r in r Just to be clear, (with GHC) if I compile a module with this flag, with a local definition of paths.. mkLUT def = where paths = T : branch paths then I'll get a new paths graph every time mkLUT is called? But the effect of this is local to the module, so if mkLUT is exported, any local use of (mkLUT def) where def is a constant will still give a CAF (containing paths) unless that module has also been compiled with -fno-full-laziness? If I'm not mistaken, I have essentially the same problem with Malcolms solution. (() is a constant.) I don't want to make too big an issue over this because it really isn't a show stopper for my purposes, but it would be nice if I could make (what I consider to be) a reasonably safe self contained library module. I.E. Doesn't contain or cause space leaks Is not GHC specific Doesn't require other modules which make use of it to be compiled with particular options. I wonder if those people who know more about formal semantics than I do might consider making the definition of the language less ambiguous wrt sharing and also (maybe) giving programmers more explicit control if they need it, as in Clean. BTW, I can't find any information re. -fno-full-laziness in the current GHC users guide. Is it a deprecated feature? If I try it in an OPTIONS pragma I discover that it's static. Does that mean it has to be applied to a whole program in any case? (I can't think of any other reason it can't be included in a source file). Regards -- Adrian Hey From mailinglist@fmeurope.org Mon Dec 10 12:18:22 2001 From: mailinglist@fmeurope.org (mailinglist@fmeurope.org) Date: Mon, 10 Dec 2001 13:18:22 +0100 Subject: FME 2002: 2nd call for papers Message-ID: <001401c18174$c56cb5f0$dcd22bc0@west.nl> apologies if you receive multiple copies... FORMAL METHODS EUROPE FME 2002 "Formal Methods: Getting IT Right" International Symposium and Tutorials http://floc02.diku.dk/FME/ 20-24 July 2002 Second Call for Papers ********************** FME 2002 is the eleventh in a series of symposia organised by Formal Methods Europe, an independent association whose aim is to stimulate the use of, and research on, formal methods for software development. These symposia have been notably successful in bringing together a community of users, researchers, and developers of precise mathematical methods for software development. In 2002 the symposium will be held in conjunction with the third Federated Logic Conference (FLoC'02) in Copenhagen, Denmark. The theme of FME 2002 is Formal Methods: Getting IT Right. The double meaning is intentional. On the one hand, the theme acknowledges the significant contribution formal methods can make to Information Technology, by enabling computer systems to be described precisely and reasoned about with rigour. On the other hand, it recognises that current formal methods are not perfect, and further research and practice are required to improve their foundations, applicability and effectiveness. FME seeks papers in all aspects of formal methods for computer systems, including the following: * theoretical foundations * practical use and case studies * specification and modelling techniques * software development and refinement * tool support and software engineering environments for formal methods * verification and validation * hidden formal methods, and making benefits available to non-experts * reusable domain theories * method integration * hardware verification In addition to presentations of submitted papers, the symposium will offer tutorials, workshops, invited speakers, and tool demonstrations. PAPERS Full papers should be submitted in Postscript or PDF format by e-mail to reach the Program Co-chairs by 15 January 2002. Papers will be refereed by the Program Committee and must be original research papers that have not been submitted elsewhere for publication. Accepted papers will be published in the symposium proceedings. Papers should not exceed twenty pages, although longer papers will be considered if their content justifies it. LNCS format should be used: see http://www.springer.de/comp/lncs/authors.html for details. Please include a short list of keywords on a separate line at the end of the abstract, beginning with the word "Keyword:" in boldface. OTHER SYMPOSIUM ACTIVITIES Tutorials and workshops will be held on 20-21 July 2002. Each tutorial will last one-half or one day. Proposals are welcome, and should be directed to the Program Co-chairs by 15 January 2002; more details will appear on the web-site above. Tool demonstrations will also take place during the symposium, with the opportunity for presentations to be made about each tool. Proposals for tool demonstrations should be made to the Tool Demonstration Coordinator, with whom provison of necessary computing facilities should be discussed. PEOPLE Organising Chair Dines Bjørner Informatics and Mathematical Modelling Building 322, Richard Petersens Plads Technical University of Denmark DK-2800 Lyngby, Denmark Tel: +45 4525 3720 Email: db@imm.dtu.dk Programme Co-chairs Lars-Henrik Eriksson, Industrilogik L4i AB Box 6205, SE-102 34 Stockholm, Sweden Tel: +46 8 670 37 10 Fax: +46 8 32 12 82 Email: lhe@L4i.se Peter Lindsay, Software Verification Research Centre The University of Queensland, Queensland 4072, Australia Tel: +61 7 3365 2005 Fax: +61 7 3365 1533 Email: Peter.Lindsay@svrc.uq.edu.au Programme Committee Bernhard Aichernig Graz University of Technology, Austria Juan Bicarregui Rutherford Appleton Laboratory, UK Ernie Cohen Telcordia Technologies, USA Ben Di Vito NASA Langley Research Center, USA Cindy Eisner IBM Haifa Research Laboratory, Israel Lars-Henrik Eriksson (co-chair) Industrilogik, Sweden John Fitzgerald Transitive Technologies Ltd, UK Jim Grundy Intel Corporation, USA Yves Ledru LSR/IMAG, France Peter Lindsay (co-chair) University of Queensland, Australia Markus Montigel University of New Orleans, USA Richard Moore IFAD, Denmark Tobias Nipkow Technische Universität München, Germany Colin O'Halloran Qinetiq (ex-DERA), UK Jose Oliveira Universidade do Minho, Portugal Nico Plat West Consulting, The Netherlands Jeannette Wing Carnegie Mellon University, USA Jim Woodcock Oxford University, UK Joakim von Wright Åbo Akademi University, Finland Pamela Zave AT&T Laboratories, USA Tool Demonstration Coordinator Paul Mukherjee The Institute of Applied Computer Sciense (IFAD) Forskerparken 10, DK-5230 Odense M, Denmark Tel: +45 6315 7131 Fax: +45 6593 2999 Email: paul.mukherjee@ifad.dk IMPORTANT DATES Submission of papers, tutorial proposals and workshop proposals: 15 January 2002 Notification of acceptance/rejection: 27 March 2002 Camera ready final version of papers due: 10 May 2002 l _______________________________________________ Mailinglist mailing list Mailinglist@fmeurope.org http://www.fmeurope.org/mailman/listinfo/mailinglist From chinwn@comp.nus.edu.sg Wed Dec 12 11:38:53 2001 From: chinwn@comp.nus.edu.sg (Chin Wei Ngan) Date: Wed, 12 Dec 2001 19:38:53 +0800 (GMT-8) Subject: CFP : ASIA-PEPM 2002 Message-ID: <200112121138.TAA20037@sunA.comp.nus.edu.sg> CALL FOR PAPERS ACM SIGPLAN ASIAN Symposium on Partial Evaluation and Semantics-Based Program Manipulation (ASIA-PEPM'02) Aizu, JAPAN, September 12-14 2002 (co-located with FLOPS2002) http://www.comp.nus.edu.sg/asia-pepm02 Submission deadline: 1st March 2002 The ASIA-PEPM'02 symposium will bring together researchers working in the areas of semantics-based program manipulation, partial evaluation, and program analysis. The symposium focuses on techniques, supporting theory, and applications for the analysis and manipulation of programs. Technical topics include, but are not limited to: * Program manipulation techniques: transformation, specialization, normalization, reflection, rewriting, run-time code generation, multi-level programming. * Program analysis techniques: abstract interpretation, static analysis, binding-time analysis, type-based analysis. * Related issues in language design and models of computation: imperative, functional, logical, constraint-based, object-oriented, parallel, concurrent, secure, domain-specific. * Programs as data objects: staging, meta-programming, incremental computation, mobility, tools and techniques, prototyping and debugging. * Applications: systems programming, scientific computing, embedded systems, graphics, security, model checking, compiler generation, compiler optimization, decompilation. Original results that bear on these and related topics are solicited. Papers investigating novel uses and applications of program manipulation are especially encouraged. Authors concerned about the appropriateness of a topic are welcome to consult with the program chair prior to submission. SUBMISSION INFORMATION Papers should be submitted electronically via the workshop's Web page. Exceptionally, submissions may be emailed to the program chair: asiapepm@comp.nus.edu.sg. Acceptable formats are PostScript or PDF, viewable by gv. Submissions should not exceed 5000 words, excluding bibliography and figures. Submitted papers will be judged on the basis of significance, relevance, correctness, originality, and clarity. They should clearly identify what has been accomplished and why it is significant. The work described should not have been previously published in a major forum. Authors must indicate if a closely related paper is also being considered for another conference or journal. The proceeding of the symposium will be published by ACM Press. A special issue of Higher-Order Symbolic Computation is also planned. LOCAL ARRANGEMENT Mizuhito Ogawa (NTT, Japan) GENERAL CHAIR Kenichi Asai (Ochanomizu University, Japan) PROGRAM CHAIR Wei-Ngan Chin (National University of Singapore, Singapore) PROGRAM COMMITTEE Manuel Chakravarty (University of New South Wales, Australia) Tyng-Ruey Chuang (Academia Sinica, Taiwan) Charles Consel (ENSEIRB, France) Oege de Moor (University of Oxford, UK) Masami Hagiya (University of Tokyo, Japan) Nevin Heintze (Agere Systems, USA) Neil Jones (Univ of Copenhagen, Denmark) Yanhong Annie Liu (SUNY at Stony Brook, USA) Atsushi Ohori (JAIST, Japan) Alberto Pettorossi (University of Roma, Italy) Simon Peyton Jones (Microsoft, UK) Carolyn Talcott (Stanford University, USA) Zhe Yang (University of Pennsylvania, USA) From olaf@cs.york.ac.uk Wed Dec 12 17:43:53 2001 From: olaf@cs.york.ac.uk (Olaf Chitil) Date: Wed, 12 Dec 2001 17:43:53 +0000 Subject: Functional Programming Languages in Education disappeared Message-ID: <3C179759.F9DC779E@cs.york.ac.uk> Christopher Milton informed me that the link from haskell.org to http://www.cs.kun.nl/fple/, the pages on Functional Programming Languages in Education is broken. In fact, the pages seem to have disappeared completely. I think that this is a pity. I believe the pages have not been updated already for a few years. I suppose the maintainers didn't get much feedback from users and hence finally gave up. I wonder if the maintainers would like to comment on this. Didn't the pages have quite a collection of teaching materials? Maybe there are volunteers who would keep this site going? 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 mechvel@math.botik.ru Thu Dec 13 09:53:32 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Thu, 13 Dec 2001 12:53:32 +0300 Subject: gcd 0 0 = 0 Message-ID: People write on gcd 0 0 : Alan Bawden > If you take the point-of-view that gcd is actually an operation on > ideals, then gcd(0, 0) is 0. I.e. define gcd(x, y) to be the smallest > z >= 0 such that {m*x + n*y | m, n in Z} = {n*z | n in Z}. This is > probably the most natural and general definition of gcd, and is, in fact, > what many mathematicians would expect. > > Also, it is nice to be able to know that gcd(x, 0) = x for -all- x. Frank Seaton Taylor writes T> Let me chime in in favor of gcd(0,0) = 0 rather than undefined. T> T> On Tuesday, December 11, 2001, at 01:07 , Alan Bawden wrote: T> T> > Also, it is nice to be able to know that gcd(x, 0) = x for -all- x. T> T> Alan is in good company: T> T> 1. Steele in "Common Lisp: The Language" says the same thing. T> T> 2. Knuth in "The Art of Computer Programming" defines gcd(0,0)=0. T> classic algebra All right. Let us try to investigate this. In such cases one should consult mathematics, not programming. So, let us ignore "Common Lisp ...". And Knuth is all right, I think. Further, the definintion > gcd(x, y) to be the smallest > z >= 0 such that {m*x + n*y | m, n in Z} = {n*z | n in Z} is not natural. In particular, how does it generalize to gcd X Y for polynomials in X, Y with rational coefficients? It is 1. And how would one obtain 1 = f*X + g*Y ? According to classic algebra (Kummer, I guess), gcd x y in (such and such) domain R is the least by inclusion principal ideal (g) that includes the ideal (x, y). Here (a1..an) = set of all combinations y1*a1 + .. + yn*an, yi from R. According to this definition, gcd (X) (Y) = (1) in polynomials, all right, and gcd n m :: Integer is (0) Because (0) is the least by inclusion principal ideal containing (0). And this also contradicts the part "greatest integer that divides ..." in recent Haskell specification. Probably, the best specification would be gcd n m :: Integer = if n == 0 && m == 0 then 0 else greatest integer that divides both n and m ----------------- Serge Mechveliani mechvel@botik.ru From frank@cc.gatech.edu Thu Dec 13 14:04:42 2001 From: frank@cc.gatech.edu (Frank Dellaert) Date: Thu, 13 Dec 2001 09:04:42 -0500 Subject: Integer Enum ? Message-ID: <005301c183df$1f34bc60$a21ccf82@cc.gatech.edu> This is a multi-part message in MIME format. ------=_NextPart_000_0050_01C183B5.340C38E0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi I'm not entirely clear how Integer can be an Enum instance. I thought = Integer was arbitrary size, while for the Enum class you need to define = a mapping from and to Int, which is bounded (in a machine dependent way, = even ?). I'm probably missing something obvious... Cheers Frank Dellaert ------=_NextPart_000_0050_01C183B5.340C38E0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi
I'm not entirely clear how Integer can = be an Enum=20 instance. I thought Integer was arbitrary size, while for the Enum class = you=20 need to define a mapping from and to Int, which is bounded (in a machine = dependent way, even ?). I'm probably missing something = obvious...
Cheers
Frank = Dellaert
------=_NextPart_000_0050_01C183B5.340C38E0-- From shae@www.webwitches.com Thu Dec 13 15:42:45 2001 From: shae@www.webwitches.com (Shae Erisson) Date: Thu, 13 Dec 2001 17:42:45 +0200 (EET) Subject: We need "Documentation" In-Reply-To: References: Message-ID: <20011213.174245.884009776.shae@www.webwitches.com> From: Tony Davie Subject: Re: We need "Documentation" (Was: Re: Integer to String Conversion?) Date: Tue, 4 Dec 2001 09:38:49 +0000 > >The material we have is simply lacking. What we need is a good tutorial and a > >comprehensive reference book. > > ... > > I suggest you look at http://www.haskell.org/bookshelf/, specifically > the section on > Papers available on the Web. This gives numerous tutorials and introductions. I agree with Eray, I tried to learn Haskell without any printed material, and failed. Once I had the Simon Thompson's "Craft of.." I was doing fine. I have an irc friend who would also like to learn Haskell, and who is blind. He uses a braille reader in the Linux console, but the electronically available Haskell documentation just isn't sufficient. I taught myself Python in about two weeks with the online Python tutorial, I think something similar for Haskell would greatly increase the number of Haskell users. ---- Shae Matijs Erisson - http://www.webwitches.com/~shae/ Rabid Linux/XEmacs User - MSOffice documents will be returned as LaTeX From hdaume@ISI.EDU Thu Dec 13 17:07:12 2001 From: hdaume@ISI.EDU (Hal Daume III) Date: Thu, 13 Dec 2001 09:07:12 -0800 (PST) Subject: We need "Documentation" In-Reply-To: <20011213.174245.884009776.shae@www.webwitches.com> Message-ID: > I taught myself Python in about two weeks with the online Python tutorial, I think something similar for Haskell would greatly increase the number of Haskell users. I'm not familiar with the Python tutorial, but the Java tutorial which resides at java.sun.com is pretty much the most highly praised thing I know about. If ever anyone has a Java question or is trying to learn Java, everyone I know simply tells them to read that. It takes about 10 minutes to get up and running (assuming some programming background). Where is the Python tutorial located and is it more-or-less the same as the Java one? Would anyone be interested in working on a similar thing for Haskell? - Hal From shae@www.webwitches.com Thu Dec 13 18:31:50 2001 From: shae@www.webwitches.com (Shae Erisson) Date: Thu, 13 Dec 2001 20:31:50 +0200 (EET) Subject: We need "Documentation" In-Reply-To: References: <20011213.174245.884009776.shae@www.webwitches.com> Message-ID: <20011213.203150.276755180.shae@www.webwitches.com> From: Hal Daume III Subject: Re: We need "Documentation" Date: Thu, 13 Dec 2001 09:07:12 -0800 (PST) > Where is the Python tutorial located and is it more-or-less the same as > the Java one? http://www.python.org/doc/current/tut/tut.html > Would anyone be interested in working on a similar thing for Haskell? me! I'd suggest a HaskellWiki page, since multiuser edits are low overhead there. ---- Shae Matijs Erisson - http://www.webwitches.com/~shae/ Rabid Linux/XEmacs User - MSOffice documents will be returned as LaTeX From hdaume@ISI.EDU Thu Dec 13 18:47:53 2001 From: hdaume@ISI.EDU (Hal Daume III) Date: Thu, 13 Dec 2001 10:47:53 -0800 (PST) Subject: We need "Documentation" In-Reply-To: <20011213.203150.276755180.shae@www.webwitches.com> Message-ID: I think we should move this off the mailing list. I'm willing to spear-head such an effort. Anyone who is interested in contributing, please email me. I'll compile a list of people and we can figure out what we want to do. - 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 Thu, 13 Dec 2001, Shae Erisson wrote: > From: Hal Daume III > Subject: Re: We need "Documentation" > Date: Thu, 13 Dec 2001 09:07:12 -0800 (PST) > > > Where is the Python tutorial located and is it more-or-less the same as > > the Java one? > > http://www.python.org/doc/current/tut/tut.html > > > Would anyone be interested in working on a similar thing for Haskell? > > me! > I'd suggest a HaskellWiki page, since multiuser edits are low overhead there. > ---- > Shae Matijs Erisson - http://www.webwitches.com/~shae/ > Rabid Linux/XEmacs User - MSOffice documents will be returned as LaTeX > From pat@jantar.org Fri Dec 14 00:39:56 2001 From: pat@jantar.org (Patryk Zadarnowski) Date: Fri, 14 Dec 2001 11:39:56 +1100 (EST) Subject: Typesetting literate scripts in TeX Message-ID: <20011214.113956.74747160.pat@jantar.org> Recently I've hacked up a (yet another) TeX package for typesetting literate scripts in TeX, which, I think belongs in http://haskell.org/libraries/#tex". What's different about lambdaTeX is that it is not a cumbersome preprocessor, but a full TeX program (an almost-complete Haskell lexical analyzer written entirely in plain TeX ;-) which typesets Bird-style literate scripts _directly_. The output looks much like the code from Chris Okasaki's book "Purely Functional Data Structures", doing syntax highlighting and converting ASCII art such as "->" or "alpha" to proper mathematical symbols. It should work with both LaTeX and plain TeX, and it does its magic without any annotations, directly on the source code (the only thing that you will probably want to do is add \input lambdaTeX at the top of your source file, and manually typeset your literate comments so they look as good as the source code ;-) I've got a rudimentary web page for it at http://www.jantar.org/lambdaTeX/ with examples and a summary of features. If you have any comments or suggestions, I wouldn't mind hearing them. Enjoy. Pat. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Patryk Zadarnowski University of New South Wales School of Computer Science and Engineering -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- From Alan@LCS.MIT.EDU Fri Dec 14 03:55:31 2001 From: Alan@LCS.MIT.EDU (Alan Bawden) Date: Thu, 13 Dec 2001 22:55:31 -0500 (EST) Subject: gcd 0 0 = 0 In-Reply-To: (mechvel@math.botik.ru) References: Message-ID: <13Dec2001.210227.Alan@LCS.MIT.EDU> From: "S.D.Mechveliani" Date: Thu, 13 Dec 2001 12:53:32 +0300 Further, the definintion > gcd(x, y) to be the smallest > z >= 0 such that {m*x + n*y | m, n in Z} = {n*z | n in Z} is not natural. In particular, how does it generalize to gcd X Y for polynomials in X, Y with rational coefficients? Well, that -is- the way gcd is defined in the commutative algebra textbook I used in graduate school -- I just specialized the definition for the case of the ring of integers, and so I didn't mention that Z was a principle ideal domain. Polynomials in two variables aren't a PID, so yes, you'd have to restore some things I left out. When I said my definition was "general" I suppose I should have anticipated someone would generalize in a way I hadn't intended... (Actually, that definition doesn't even generalize exactly to the Gaussian Integers, where "z >= 0" would have to be replaced by some specification of a region of the complex plane.) ... Probably, the best specification would be gcd n m :: Integer = if n == 0 && m == 0 then 0 else greatest integer that divides both n and m Fortunately, we all seem to agree on what the actual definition should be. I did make a mistake in my previous message. I said that it was nice that gcd(0, x) = x for all x. I should have said: gcd(0, x) = abs(x). From simonpj@microsoft.com Fri Dec 14 09:18:56 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 14 Dec 2001 01:18:56 -0800 Subject: gcd 0 0 = 0 Message-ID: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com> | Probably, the best specification would be |=20 | gcd n m :: Integer =3D if n =3D=3D 0 && m =3D=3D 0 then 0 | else | greatest integer that divides both n and m Well, thank you all those that have contributed. My original point was simply to say greatest (positive) integer that divides both n and m but debate seems to have swirled round whether (gcd 0 0) should be 0 or an error. Currently in H98 it's an error; but it is the kind=20 of thing I'm willing to change IF there is a consensus, because it will only make more programs work. Is there a consensus that such a change would be desirable? If someone could write a sentence or two to explain why gcd 0 0 =3D 0, (ideally, brief ones I can put in the report by way of explanation), I think that might help those of us who have not followed the details of the discussion. =20 Simon From dongen@cs.ucc.ie Fri Dec 14 12:38:58 2001 From: dongen@cs.ucc.ie (Marc van Dongen) Date: Fri, 14 Dec 2001 12:38:58 +0000 Subject: gcd 0 0 = 0 In-Reply-To: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com>; from simonpj@microsoft.com on Fri, Dec 14, 2001 at 01:18:56AM -0800 References: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <20011214123858.J21918@cs.ucc.ie> Simon Peyton Jones (simonpj@microsoft.com) wrote: : If someone could write a sentence or two to explain why gcd 0 0 = 0, : (ideally, brief ones I can put in the report by way of explanation), : I think that might help those of us who have not followed the details : of the discussion. Division in the context of gcds (of integers) is usually defined along the lines of: An integer $a$ divides integer $b$ if there exists an integer $c$ such that $a c= b$. Note that here division is a *relation* an not a *function*/*operator*. Given the definition of division being a relation it makes perfect sense to say that $0$ divides $0$ which is why gcd 0 0 = 0; and gcd 0 0 /= error "Blah" The gcd of two integers is usually defined as a non-negative number to make it unique. HTH. PS: I am strongly in favour of gcd 0 0 = 0. Regards, Marc van Dongen From qrczak@knm.org.pl Fri Dec 14 21:00:13 2001 From: qrczak@knm.org.pl (Marcin 'Qrczak' Kowalczyk) Date: Fri, 14 Dec 2001 22:00:13 +0100 Subject: Typesetting literate scripts in TeX Message-ID: <20011214210013.GA19310@qrnik.zagroda> > Recently I've hacked up a (yet another) TeX package for typesetting > literate scripts in TeX Cool! I will use it in my thesis. One bug: a line can be broken between an inline code and a comma which immediately follows it. -- __("< Marcin Kowalczyk * qrczak@knm.org.pl http://qrczak.ids.net.pl/ \__/ ^^ QRCZAK From igloo@earth.li Fri Dec 14 21:28:30 2001 From: igloo@earth.li (Ian Lynagh) Date: Fri, 14 Dec 2001 21:28:30 +0000 Subject: Confused about default Message-ID: <20011214212830.A25845@stu163.keble.ox.ac.uk> Hi all I am rather confused about default. In section 4.3.4 the report says "each ti must be a monotype for which Num ti holds" but according to grep this is the only place "monotype" appears in the report. If I have the module module TT (Foo(..)) where default (Foo, [Foo], Foo -> Int) data Foo = Foo deriving (Eq, Show) instance Num Foo where {} instance (Eq a, Show a) => Num [a] where {} instance Eq (a -> b) where {} instance Show (a -> b) where {} instance Num (a -> b) where {} then hugs accepts it and TT> 5 Program error: Undefined member: fromInteger ghc accepts it and TT> 5 5 nhc tells me Error when renaming:: Illegal type in default at 4:17 If I remove all the list and function stuff then hi says TT> 5 5 If I have a main = putStrLn $ show 5 then nhc gives me TT> main No default definition for class method fromInteger and ghci gives me Main> main *** Exception: TT.lhs:8: No instance nor default method for class operation PrelNum.fromInteger It seems to me that hugs is in the right with it's handling of 5, but I am not sure who is wrong with default ([Foo]) or (Foo -> Int). Finally, the context free grammar doesn't currently enforce the restriction that only one default declaration be given. Fixing it would make rather a mess, though. Ian From nordland@cse.ogi.edu Sat Dec 15 19:11:15 2001 From: nordland@cse.ogi.edu (Johan Nordlander) Date: Sat, 15 Dec 2001 11:11:15 -0800 Subject: ANNOUNCE: Hugs98 Christmas release Message-ID: <82E00FDE-F18F-11D5-ABD3-003065BDF7A4@cse.ogi.edu> ------------------------------------------------------------------------------ __ __ __ __ ____ ___ _________________________________________ || || || || || || ||__ Hugs 98: Based on the Haskell 98 standard ||___|| ||__|| ||__|| __|| Copyright (c) 1994-2001 ||---|| ___|| World Wide Web: http://haskell.org/hugs || || Report bugs to: hugs-bugs@haskell.org || || Version: Dec 2001 _________________________________________ ------------------------------------------------------------------------------ We are pleased to announce a new release of Hugs98, a Haskell interpreter and programming environment for developing cool Haskell programs. Sources and binaries are freely available on the World-Wide Web. The most important features of this new release are: - The incompatibilities between Hugs and the Haskell Graphics Library have been fixed, and binaries for the HGL are now available on the Hugs download page. - The missing standard libraries Directory, CPUTime, Time and Locale have been added along with a complete implementation of Haskell98 IO. - Hugs is now delivered with most of the hslibs libraries installed in the lib/exts/ directory. The added modules cover the Edison, Parsec, HaXml, QuickCheck, concurrent, monad, and html subdirectories of hslibs. - The :set option now refuses the user to set a module search path that doesn't contain the Prelude. This is to protect users from accidentally rendering their Hugs setups unusable, esp. so on Windows machines where the options are persisted to the Registry. - MacOS X is now one of the supported unix ports, with pre-built binaries available on the download page. - Experimental support is provided for hierarchical module names, where a module name A.B.C is mapped onto the file path A/B/C{.hs,.lhs} and appended to each of the path prefixes in HUGSPATH until the name of a readable file is found. Most reported bugs have also been fixed; however, some issues still remain. See the heading "Hugs Bugs & Features" on the Hugs web site for further information. Send email to hugs-users-request@haskell.org to join the hugs-users mailing list. Bug reports should be sent to hugs-bugs@haskell.org. Send email to hugs-bugs-request@haskell.org to subscribe to the hugs-bugs list. The home page for Hugs is at http://www.haskell.org/hugs. ------------------------------------------------------------------------------ The Hugs 98 system is Copyright (c) Mark P Jones, Alastair Reid, the Yale Haskell Group, and the Oregon Graduate Institute of Science and Technology, 1994-2001, All rights reserved. It is distributed as free software under the license in the file "License", which is included in the distribution. ------------------------------------------------------------------------------ From sof@galois.com Sat Dec 15 19:14:42 2001 From: sof@galois.com (Sigbjorn Finne) Date: Sat, 15 Dec 2001 11:14:42 -0800 Subject: Announce: Hugs Graphics Library Message-ID: <0a6501c1859c$c02fe040$4576fea9@sofbox> We are pleased to announce a new release of the Hugs Graphics Library, version 2.0.4. The Hugs Graphics Library gives the programmer access to the most interesting and portable parts of the Win32 and X11 library. The library is distributed as open source and is suitable for use in teaching and applications. This version is compatible with the December 2001 release of Hugs, but won't work with the February 2001 release. This version supports: * filled and unfilled 2-dimensional objects (text, lines, polygons, ellipses). * Bitmaps (Win32 version only, for now). * Control over text alignment, fonts, color. * Simple input events (keyboard, mouse, window resize) to support reactivity. * Timers and double-buffering to support simple animation. * Use of concurrency to avoid the usual inversion of the code associated with event-loop programming. * Multiple windows may be handled at one time. To keep the library simple and portable, the library makes no attempt to support: * User interface widgets (menus, toolbars, dialog boxes, etc.) * Palette manipulation and other advanced features. * Many kinds of input event. The library can be downloaded from: http://www.haskell.org/graphics/. Installation instructions are in graphics-2.0.4/Install. Bug reports should be sent to reid@cs.utah.edu Enjoy! From matth@mindspring.com Sat Dec 15 23:04:19 2001 From: matth@mindspring.com (Matt Harden) Date: Sat, 15 Dec 2001 17:04:19 -0600 Subject: Integer Enum ? References: <005301c183df$1f34bc60$a21ccf82@cc.gatech.edu> Message-ID: <3C1BD6F3.DF4E1FD3@mindspring.com> > Frank Dellaert wrote: > > Hi > I'm not entirely clear how Integer can be an Enum instance. I thought > Integer was arbitrary size, while for the Enum class you need to > define a mapping from and to Int, which is bounded (in a machine > dependent way, even ?). I'm probably missing something obvious... You're right to wonder about that. It's even worse than you thought. Float and Double are also Enum instances! IMHO, this is a wart in the Haskell definition. Enum is used for two purposes: to support the [x,y..z] syntactic sugar, and to define conversion to/from Int. I think everybody agrees that the [x,y..z] syntax should support Integers, so it has to be an instance of Enum. I suspect that for convenience, the fromEnum and toEnum functions were put in the class to allow easier definitions of new Enum instances for small bounded enumerations. It has the undesireable effect of forcing the implementer of an Enum instance to produce a mapping to/from Int even when it doesn't make any sense. My preference would be to define them as errors in that case; the Haskell Report does not. The Report defines fromEnum for Float and Double; it is silent on Integer, and the Ratio module in the Library Report defines fromEnum for Ratio. In all cases, the reports specify truncation to integer, and there is a comment that the conversion may overflow. Complex does not define an Enum instance, even though it would make sense to me to be able to write [0, 1:+2 .. 5:+10] or the like. I guess fromEnum for Complex, if it existed, would have to just "truncate" the imaginary part! Regarding the Integer instance, Hugs only issues errors on fromEnum x where x is out of range. GHC just returns the value modulo 2^32, or something like that. My advice is to just ignore fromEnum and toEnum for Integer, Float, Double, and Ratio, and, if you need to define your own Enum instance, just define some reasonable mapping to Int, and don't worry much about truncation and overflow... the Haskell designers didn't! :) Matt Harden P.S. I hope the Haskell designers don't take offense; in reality, they have nothing but my deepest respect! From Alan@LCS.MIT.EDU Sun Dec 16 07:34:05 2001 From: Alan@LCS.MIT.EDU (Alan Bawden) Date: Sun, 16 Dec 2001 02:34:05 -0500 (EST) Subject: gcd 0 0 = 0 In-Reply-To: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com> (simonpj@microsoft.com) References: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <15Dec2001.202504.Alan@LCS.MIT.EDU> From: "Simon Peyton-Jones" Date: Fri, 14 Dec 2001 01:18:56 -0800 ... If someone could write a sentence or two to explain why gcd 0 0 = 0, (ideally, brief ones I can put in the report by way of explanation), I think that might help those of us who have not followed the details of the discussion. Well, Serge and I have both offered variations on the real reason why mathematicians agree that gcd 0 0 = 0. I prefer my simpler specialized-for-integers version, but I suspect even that is more mathematics than you want. At the other extreme, you could follow Knuth and simply state: "it is convenient to set gcd(0, 0) = 0", but that seems a bit unconvincing. If I were in your shoes, I'd simply pass the buck to the authorities by saying something like: "Mathematicians agree that gcd(0, 0) = 0". Incidentally, somebody wrote here that Common Lisp defines `(gcd 0 0)' to be 0, but it looks to me like all the language definition really does is state that `(gcd)' (no arguments) is 0 because 0 "is an identity for this operation" (which is technically false, but never mind), from which it is natural for the reader to conclude that `(gcd 0 0)' must be 0. From mechvel@math.botik.ru Sun Dec 16 12:35:57 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Sun, 16 Dec 2001 15:35:57 +0300 Subject: gcd definition Message-ID: Simon Peyton-Jones writes > [..] > If someone could write a sentence or two to explain why gcd 0 0 = 0, > (ideally, brief ones I can put in the report by way of explanation), > I think that might help those of us who have not followed the details > of the discussion. Here it is. gcd n m :: Integer = if n == 0 && m == 0 then 0 else greatest integer that divides both n and m It is set so according to classic definition (by Pythago, Euclid ...) GCD x y = such g that divides both x and y and is a multiple of any g' that divides both x and y. In particular, GCD 0 0 :: Integer = 0 and can be nothing else. Because 0 divides 0 and divides nothing else, everything divides 0 (z*0 = 0). Other comments ------------------------------------------------- * People say, D.Knuth writes gcd 0 0 = 0 in his book. And he is a known mathematically reliable person. * Example. gcd 12 18 :: Integer = 6 or -6, because 6 divides 12 and 18, and any other such number divides 6. * The Haskell report says "greatest integer" for domain = Integer, and thus, chooses the sign `+' for the result. This choice is not a mistake and helps to write shorter programs. * All the above agrees with the modern generic theory of ideals (started in |XX by Kummer, Gauss, Lagrange) for any commutative domain R having the properties of (a /= 0, b /= 0 ==> a*b /= 0), existence of unique factorization to primes. According to it gcd x y = least by inclusion ideal of kind (g) that includes the ideal (x, y), where Ideal (a,b..c) =def= {x*a + y*b +..+ z*c | x,y..z <- R} - a subset in R. `includes` (as set) is a partial order on ideals, and it is true that (1) a divides b <==> (a) includes (b), (2) (a) includes (a). Specializing this definition to Integer, we obtain the source formula. ----------------- Serge Mechveliani mechvel@botik.ru From dongen@cs.ucc.ie Sun Dec 16 13:35:59 2001 From: dongen@cs.ucc.ie (Marc van Dongen) Date: Sun, 16 Dec 2001 13:35:59 +0000 Subject: gcd 0 0 = 0 In-Reply-To: <20011214123858.J21918@cs.ucc.ie>; from dongen@cs.ucc.ie on Fri, Dec 14, 2001 at 12:38:58PM +0000 References: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com> <20011214123858.J21918@cs.ucc.ie> Message-ID: <20011216133559.C27182@cs.ucc.ie> Marc van Dongen (dongen@cs.ucc.ie) wrote: : An integer $a$ divides integer $b$ if there exists an integer : $c$ such that $a c= b$. [snip] : gcd 0 0 = 0; and : gcd 0 0 /= error "Blah" To make clear why $0$ (and not any other non-zero integer) is the gcd of $0$ and $0$ I should have added that for the integer case $g$ is called a greatest common divisor (gcd) of $a$ and $b$ if it satifies each of the following two properties: 1) $g$ divides both $a$ and $b$; 2) if $g'$ is a common divisor of $a$ and $b$ then $g'$ divides $g$. First notice that $0$ is a gcd of $0$ and $0$ because of the following: *) $0$ divides $0$ (and divides $0$); *) whenever $g'$ is an integer that divides $0$ and divides $0$ then $g'$ divides $0$. Next notice that if $g$ is any non-zero integer then $g$ cannot be a gcd of $0$ and $0$ because $0$ (a common divisor of $0$ and $0$) does not divide $g$. Finally, observe that this makes $0$ the unique gcd of $0$ and $0$. : The gcd of two integers is usually defined as a non-negative : number to make it unique. Regards, Marc van Dongen From antony@apocalypse.org Sun Dec 16 20:53:08 2001 From: antony@apocalypse.org (Antony Courtney) Date: Sun, 16 Dec 2001 15:53:08 -0500 Subject: ANNOUNCE: GCJNI - Java Native Interface for Haskell Message-ID: <3C1D09B4.2090103@apocalypse.org> I am pleased to announce an experimental release of GCJNI. GCJNI is a library that allows Haskell to invoke Java code via the Java Native Interface (JNI). The implementation uses GreenCard to make the JNI (a C language interface) available to Haskell. GCJNI includes a few convenient features, such as: - Integration of the Haskell and Java garbage collectors, so that Java objects are garbage collected when they are no longer accessible from Haskell. - Type class based overloading, which makes it easy to pass common types (like Int, Float and String) to or from Java code. - A tool (GenBindings) which uses Java reflection on a set of compiled Java classes to generate a Haskell module with a simple, high-level, type-safe interface to the underlying Java code. GCJNI has been succesfully tested using both hugs98 and ghc under both Linux and Windows. Binary distributions are provided for all for of these (compiler, platform) combinations. More information (including pointers to the relevant distributions) is available from the GCJNI web page at: http://www.haskell.org/gcjni Bug reports and feedback should be sent to antony@apocalypse.org Enjoy! -- Antony Courtney Grad. Student, Dept. of Computer Science, Yale University antony@apocalypse.org http://www.apocalypse.org/pub/u/antony From antony@apocalypse.org Sun Dec 16 20:54:41 2001 From: antony@apocalypse.org (Antony Courtney) Date: Sun, 16 Dec 2001 15:54:41 -0500 Subject: ANNOUNCE: Haven - Scalable Vector Graphics for Haskell Message-ID: <3C1D0A11.4070702@apocalypse.org> I am pleased to announce an experimental release of Haven, a library for scalable vector graphics in Haskell. Haven provides a wealth of features, including: - Data types for common geometric shapes such as rectangles, ellipses and Bezier curves. - Composition of arbitrary shapes from sequences of straight and curved segments. - Intersection tests and bounds calculations on shapes. - Cropping of any image by any shape. - Affine transformations on images and paths. - Calculation of precise rectangular bounds of shapes and images. - High quality, anti-aliased rendering. - Scalable outline fonts. - Smooth blending of colors (gradients) - Alpha blending (transparency). - Fine-grained control of stroke width, join rules and end caps. - Constructive Area Geometry (CAG) for composing shapes using simple set-theoretic operations. Haven presents a purely functional API, but is implemented using the Java2D renderer. For more information on Haven, including examples and download instructions, please visit the haven web page at: http://www.haskell.org/haven Please send suggestions and bug reports to: antony@apocalypse.org Enjoy! -- Antony Courtney Grad. Student, Dept. of Computer Science, Yale University antony@apocalypse.org http://www.apocalypse.org/pub/u/antony From ashley@semantic.org Sun Dec 16 23:57:53 2001 From: ashley@semantic.org (Ashley Yakeley) Date: Sun, 16 Dec 2001 15:57:53 -0800 Subject: ANNOUNCE: GCJNI - Java Native Interface for Haskell Message-ID: <200112162357.PAA26291@mail4.halcyon.com> At 2001-12-16 12:53, Antony Courtney wrote: >I am pleased to announce an experimental release of GCJNI. Eh, you beat me to a first release, which I was going to announce yesterday, but SourceForge's file release system is currently broken. I guess I'll have to put it on semantic.org I had no idea anyone else was working on this. Nevertheless, I suspect I'm further along. -- Ashley Yakeley, Seattle WA From ashley@semantic.org Mon Dec 17 00:34:13 2001 From: ashley@semantic.org (Ashley Yakeley) Date: Sun, 16 Dec 2001 16:34:13 -0800 Subject: ANN: Release 0.1 of Haskell/Java VM Bridge Message-ID: <200112170034.QAA27519@mail4.halcyon.com> The first release, 0.1, of Haskell/Java VM Bridge is now available. Haskell/Java VM Bridge allows Haskell programs access to the Java Virtual Machine. Features include: * On-the-fly creation of Java classes with Haskell functions for methods. * Lifted monads which do all the necessary JNI preloading and 'env'-pointer variable handling for you. These can be automatically generated via a tool (MakeJVMModule). * Integration of garbage collectors, type-class based overloading, and a tool (MakeClassModule) which uses Java reflection etc. to generate a Haskell module etc., etc. It is, however, only available for Unix and works only with GHC. This release should be 'beta' quality, but has undergone little testing. You will need: An x86 machine running some form of Unix; GHC 5.02 or later; The appropriate JVM, installed in the appropriate place: - IBM JDK/JRE 1.3 for x86, installed in /usr/lib/ibm-java/IBMJava2-13/ - Blackdown Port of Sun's JRE 1.3/Sun JDK 1.3 for x86, installed in /usr/lib/j2sdk1.3/ and /usr/lib/j2re1.3/ No documentation is currently available, sorry. Two examples have been included: a trivial "hello world" program, and a program that shows a Java Frame containing an instance of a Haskell-defined subclass of Canvas that has a Haskell 'paint' method that draws an oval. You should be able to figure out most of it from that... and of course the source is available from SourceForge CVS. Be sure to download the correct .tar.gz file for your Java VM. Simple installation instructions are included in the file. SourceForge's file release system is currently broken. When it's fixed, I'll put it there too. Haskell/JVM Bridge and source code is licensed under the GNU Lesser GPL. I hope to build an Darwin/OS X version just as soon as there's a port of GHC 5.02 with a working createAdjustor. -- Ashley Yakeley, Seattle WA From antony@apocalypse.org Mon Dec 17 02:44:30 2001 From: antony@apocalypse.org (Antony Courtney) Date: Sun, 16 Dec 2001 21:44:30 -0500 Subject: ANNOUNCE: GCJNI - Java Native Interface for Haskell References: <200112162357.PAA26291@mail4.halcyon.com> Message-ID: <3C1D5C0E.5090402@apocalypse.org> Hi Ashley, I'm not quite sure why you Cc'ed the whole Haskell list in replying to my release announcement, but just for clarification: Ashley Yakeley wrote: > > I had no idea anyone else was working on this. I find it odd you would say that. When you first mentioned your interest in the JNI on the Haskell list in early July, I replied to you (and the rest of the Haskell list) informing you I was working on such a project, and offering to give you a pre-release snapshot of my source code: http://www.haskell.org/pipermail/haskell/2001-July/001372.html When you didn't reply to that message, I emailed you again privately on August 1st, specifically suggesting that we combine forces to avoid duplication of effort. I never received a reply to that message either. > Nevertheless, I suspect I'm further along. Perhaps. Let's move this discussion to private email and try to find a way to work together. -antony -- Antony Courtney Grad. Student, Dept. of Computer Science, Yale University antony@apocalypse.org http://www.apocalypse.org/pub/u/antony From frank@cc.gatech.edu Mon Dec 17 05:40:21 2001 From: frank@cc.gatech.edu (Frank Dellaert) Date: Mon, 17 Dec 2001 00:40:21 -0500 Subject: space efficiency question Message-ID: <002201c186bd$51fcd6b0$a21ccf82@cc.gatech.edu> This is a multi-part message in MIME format. ------=_NextPart_000_001F_01C18693.68D2E250 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable I'm not a compiler/interpreter implementer, just a Haskell user :-) My question is: if I have two datatypes, say newtype Attributes =3D Att [String] data Instance =3D Instance Attributes [Int] where an Attributes value describes the discrete attributes that are = stored (as Int) in an Instance. Now: if I have a couple of thousand of these Instances, created with the = same Attributes value, as in: a =3D Attributes ["a","bc"] i0000 =3D Instance a [1,2] i0001 =3D Instance a [1,1] ... i7896 =3D Instance a [2,1] can I be assured that there are not thousands of actual copies of a but = that they simply have a pointer to a ? I'm interested in the answer for = both ghc (compiled/interpreted) as interpreted Hugs. I would hope, so, right ? Is there an actual guarantee or is that an = optimization that the implementation might or might not implement ? Cheers Frank Dellaert ------=_NextPart_000_001F_01C18693.68D2E250 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
I'm not a compiler/interpreter = implementer, just a=20 Haskell user :-)
My question is: if I have two = datatypes,=20 say
 
newtype Attributes =3D Att = [String]
data Instance =3D Instance Attributes=20 [Int]
 
where an Attributes value describes the = discrete=20 attributes that are stored (as Int) in an Instance.
 
Now: if I have a couple of thousand of = these=20 Instances, created with the same Attributes value, as in:
 
a =3D Attributes = ["a","bc"]
i0000 =3D Instance a [1,2]
i0001 =3D Instance a [1,1]
...
i7896 =3D Instance a [2,1]
 
can I be assured that there are not = thousands of=20 actual copies of a but that they simply have a pointer to a ? I'm = interested in=20 the answer for both ghc (compiled/interpreted) as interpreted = Hugs.
 
I would hope, so, right ? Is there an = actual=20 guarantee or is that an optimization that the implementation might or = might not=20 implement ?
 
Cheers
Frank = Dellaert
------=_NextPart_000_001F_01C18693.68D2E250-- From simonpj@microsoft.com Mon Dec 17 09:24:47 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Mon, 17 Dec 2001 01:24:47 -0800 Subject: space efficiency question Message-ID: <1113DDB24D4A2841951BFDF86665EE19066623@RED-MSG-10.redmond.corp.microsoft.com> This is a multi-part message in MIME format. --------------InterScan_NT_MIME_Boundary Content-Type: multipart/alternative; boundary="----_=_NextPart_001_01C186DC.ABC0BECE" ------_=_NextPart_001_01C186DC.ABC0BECE Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Now: if I have a couple of thousand of these Instances, created with the same Attributes value, as in: =20 a =3D Attributes ["a","bc"] i0000 =3D Instance a [1,2] i0001 =3D Instance a [1,1] ... i7896 =3D Instance a [2,1] =20 can I be assured that there are not thousands of actual copies of a but that they simply have a pointer to a ? I'm interested in the answer for both ghc (compiled/interpreted) as interpreted Hugs.=20 Yes for GHC: you'll only get one copy of 'a'. =20 Simon =20 ------_=_NextPart_001_01C186DC.ABC0BECE Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Message
Now: if I have a couple of thousand of = these=20 Instances, created with the same Attributes value, as in:
 
a =3D Attributes = ["a","bc"]
i0000 =3D Instance a = [1,2]
i0001 =3D Instance a = [1,1]
...
i7896 =3D Instance a = [2,1]
 
can I be assured that there are = not=20 thousands of actual copies of a but that they simply have a pointer to = a ? I'm=20 interested in the answer for both ghc (compiled/interpreted) as = interpreted=20 Hugs. 
Yes for GHC: you'll only get one copy of=20 'a'.
 
Simon
 
------_=_NextPart_001_01C186DC.ABC0BECE-- --------------InterScan_NT_MIME_Boundary-- From reiner@cs.chalmers.se Mon Dec 17 09:55:16 2001 From: reiner@cs.chalmers.se (Reiner Haehnle) Date: Mon, 17 Dec 2001 10:55:16 +0100 (MET) Subject: Call for Applications to PhD Positions, Chalmers University, Sweden Message-ID: Please pass on to interested students. Apologies for multiple copies. --------------------------------------------------------------------- New PhD Positions (DEADLINE 15 February 2002! See "How to apply" below) Department of Computing Science, Chalmers University of Technology & University of Gothenburg Sweden The Department has about 70 researchers, half being faculty members and half PhD students. Our focus is on programming logic, type theory, functional programming, formal methods, distributed and concurrent systems, security, algorithms, bioinformatics, human computer interaction, and computational linguistics, but research is not restricted to these topics. For more information, see http://www.cs.chalmers.se/Cs/Research. PhD positions are for 5 years. There is no tuition fee. A PhD position is a regular job with social benefits; the salary amounts currently to about 16700 SEK per month in the first year (the exact amount depends on teaching duties, usually 20% of your time). Knowledge of Swedish is not a prerequisite for application. English is our working language for research. Both Swedish and English are used in undergraduate courses. Half of our researchers and PhD students are native Swedes; the rest come from more than 20 different countries. Applicants must have a very good undergraduate degree in Computing Science or in a related subject with a strong Computing Science component. They must also have a strong interest in doing research. You may even apply if you have not yet completed your degree, but expect to do so by September 2002. You are also invited to apply for our new International Master's Programme in Dependable Computer Systems, which can help you to obtain the necessary qualification (see http://www.cs.chalmers.se/Cs/Education/dcs/). The School especially welcomes female applicants. How to apply ------------ First, immediately register your intention to apply using the electronic application form on the WWW via http://www.md.chalmers.se/Jobs/PhD/phd-02-en.thtml The full application should contain 1 A letter of application, listing specific research interests 2 A curriculum vitae 3 Attested copies of degrees and other certificates 4 Copies of relevant work, for example dissertations or articles, that you have authored or co-authored 5 A description of: a previous teaching experience, documented b previous PhD studies, also in other subjects; state financial support for these, if any c previous work experience 6 Letters of recommendation from your teachers or employers If you have financial support of your own (industry job, grant, etc.), please state this fact clearly. It will increase your chances to be accepted considerably, because you need not compete for the limited number of fully financed positions. Send your full application (paper mail) to Department of Computing Science School of Computer Science and Engineering Chalmers University of Technology 412 96 Gothenburg Sweden to arrive by 15 February 2002. You will know the result of your application by 1 May 2002. From thorinn@diku.dk Mon Dec 17 14:50:21 2001 From: thorinn@diku.dk (Lars Henrik Mathiesen) Date: 17 Dec 2001 14:50:21 -0000 Subject: gcd 0 0 = 0 In-Reply-To: <20011216133559.C27182@cs.ucc.ie> (message from Marc van Dongen on Sun, 16 Dec 2001 13:35:59 +0000) Message-ID: <20011217145021.3269.qmail@tyr.diku.dk> > From: Marc van Dongen > Date: Sun, 16 Dec 2001 13:35:59 +0000 > > Marc van Dongen (dongen@cs.ucc.ie) wrote: > > : An integer $a$ divides integer $b$ if there exists an integer > : $c$ such that $a c= b$. > > To make clear why $0$ (and not any other non-zero integer) is the > gcd of $0$ and $0$ I should have added that for the integer case > $g$ is called a greatest common divisor (gcd) of $a$ and $b$ if it > satifies each of the following two properties: > > 1) $g$ divides both $a$ and $b$; > 2) if $g'$ is a common divisor of $a$ and $b$ then $g'$ divides $g$. In case it isn't clear already, these definitions make a lattice on the positive integers, with divides ~ leq, gcd ~ meet and lcm ~ join, using the report's definitions of gcd and lcm. (Choosing the positive result for gcd/lcm is equivalent to noting that divides is a partial preorder on the non-zero integers, and that the quotient identifies x and -x). The only thing that is lacking to make it a lattice on the non-negative integers, is that gcd 0 0 = 0 . All other cases involving zero (i.e., gcd 0 x = x for non-zero x, and lcm 0 x = 0 for all x) are consistent with 0 being the maximal element in the lattice, i.e., that all integers divide zero. Lars Mathiesen (U of Copenhagen CS Dep) (Humour NOT marked) From simonpj@microsoft.com Mon Dec 17 16:57:28 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Mon, 17 Dec 2001 08:57:28 -0800 Subject: Confused about default Message-ID: <1113DDB24D4A2841951BFDF86665EE19066637@RED-MSG-10.redmond.corp.microsoft.com> Well, Foo *is* an instance of Num, so a correct Haskell impl should pick that instance always. Since you don't define the fromInteger method in the instance decl, you get a runtime error. I don't know what you expect the [Foo] and Foo -> Int defaults to do. GHCi fails to put the correct default decl in place for command-line expressions. This is a known bug which we have not got around to fixing yet Simon | -----Original Message----- | From: Ian Lynagh [mailto:igloo@earth.li]=20 | Sent: 14 December 2001 21:29 | To: haskell@haskell.org | Subject: Confused about default |=20 |=20 |=20 | Hi all |=20 | I am rather confused about default. |=20 | In section 4.3.4 the report says | "each ti must be a monotype for which Num ti holds" | but according to grep this is the only place "monotype"=20 | appears in the report. |=20 | If I have the module |=20 | module TT (Foo(..)) where |=20 | default (Foo, [Foo], Foo -> Int) |=20 | data Foo =3D Foo deriving (Eq, Show) |=20 | instance Num Foo where {} | instance (Eq a, Show a) =3D> Num [a] where {} | instance Eq (a -> b) where {} | instance Show (a -> b) where {} | instance Num (a -> b) where {} |=20 | then hugs accepts it and | TT> 5 |=20 | Program error: Undefined member: fromInteger |=20 | ghc accepts it and | TT> 5 | 5 |=20 | nhc tells me |=20 | Error when renaming:: | Illegal type in default at 4:17 |=20 | If I remove all the list and function stuff then hi says | TT> 5 | 5 |=20 | If I have a | main =3D putStrLn $ show 5 |=20 | then nhc gives me | TT> main | No default definition for class method fromInteger |=20 | and ghci gives me | Main> main | *** Exception: TT.lhs:8: No instance nor default method for class | operation PrelNum.fromInteger |=20 |=20 | It seems to me that hugs is in the right with it's handling=20 | of 5, but I am not sure who is wrong with default ([Foo]) or=20 | (Foo -> Int). |=20 |=20 | Finally, the context free grammar doesn't currently enforce=20 | the restriction that only one default declaration be given.=20 | Fixing it would make rather a mess, though. |=20 |=20 | Ian |=20 |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From ger@tzi.de Mon Dec 17 17:05:41 2001 From: ger@tzi.de (George Russell) Date: Mon, 17 Dec 2001 18:05:41 +0100 Subject: gcd 0 0 = 0 Message-ID: <3C1E25E5.81718477@tzi.de> I've reconsidered my earlier position and think now that the Prelude is wrong to make gcd 0 0 an error, and should return 0. It probably doesn't make much difference to anyone, but it's like 1 not being a prime; it may be slightly harder to explain, but it makes the maths come out nicer and is in the end a simplification. From herrmann@infosun.fmi.uni-passau.de Mon Dec 17 17:31:17 2001 From: herrmann@infosun.fmi.uni-passau.de (Ch. A. Herrmann) Date: Mon, 17 Dec 2001 18:31:17 +0100 Subject: gcd 0 0 = 0 In-Reply-To: <3C1E25E5.81718477@tzi.de> References: <3C1E25E5.81718477@tzi.de> Message-ID: <15390.11237.38564.819599@reger.fmi.uni-passau.de> >>>>> "George" == George Russell writes: George> I've reconsidered my earlier position and think now that the George> Prelude is wrong to make gcd 0 0 an error, and should return George> 0. It probably doesn't make much difference to anyone, but George> it's like 1 not being a prime; it may be slightly harder to George> explain, but it makes the maths come out nicer and is in the George> end a simplification. I'm strongly against making 1 a prime number. In contrast, 0*x=0, thus 0 "divides" 0 (somehow). But I have problems with "gcd being the greatest positive integer ..." - 0 is not positive, it is non-negative or natural - 2 also divides 0 and 2 is a "greater integer" than 0 (0 is the top element of the lattice formed by the division relation but that is not clear by the expression "greatest") Anyway, gcd 0 0 = error would be the simplest way to avoid confusion and catch accidental programming errors; e.g., using the gcd to divide something else. -- Christoph From igloo@earth.li Mon Dec 17 17:32:02 2001 From: igloo@earth.li (Ian Lynagh) Date: Mon, 17 Dec 2001 17:32:02 +0000 Subject: Confused about default In-Reply-To: <1113DDB24D4A2841951BFDF86665EE19066637@RED-MSG-10.redmond.corp.microsoft.com>; from simonpj@microsoft.com on Mon, Dec 17, 2001 at 08:57:28AM -0800 References: <1113DDB24D4A2841951BFDF86665EE19066637@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <20011217173202.A10045@stu163.keble.ox.ac.uk> On Mon, Dec 17, 2001 at 08:57:28AM -0800, Simon Peyton-Jones wrote: > Well, Foo *is* an instance of Num, so a correct Haskell impl > should pick that instance always. I was looking at what the implementations would allow, the module wasn't supposed to be useful. > Since you don't define the > fromInteger method in the instance decl, you get a runtime error. I expected this, I included it as in some cases I *didn't* et a runtime error though. > I don't know what you expect the [Foo] and Foo -> Int defaults > to do. Let me try to clarify what I was asking: What is a monotype? For example, is "[Foo]" a monotype and is "Foo -> Int" a monotype? The context free grammar implies that a monotype is identical to a type, in which case why is a different name used? The rest was to attempt to highlight some inconsistencies in the implementations. Thanks Ian From Alan@LCS.MIT.EDU Mon Dec 17 18:45:04 2001 From: Alan@LCS.MIT.EDU (Alan Bawden) Date: Mon, 17 Dec 2001 13:45:04 -0500 (EST) Subject: gcd 0 0 = 0 In-Reply-To: <20011217145021.3269.qmail@tyr.diku.dk> (message from Lars Henrik Mathiesen on 17 Dec 2001 14:50:21 -0000) References: <20011217145021.3269.qmail@tyr.diku.dk> Message-ID: <17Dec2001.133056.Alan@LCS.MIT.EDU> From: Lars Henrik Mathiesen Date: 17 Dec 2001 14:50:21 -0000 ... In case it isn't clear already, these definitions make a lattice on the positive integers, with divides ~ leq, gcd ~ meet and lcm ~ join, using the report's definitions of gcd and lcm. Indeed, that's a nice way of putting it. How about if the report just says: In order to make the non-negative integers into a lattice under `gcd' and `lcm', we define `gcd 0 0 = 0'. From foc@cs.indiana.edu Mon Dec 17 22:26:25 2001 From: foc@cs.indiana.edu (LICS) Date: Mon, 17 Dec 2001 17:26:25 -0500 (EST) Subject: faculty position in logic Message-ID: <200112172226.fBHMQHS08034@moose.cs.indiana.edu> [Sincere apologies for duplicates] Indiana University invites applications for a tenure-track assistant professor position in applied logic. Please see www.informatics.indiana.edu/positions/logic.html for details. Applications received within the next few weeks are likely to still get full consideration. Applicants are welcome to email to foc@cs.indiana.edu to notify of their mailed application, and to provide pointers to any pertinent on-line documentation. From foc@cs.indiana.edu Mon Dec 17 22:26:25 2001 From: foc@cs.indiana.edu (LICS) Date: Mon, 17 Dec 2001 17:26:25 -0500 (EST) Subject: faculty position in logic Message-ID: <200112172226.fBHMQPx08125@moose.cs.indiana.edu> [Sincere apologies for duplicates] Indiana University invites applications for a tenure-track assistant professor position in applied logic. Please see www.informatics.indiana.edu/positions/logic.html for details. Applications received within the next few weeks are likely to still get full consideration. Applicants are welcome to email to foc@cs.indiana.edu to notify of their mailed application, and to provide pointers to any pertinent on-line documentation. From dongen@cs.ucc.ie Tue Dec 18 09:22:25 2001 From: dongen@cs.ucc.ie (Marc van Dongen) Date: Tue, 18 Dec 2001 09:22:25 +0000 Subject: gcd 0 0 = 0 In-Reply-To: <15390.11237.38564.819599@reger.fmi.uni-passau.de>; from herrmann@infosun.fmi.uni-passau.de on Mon, Dec 17, 2001 at 06:31:17PM +0100 References: <3C1E25E5.81718477@tzi.de> <15390.11237.38564.819599@reger.fmi.uni-passau.de> Message-ID: <20011218092225.O27182@cs.ucc.ie> Ch. A. Herrmann (herrmann@infosun.fmi.uni-passau.de) wrote: : In contrast, 0*x=0, thus 0 "divides" 0 (somehow). : But I have problems with "gcd being the greatest positive integer ..." [snip] : - 0 is not positive, it is non-negative or natural : - 2 also divides 0 and 2 is a "greater integer" than 0 : (0 is the top element of the lattice formed by the division relation : but that is not clear by the expression "greatest") : gcd a b is the greatest non-negative integer dividing both a and b such that anything that divides both a and b also divides gcd a b (so gcd a b is the greatest thing that divides both a and b). Regards, Marc van Dongen -- Marc van Dongen | dongen@cs.ucc.ie | Computer Science Department | Western Road | () ASCII ribbon campaign University College Cork | Cork, Ireland | /\ against HTML mail phone: +353 (0)21 4903578 | fax: 4903113 | From juhp@01.246.ne.jp Tue Dec 18 09:32:11 2001 From: juhp@01.246.ne.jp (Jens-Ulrik Petersen) Date: 18 Dec 2001 18:32:11 +0900 Subject: ANNOUNCE: hsclock-0.01.0 release Message-ID: I am pleased to announce the initial release of hsclock, another gtk+hs "applet" I've written. hsclock is an accurate multi-zone gtk clock, which can also run in a tty. hsclock uses gtk timeouts to synchronise the time updates to occur on the second or minute "tick" (dependent on the clock format string), making display updates accurate to within milliseconds. More info, source and rpm's are available at: http://www.01.246.ne.jp/~juhp/haskell/hsclock/ As usual feedback and comments welcome. Enjoy, Jens From dongen@cs.ucc.ie Tue Dec 18 09:32:49 2001 From: dongen@cs.ucc.ie (Marc van Dongen) Date: Tue, 18 Dec 2001 09:32:49 +0000 Subject: gcd 0 0 = 0 In-Reply-To: <17Dec2001.133056.Alan@LCS.MIT.EDU>; from Alan@LCS.MIT.EDU on Mon, Dec 17, 2001 at 01:45:04PM -0500 References: <20011217145021.3269.qmail@tyr.diku.dk> <17Dec2001.133056.Alan@LCS.MIT.EDU> Message-ID: <20011218093249.P27182@cs.ucc.ie> Alan Bawden (Alan@LCS.MIT.EDU) wrote: : In case it isn't clear already, these definitions make a lattice on : the positive integers, with divides ~ leq, gcd ~ meet and lcm ~ join, : using the report's definitions of gcd and lcm. : : Indeed, that's a nice way of putting it. How about if the report just : says: : : In order to make the non-negative integers into a lattice under `gcd' : and `lcm', we define `gcd 0 0 = 0'. It would surely make things a lot less accessible to people (including me) who do not have any (or limited) knowledge about lattices. Why not make it more accessible and use the following rule (ore something similar)? The greates common divison (gcd) of two integers a and b is the unique non-negative integer g which has each of the following two properties: 1) g divides both a and b; and 2) if g' also divides both a and b then g' also divides g, Here an integer a divides an integer b if there is an integer c such that b = c*a. Note that if you regard an integer a to be greater than another integer b if b divides a then the gcd of two intgerers may also be regarded as the greatest common divisor of a and b. Regards, Marc van Dongen From simonpj@microsoft.com Tue Dec 18 09:38:21 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 18 Dec 2001 01:38:21 -0800 Subject: gcd 0 0 = 0 Message-ID: <1113DDB24D4A2841951BFDF86665EE19066640@RED-MSG-10.redmond.corp.microsoft.com> If everyone likes this I'll put it in; otherwise I'll simply state that gcd 0 0 is defined to be 0.=20 Christoph does not like this, but the weight of world opinion seems=20 to be fairly clearly in favour of gcd 0 0 =3D 0. Let's try to wrap = this one up. Simon | -----Original Message----- | From: Alan Bawden [mailto:Alan@LCS.MIT.EDU]=20 | Sent: 17 December 2001 18:45 | To: haskell@haskell.org; Simon Peyton-Jones | Subject: Re: gcd 0 0 =3D 0 |=20 |=20 | From: Lars Henrik Mathiesen | Date: 17 Dec 2001 14:50:21 -0000 | ... | In case it isn't clear already, these definitions make a lattice on | the positive integers, with divides ~ leq, gcd ~ meet and=20 | lcm ~ join, | using the report's definitions of gcd and lcm. |=20 | Indeed, that's a nice way of putting it. How about if the report just | says: |=20 | In order to make the non-negative integers into a lattice=20 | under `gcd' | and `lcm', we define `gcd 0 0 =3D 0'. |=20 From simonpj@microsoft.com Tue Dec 18 09:48:34 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 18 Dec 2001 01:48:34 -0800 Subject: Confused about default Message-ID: <1113DDB24D4A2841951BFDF86665EE19066643@RED-MSG-10.redmond.corp.microsoft.com> | Let me try to clarify what I was asking: |=20 | What is a monotype? For example, is "[Foo]" a monotype and is=20 | "Foo -> Int" a monotype? The context free grammar implies=20 | that a monotype is identical to a type, in which case why is=20 | a different name used? A monotype is a type with no for-alls in it. But you are right that it's confusing that this is the only occurrence. I think the simplest thing is to change 'monotype' to 'type' here; after all, Num (forall a.a->a)=20 does not hold! thanks for pointing this out. Simon From simonpj@microsoft.com Tue Dec 18 09:58:23 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 18 Dec 2001 01:58:23 -0800 Subject: Haskell 98 IO Message-ID: <1113DDB24D4A2841951BFDF86665EE19066646@RED-MSG-10.redmond.corp.microsoft.com> | Anyway, what should the report say? I think it is reasonable=20 | to expect that stdin & stdout should both be unbuffered in=20 | order for interact to work right. So the defn of interact should be |=20 | interact f =3D do | hSetBuffering stdin NoBuffering -- new | hSetBuffering stdout NoBuffering -- new | s <- hGetContents | putStr (f s) Simon Marlow raises a good point here. If 'interact' is to be interactive it had better be unbuffered. So I propose to add the two new lines above to the Report. This does not change the intended behaviour at all. Simon From gupta@herbrand.utdallas.edu Mon Dec 17 23:28:05 2001 From: gupta@herbrand.utdallas.edu (Dr. Gopal Gupta) Date: Mon, 17 Dec 2001 17:28:05 -0600 Subject: 4th Int'l Symp.: Practical Aspects of Declarative Languages Message-ID: <200112172328.fBHNS5u02536@herbrand.utdallas.edu> [ o Apologies for multiple messages. o Please register and make hotel reservations as soon as possible since both deadlines are approaching fast (Dec. 27th) ]. You are cordially invited to the Fourth International Symposium on Practical Aspects of Declarative Languages that will be held on Jan 19-20, 2002 right after ACM POPL. The program includes invited talks by three distinguished speakers: J. Strother Moore of the University of Texas at Austin, Catherine Meadows of the Naval Research Labs, and Veronica Dahl of Simon Fraser University. Very low registration rates ($150 regular and $100 student) and low conference hotel rates have been secured to make the event affordable. The program ends by late afternoon on Sunday to let attendees return home on Sunday itself. If you are attending ACM POPL, we especially encourage you to plan to attend PADL. More details can be found at: http://www.cs.sunysb.edu/~padl2002 --------------------------------------------------------------------- Fourth International Symposium on Practical Aspects of Declarative Languages (PADL '02) Portland, Oregon, USA Jan 19-20, 2002 Co-located with POPL 2002 --------------------------------------------------------------------- Conference Program ================== Jan 19th 8:45-9:00 Opening Remarks 9:00-10:00 Invited Talk #1 Using a Declarative Language to Build an Experimental Analysis Tool Catherine Meadows (Naval Research Laboratory), 10:00-10:30 Coffee Break 10:30-12:30 Session-I: Modeling Engineering Structures using Constrained Objects Bharat Jayaraman and Pallavi Tambay Compiler Construction in Higher Order Logic Programming Chuck Liang Declarative Programming with Application to Clinical Medicine: On the Use of Gisela in the MedView Project. Olof Torgersson Semantics-based Filtering: Logic Programming's Killer App? Gopal Gupta, Hai-Feng Guo, Arthur Karshmer, Enrico Pontelli, Desh Ranjan, B. Milligan, N. Datta, O. El Khatib, M. Noamany, and X. Zhou 12:30-1:30 Lunch 1:30-2:30 Invited Talk #2 How to Talk to Your Computer So That it Will Listen Veronica Dahl (Simon Fraser University), 2:45-4:15 Session-II: Linear Scan Register Allocation in a High-Performance Erlang Compiler Erik Johansson and Konstantinos Sagonas Typed Combinators for Generic Traversal Ralf Laemmel and Joost Visser Event-Driven FRP. Zhanyong Wan, Walid Taha, and Paul Hudak 4:15-4:30 Coffee Break 4:30-6:00 Session-III: Compiling Embedded Programs to Byte Code. Morten Rhiger, Exploiting Efficient Control and Data Structures in Logic Programs. Rong Yang and Steve Gregory, Memory Management and Scheduling in a Tabling Engine Luis F. Castro and Terrance Swift and David S. Warren -------------------------------------------------------------------------------- Jan 20th 9:00-10:00 Invited Talk #3: Single-Threaded Objects in ACL2. J. Strother Moore (University of Texas, Austin) 10:00-10:30 Coffee Break 10:30-12:30 Session-IV: Adding Apples and Oranges Martin Erwig and Margaret Burnett WASH/CGI: Server-side Web Scripting with Sessions and Typed, Compositional Forms. Peter Thiemann A better XML parser through functional programming. Oleg Kiselyov Functional Approach to Texture Generation. Jerzy Karczmarczuk 12:30-1:30 Lunch 1:30-3:30 Session-V: Abstract Interpretation over Non-Deterministic Finite Tree Automata for Set-Based Analysis of Logic Programs. John Gallagher, German Puebla, A High-Level Generic Interface to External Programming Languages for ECLiPSe. Kish Shen, Joachim Schimpf, Stefano Novello, Josh Singer, Segment Order Preserving and Generational Garbage Collection for Prolog. Ruben Vandeginste, Konstantinos Sagonas, and Bart Demoen, A Debugging Scheme for Declarative Equation Based Modeling Languages. Peter Bunus, Peter Fritzson From herrmann@infosun.fmi.uni-passau.de Tue Dec 18 11:16:11 2001 From: herrmann@infosun.fmi.uni-passau.de (Ch. A. Herrmann) Date: Tue, 18 Dec 2001 12:16:11 +0100 Subject: gcd 0 0 = 0 In-Reply-To: <1113DDB24D4A2841951BFDF86665EE19066640@RED-MSG-10.redmond.corp.microsoft.com> References: <1113DDB24D4A2841951BFDF86665EE19066640@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <15391.9595.758521.560553@reger.fmi.uni-passau.de> >>>>> "Simon" == Simon Peyton-Jones writes: Simon> Christoph does not like this It's OK if the definition is clear; it wasn't using the words "positive" or "greatest integer". Stating "gcd 0 0 = 0" explicitly is a good thing, even if it could be expressed verbatim; people may think about the mathematical background, but they should not need to think about the meaning of the definition. Anyway, I'm still against promoting 1 to a prime number :-) Cheers -- Christoph From frank@cc.gatech.edu Tue Dec 18 11:48:18 2001 From: frank@cc.gatech.edu (Frank Dellaert) Date: Tue, 18 Dec 2001 12:48:18 +0100 Subject: space efficiency question References: <1113DDB24D4A2841951BFDF86665EE19066623@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <000f01c187b9$e3216280$544a88d9@oemcomputer> This is a multi-part message in MIME format. ------=_NextPart_000_000C_01C187C2.4477ED80 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MessageThanks ! Now, a small follow-up question: if I subsequently test 2 Instances = whether they were instantiated with the same Attributes value, as in test (Instance a1 _) (Instance a2 _) =3D (a1=3D=3Da2) will this be implemented efficiently ? I.e. will it check first whether = the pointers happen to be the same, and only then do a full Eq = comparison ? Cheers Frank ----- Original Message -----=20 From: Simon Peyton-Jones=20 To: Frank Dellaert ; Haskell@haskell.org=20 Sent: Monday, December 17, 2001 10:24 AM Subject: RE: space efficiency question Now: if I have a couple of thousand of these Instances, created with = the same Attributes value, as in: =20 a =3D Attributes ["a","bc"] i0000 =3D Instance a [1,2] i0001 =3D Instance a [1,1] ... i7896 =3D Instance a [2,1] =20 can I be assured that there are not thousands of actual copies of a = but that they simply have a pointer to a ? I'm interested in the answer = for both ghc (compiled/interpreted) as interpreted Hugs.=20 Yes for GHC: you'll only get one copy of 'a'. =20 Simon =20 ------=_NextPart_000_000C_01C187C2.4477ED80 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Message
Thanks !
 
Now, a small follow-up question: if I = subsequently=20 test 2 Instances whether they were instantiated with the same Attributes = value,=20 as in
 
test (Instance a1 _) (Instance a2 _) = =3D=20 (a1=3D=3Da2)
 
will this be implemented efficiently ? = I.e. will it=20 check first whether the pointers happen to be the same, and only then do = a full=20 Eq comparison ?
 
Cheers
Frank
----- Original Message -----
From:=20 Simon=20 Peyton-Jones
To: Frank Dellaert ; Haskell@haskell.org
Sent: Monday, December 17, 2001 = 10:24=20 AM
Subject: RE: space efficiency=20 question

Now: if I have a couple of thousand = of these=20 Instances, created with the same Attributes value, as in:
 
a =3D Attributes = ["a","bc"]
i0000 =3D Instance a = [1,2]
i0001 =3D Instance a = [1,1]
...
i7896 =3D Instance a = [2,1]
 
can I be assured that there = are not=20 thousands of actual copies of a but that they simply have a pointer = to a ?=20 I'm interested in the answer for both ghc (compiled/interpreted) as=20 interpreted Hugs. 
Yes for GHC: you'll = only get one=20 copy of 'a'.
 
Simon
 
= ------=_NextPart_000_000C_01C187C2.4477ED80-- From voigt@orchid.inf.tu-dresden.de Tue Dec 18 13:22:19 2001 From: voigt@orchid.inf.tu-dresden.de (Janis Voigtlaender) Date: Tue, 18 Dec 2001 14:22:19 +0100 Subject: space efficiency question References: <1113DDB24D4A2841951BFDF86665EE19066623@RED-MSG-10.redmond.corp.microsoft.com> <000f01c187b9$e3216280$544a88d9@oemcomputer> Message-ID: <3C1F430B.D5B230AC@tcs.inf.tu-dresden.de> Frank Dellaert asks: > test (Instance a1 _) (Instance a2 _) = (a1==a2) > > will this be implemented efficiently ? I.e. will it check first whether the > pointers happen to be the same, and only then do a full Eq comparison ? No, otherwise you might also expect that the following test' function: test' :: String -> Bool test' s = (s==s) always returns True, without considering its actual argument s. But this is not the way of it, (==) evaluates the two strings to be compared as far as necessary for this comparison. For example: test' "abc" = True but: test' undefined = undefined If you really need something like pointer equality, you might want to consider the stable names of: @inproceedings{ jones99stretching, author = "Simon L. Peyton Jones and Simon Marlow and Conal Elliott", title = "Stretching the Storage Manager: Weak Pointers and Stable Names in Haskell", booktitle = "Implementation of Functional Languages", pages = "37-58", year = "1999", url = "citeseer.nj.nec.com/jones99stretching.html" } -- Janis Voigtlaender http://wwwtcs.inf.tu-dresden.de/~voigt/ mailto:voigt@tcs.inf.tu-dresden.de From thorinn@diku.dk Tue Dec 18 16:11:08 2001 From: thorinn@diku.dk (Lars Henrik Mathiesen) Date: 18 Dec 2001 16:11:08 -0000 Subject: gcd 0 0 = 0 In-Reply-To: <20011218093249.P27182@cs.ucc.ie> (message from Marc van Dongen on Tue, 18 Dec 2001 09:32:49 +0000) Message-ID: <20011218161108.5990.qmail@tyr.diku.dk> > From: Marc van Dongen > Date: Tue, 18 Dec 2001 09:32:49 +0000 > > Alan Bawden (Alan@LCS.MIT.EDU) wrote: > : Indeed, that's a nice way of putting it. How about if the report just > : says: > : > : In order to make the non-negative integers into a lattice under `gcd' > : and `lcm', we define `gcd 0 0 = 0'. > It would surely make things a lot less accessible to people > (including me) who do not have any (or limited) knowledge about > lattices. Why not make it more accessible and use the following rule > (ore something similar)? > The greates common divison (gcd) of two integers a and b is the unique > non-negative integer g which has each of the following two properties: > 1) g divides both a and b; and > 2) if g' also divides both a and b then g' also divides g, > Here an integer a divides an integer b if there is an integer c > such that b = c*a. This is exactly what you get if you plug the relation 'divides' on the non-negative integers into the definition of meet in a lattice. So this formulation is no more or less complex to use than the lattice one --- and people who do know about lattices will probably realize this pretty fast. It all depends on who you want to convince that gcd 0 0 should be 0, the mathematicians (by elegance) or the programmers (by concreteness). But since it seems that Simon is just going to put 'it is so' in the report, the point is moot. Lars Mathiesen (U of Copenhagen CS Dep) (Humour NOT marked) From wittner@uni-duesseldorf.de Tue Dec 18 16:43:33 2001 From: wittner@uni-duesseldorf.de (Toralf Wittner) Date: Tue, 18 Dec 2001 17:43:33 +0100 Subject: x^y Message-ID: <0GOJ006RUT6O12@neptun.rz.uni-duesseldorf.de> Hello, you can count me as a newbie in functional programming. I'm attempting to define a function that computes the value of x^y for whole numbers. Intuively (all efficiency considerations aside) I would start with something like this: power x y | x == 0 = 0 | y == 0 = 1 | y > 0 = x * power x (y-1) | y < 0 = 1 / fromInteger x * power x (y+1) One recognizes that the function returns either an integer value if y > 0 or a float value if y < 0. Therefore I can't write a signature like pow :: Integer -> Integer -> Integer nor can I do pow :: Integer -> Integer -> Double. If I would use Python I could write something like this: def power(m, n): if m == 0: return 0 if n == 0: return 1 if n > 0: return m * power(m, (n-1)) if n < 0: return (1 / float(m)) * power(m, (n+1)) How then would I write this function in Haskell (concerning types)? Thanks in advance! Kind regards, Toralf From dongen@cs.ucc.ie Tue Dec 18 17:02:36 2001 From: dongen@cs.ucc.ie (Marc van Dongen) Date: Tue, 18 Dec 2001 17:02:36 +0000 Subject: gcd 0 0 = 0 In-Reply-To: <20011218161108.5990.qmail@tyr.diku.dk>; from thorinn@diku.dk on Tue, Dec 18, 2001 at 04:11:08PM -0000 References: <20011218093249.P27182@cs.ucc.ie> <20011218161108.5990.qmail@tyr.diku.dk> Message-ID: <20011218170236.C4643@cs.ucc.ie> Lars Henrik Mathiesen (thorinn@diku.dk) wrote: : > Alan Bawden (Alan@LCS.MIT.EDU) wrote: : > : Indeed, that's a nice way of putting it. How about if the report just : > : says: : > : : > : In order to make the non-negative integers into a lattice under `gcd' : > : and `lcm', we define `gcd 0 0 = 0'. [snip] : This is exactly what you get if you plug the relation 'divides' on the : non-negative integers into the definition of meet in a lattice. So : this formulation is no more or less complex to use than the lattice : one --- and people who do know about lattices will probably realize : this pretty fast. I disagree. Alan is talking about adding things to the haskell report. That document should be accessible to as many people as possible. I have not yet met anybody who had lattice theory in primary and/or secondary school. On the other hand I *have* met quite a few of them who have a pretty good idea about what it means for one number to divide another. [snip] Regards, Marc van Dongen -- Marc van Dongen | dongen@cs.ucc.ie | Computer Science Department | Western Road | () ASCII ribbon campaign University College Cork | Cork, Ireland | /\ against HTML mail phone: +353 (0)21 4903578 | fax: 4903113 | From kentk@md.chalmers.se Tue Dec 18 17:00:30 2001 From: kentk@md.chalmers.se (Kent Karlsson) Date: Tue, 18 Dec 2001 18:00:30 +0100 Subject: gcd 0 0 = 0 In-Reply-To: <15391.9595.758521.560553@reger.fmi.uni-passau.de> Message-ID: <000701c187e5$80c7c1c0$b4e21081@chalmers95a69n> > >>>>> "Simon" == Simon Peyton-Jones writes: > > Simon> Christoph does not like this I still don't like this. 0 has never, and will never, divide anything, in particular not 0. 0 may be a prime factor of 0 (see also below!), but that is different. It is not the greatest (in the ordinary sense) divisor of 0. Indeed, +infinity is a much larger divisor of 0... I'm not in favour of using a very special-purpose order, not used for anything else, and that isn't even an order but a preorder, just to motivate gcd 0 0 = 0. Even if using this very special-purpose preorder, an infinity would be included in the 'top' equivalence class, and if we pick a representative value on the basis of which is 'greater' in the ordinary sense for integers augmented with infinities(!), then +infinity should be the representative value. Thus, in any case, gcd 0 0 = +infinity. This is easy enough for Integer, where +infinity and -infinity can easily be made representable (and should be made representable), but harder for a 'pure hardware' Int datatype. But in an ideal world, gcd 0 0 = +infinity with no error or exception. > It's OK if the definition is clear; it wasn't using > the words "positive" or "greatest integer". > > Stating "gcd 0 0 = 0" explicitly is a good thing, > even if it could be expressed verbatim; > people may think about the mathematical background, > but they should not need to think about the > meaning of the definition. > Anyway, I'm still against promoting 1 to a prime number :-) Why? If EVERY natural number is to have a prime factorisation, then BOTH 0 AND 1 have to be promoted to prime numbers; otherwise 1 and 0 cannot be prime factorised; in addition to that 1 is then a prime factor of any number (that can be excluded from the *minimal* list of prime factors except for 1)... There is no fundamental reason to except 1 from being a prime number. But there is a fundamental reason to say that 0 can never be a divisor (i.e. 0|0 is false; x|y is true iff x is a *non-zero* factor of y; the 'non-zero' part is often left implicit (e.g. one is only talking about strictly positive integers), which is part of the reason why we are having this discussion). If you want something similar to gcd, but that returns 0 for 0 and 0, then it is the 'product of all common prime factors'; where 1 has the (non-minimal) prime factorisation [1, 1, ...], 0 has the (non-minimal) prime factorisation [0, 1, 2, ...], and 1 is included at least once in the (non-minimal) prime factorisation of any natural number. If you want a parallel to the divides relation where 0 and 0 are related: 0 is a factor of 0. A prime number is a number that has no integer *between* 1 and itself as factors. People often say "except" instead of "between", but that does not work for 0, nor for the non-minimal prime factorisations that people seem to be interested in, given the interest in having gcd 0 0 = 0 (which isn't the gc*d*!). Again, the context is often strictly positive integers, and 'between' and 'except' are then equivalent. For no apparent reason 1 is usually also excepted, but that does not work for the prime factorisation of 1, nor for finding the product of all common prime factors of 1 and another natural number... For integers, -1 is also a prime number, and for imaginary integers, i is also a prime number... I'm sure somebody can give a nice definition of a partial order (not just preorder) lattice with 1 as the min value and 0 as the max value (just larger than the infinities), if you absolutely want a lattice with a gcd-*like* meet and lcm-*like* join for this (the, positive bias, factor-of order). I'd be happy to support such gcd-*like* (pcf?) and lcm-*like* functions, but they aren't the gcd, nor the lcm (e.g. pcf (-1) (-1) = -1, not 1, etc.). If you don't like adding these, then I suggest leaving things completely as they are. Squeezing in two operations into one just because they have the same results over the first quadrant is not something I find to be too good. Odd one out? /kent k From dpt@math.harvard.edu Tue Dec 18 18:12:14 2001 From: dpt@math.harvard.edu (Dylan Thurston) Date: Tue, 18 Dec 2001 13:12:14 -0500 Subject: gcd 0 0 = 0 In-Reply-To: <000701c187e5$80c7c1c0$b4e21081@chalmers95a69n>; from kentk@md.chalmers.se on Tue, Dec 18, 2001 at 06:00:30PM +0100 References: <15391.9595.758521.560553@reger.fmi.uni-passau.de> <000701c187e5$80c7c1c0$b4e21081@chalmers95a69n> Message-ID: <20011218131214.A18214@noether.math.harvard.edu> On Tue, Dec 18, 2001 at 06:00:30PM +0100, Kent Karlsson wrote: > Why? If EVERY natural number is to have a prime factorisation, then BOTH > 0 AND 1 have to be promoted to prime numbers; 1 has a perfectly fine prime factorization. It is the product of 0 primes, the null product. (A null product is defined, for very good reasons, to be 1, just like a null sum is defined to be 0.) I could see defences of calling 0 a prime, although it is not standard mathematical practice. The ideal generated by 0 is a prime ideal, for one thing. 0 would still not have a unique prime factorization, however. (But Haskell should not unilaterally decide to violate standard mathematical terminology!) > ... But > there is a fundamental reason to say that 0 can never be a divisor (i.e. 0|0 > is false; x|y is true iff x is a *non-zero* factor of y; the 'non-zero' part > is often left implicit (e.g. one is only talking about strictly positive > integers), which is part of the reason why we are having this discussion). What fundamental reason do you have in mind? Why do you use this definition of divisibility? (I'm curious; other mathematicians give the same definition, and I can't see why.) This thread made me curious, so I did a little library research. I was surprised to discover that mathematicians discover on this, the domain of definition of "gcd a b": Domain References ------ ---------- a /= 0, b /= 0 Lang, "Algebra, 3rd Edition" Hasse, "Number Theory" a, b not both 0 Koblitz, "A Course on Number Theory and Cryptography" all a, b allowed MacLane and Birkhoff, "Algebra, 2nd Edition" Koch, "Number Theory" At least the books by Lang and MacLane-Birkhoff are standard references. Note that the definitions all agree when they are defined (with gcd 0 0 = 0). As I said, I was surprised; to me, the definiton with all a and b is the more natural one. I still recommend using the full domain (especially since exceptions are awkward to deal with in Haskell), but I'm not as certain. Best, Dylan Thurston From ack@nethere.com Tue Dec 18 23:54:13 2001 From: ack@nethere.com (Michael Ackerman) Date: Tue, 18 Dec 2001 15:54:13 -0800 Subject: gcd 0 0 = 0 References: <15391.9595.758521.560553@reger.fmi.uni-passau.de> <000701c187e5$80c7c1c0$b4e21081@chalmers95a69n> <20011218131214.A18214@noether.math.harvard.edu> Message-ID: <3C1FD725.FFC84D92@nethere.com> The general meaning of `having a prime factorization' is that every non-zero element is uniquely a product of a unit and a product of primes. The algebraic structures where unique factorizations live are `unique factorization domains' (UFDs) of which a central class is formed by the ring of polynomials over a field. Here the non-zero elements of the field are the units; no one has ever suggested calling them primes! In a general UFD one can only speak of _a_ gcd of two elements x and y, meaning an element d such that one has (x, y) = (d), an equality of ideals. In some special cases, there is a natural choice for d (e.g., in the integers, the non-negative d; in the ring of polynomials over a field, the monic d (having leading coeff. 1)). In some UFDs there is no canonical choice (e.g. in the Gaussian integers, a + ib for a, b integers). gcd(0, 0) = 0. Cheers, Michael Ackerman Dylan Thurston wrote: > > On Tue, Dec 18, 2001 at 06:00:30PM +0100, Kent Karlsson wrote: > > Why? If EVERY natural number is to have a prime factorisation, then BOTH > > 0 AND 1 have to be promoted to prime numbers; > > 1 has a perfectly fine prime factorization. It is the product of 0 primes, > the null product. (A null product is defined, for very good reasons, to > be 1, just like a null sum is defined to be 0.) > > I could see defences of calling 0 a prime, although it is not standard > mathematical practice. The ideal generated by 0 is a prime ideal, > for one thing. 0 would still not have a unique prime factorization, > however. (But Haskell should not unilaterally decide to violate standard > mathematical terminology!) > > > ... But > > there is a fundamental reason to say that 0 can never be a divisor (i.e. 0|0 > > is false; x|y is true iff x is a *non-zero* factor of y; the 'non-zero' part > > is often left implicit (e.g. one is only talking about strictly positive > > integers), which is part of the reason why we are having this discussion). > > What fundamental reason do you have in mind? Why do you use this definition > of divisibility? (I'm curious; other mathematicians give the same > definition, and I can't see why.) > > This thread made me curious, so I did a little library research. I was > surprised to discover that mathematicians discover on this, the domain > of definition of "gcd a b": > > Domain References > ------ ---------- > a /= 0, b /= 0 Lang, "Algebra, 3rd Edition" > Hasse, "Number Theory" > > a, b not both 0 Koblitz, "A Course on Number Theory and Cryptography" > > all a, b allowed MacLane and Birkhoff, "Algebra, 2nd Edition" > Koch, "Number Theory" > > At least the books by Lang and MacLane-Birkhoff are standard references. > Note that the definitions all agree when they are defined (with gcd 0 0 = 0). > > As I said, I was surprised; to me, the definiton with all a and b is the > more natural one. I still recommend using the full domain (especially since > exceptions are awkward to deal with in Haskell), but I'm not as certain. > > Best, > Dylan Thurston > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell From Jan de Wit" <000701c187e5$80c7c1c0$b4e21081@chalmers95a69n> <20011218131214.A18214@noether.math.harvard.edu> <3C1FD725.FFC84D92@nethere.com> Message-ID: <003601c18822$2258e000$2fe5fea9@yatima> Why not define gcd a b as the largest (in 'normal' order) integer d such that the set of sums of multiples of a and b {na+mb | n <- Z, m <- Z} is equal to the set of multiples of d {nd | n <- Z}? Easy to understand, no talk of division, lattices, rings, ideals etcetera, and it covers the cases with 0. Cheers, Jan de Wit From ack@nethere.com Wed Dec 19 00:26:46 2001 From: ack@nethere.com (Michael Ackerman) Date: Tue, 18 Dec 2001 16:26:46 -0800 Subject: gcd oops Message-ID: <3C1FDEC6.54484152@nethere.com> Sorry for an error in my previous message. The definition there of a gcd works only in a prinicpal ideal domain (which covers all the rings mentioned in the examples). According to Bourbaki, chapter on ordered groups, the gcd of two non-zero elements of a UFD A is well-defined as an element of (A-{0})/units, a quotient monoid. So in this context gcd(0, _) is undefined. But Bourbaki adds that this concept is `sometimes' extended to the gcd of a finite family (x_i) of elements some of which may be zero by taking the gcd to be an element d such that for all z, z divides d iff z divides each x_i. Cheers, Michael Ackerman From ashley@semantic.org Wed Dec 19 06:24:24 2001 From: ashley@semantic.org (Ashley Yakeley) Date: Tue, 18 Dec 2001 22:24:24 -0800 Subject: ANN (bis): Release 0.1 of Haskell/Java VM Bridge Message-ID: <200112190624.WAA02738@mail4.halcyon.com> OK, the SourceForge file release system bug has been fixed, so I put the release files up there. Please download from there rather than from semantic.org. Revised, expanded announcement... ------- The first release, 0.1, of Haskell/Java VM Bridge is now available. Haskell/Java VM Bridge allows Haskell programs access to the Java Virtual Machine. Features include: * Calling of Java methods, access to fields, array-handling; * Integration of garbage collectors; * Reconciliation of exception models; * Reconciliation of thread models, including 'synchronized' monitor support and the ability to fork Haskell actions as Java threads; * Strong typing for Java classes and method argument lists (as tuples), and use of Haskell lists as arrays; * Creation of Java classes 'on the fly' (using DefineClass and the Java Class File Format) that can have Haskell callback methods; * Lifted monads which do all the necessary JNI class and method/field ID preloading and 'JNIEnv'-pointer variable handling for you -- these can be automatically generated via a tool (MakeJVMModule); * Layered design includes lower-level IO-based interface; * Automatic generation of modules for Java API classes; * All relevant imports, flags and libraries etc. handled by a single GHC package 'javavm'; * No 'unsafe' Haskell calls or pure function FFI anywhere. This release should be 'beta' quality, but has undergone little testing. You will need: * An x86 machine running some form of Unix; * GHC 5.02 or later; * The appropriate JVM, installed in the appropriate place: - IBM JDK/JRE 1.3 for x86, installed in /usr/lib/ibm-java/IBMJava2-13/ - Blackdown Port of Sun's JRE 1.3/Sun JDK 1.3 for x86, installed in /usr/lib/j2sdk1.3/ and /usr/lib/j2re1.3/ No documentation is currently available, sorry. Two examples have been included: a trivial "hello world" program, and a program that shows a Java Frame containing an instance of a Haskell-defined subclass of Canvas that has a Haskell 'paint' method that draws an oval. You should be able to figure out most of it from that... and of course the source is available from SourceForge CVS. Be sure to download the correct .tar.gz file for your Java VM. Simple installation instructions are included in the file. Haskell/JVM Bridge and source code is licensed under the GNU Lesser GPL. Future plans: * documentation * port to Cygwin * port to Darwin/OS X (waiting on GHC) * use of Java 1.4 API (waiting on Sun, though use of beta versions is possible) -- Ashley Yakeley, Seattle WA From mechvel@math.botik.ru Wed Dec 19 08:12:34 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Wed, 19 Dec 2001 11:12:34 +0300 Subject: x^y. Reply Message-ID: Toralf Wittner writes > [..] > power x y > [..] > | y > 0 = x * power x (y-1) > | y < 0 = 1 / fromInteger x * power x (y+1) > > One recognizes that the function returns either an integer value > if y > 0 or a float value if y < 0. Therefore I can't write a > signature like > pow :: Integer -> Integer -> Integer nor can I do > pow :: Integer -> Integer -> Double. > > [..] > How then would I write this function in Haskell (concerning types)? The type Rational fits the case n < 0 too, and it includes Integer. But if you still need Integer | Double, you can, for example, introduce a new type of a disjoint union of the above two, and then, to compute like this: pow (Intg 2) 2 --> Intg 4 pow (Intg 2) (-2) --> D 0.25 pow (D 2.0) (-2) --> D 0.25 This is achieved by data PowerDom = Intg Integer | D Double deriving(Eq,Show) pow :: PowerDom -> Integer -> PowerDom pow x n = p x n where p (Intg m) n = if n > 0 then Intg $ powerInteger m n else D $ powerDouble (fromInteger m :: Double) n p(D d) n = D $ powerDouble d n powerInteger m n = m^n :: Integer powerDouble :: Double -> Integer -> Double powerDouble d n = ... usual way for float - something like this. ----------------- Serge Mechveliani mechvel@botik.ru From till@doerges.net Wed Dec 19 09:13:45 2001 From: till@doerges.net (Till Doerges) Date: Wed, 19 Dec 2001 10:13:45 +0100 Subject: x^y In-Reply-To: <0GOJ006RUT6O12@neptun.rz.uni-duesseldorf.de>; from wittner@uni-duesseldorf.de on Tue, Dec 18, 2001 at 05:43:33PM +0100 References: <0GOJ006RUT6O12@neptun.rz.uni-duesseldorf.de> Message-ID: <20011219101345.B2662@atlan.wanderer.none> On Tue, Dec 18, 2001 at 05:43:33PM +0100, Toralf Wittner wrote: > power x y > | x == 0 = 0 > | y == 0 = 1 > | y > 0 = x * power x (y-1) > | y < 0 = 1 / fromInteger x * power x (y+1) Why did you put 'fromInteger' into the last line? If you get rid of that, this will make your 'power' be accepted by the haskell-compiler or -interpreter. > One recognizes that the function returns either an integer value if y > 0 or > a float value if y < 0. Therefore I can't write a signature like > pow :: Integer -> Integer -> Integer nor can I do > pow :: Integer -> Integer -> Double. No, you can't, and that's one of the reasons why type-classes where introduced. You don't have to state the type of x and y explicitely. Rather you can specify certain 'properties', i.e. y must be a number, there must be an ordering relation and x must allow for the representation of fractions. --- snip --- Main> :t power power :: (Num a, Ord a, Fractional b) => b -> a -> b Main> power 2 3 8.0 (113 reductions, 147 cells) Main> power 2 (-1) 0.5 (70 reductions, 87 cells) Main> --- snap --- > How then would I write this function in Haskell (concerning types)? See above (the type signature was kindly provided by hugs ;-). HTH -- Till -- e-mail: reverse(net dot doerges at till) | ENCRYPTED | pgp/gpg: keys via keyserver or my homepage | MAIL IS | www: http://www.doerges.net | WELCOME! | From GACOGNE Louis equipe Bernadette Bouchon-Meunier Wed Dec 19 09:33:39 2001 From: GACOGNE Louis equipe Bernadette Bouchon-Meunier (GACOGNE Louis equipe Bernadette Bouchon-Meunier) Date: Wed, 19 Dec 2001 10:33:39 +0100 (MET) Subject: random Message-ID: <200112190933.KAA05235@atlantide.muses> Is there a random function in Hugs 98 on macintosh. I found something about random in the library but I was not able to find a random function running. Louis Gacogne IIE-CNAM allee Jean Rostand 91025 Evry (tel 01 69 36 73 41) Laboratoire d'Informatique de l'Universite Paris VI Place Jussieu 75252 Paris 5 (tel 01 44 27 88 07) http://www.iie.cnam.fr/~gacogne/ From kentk@md.chalmers.se Wed Dec 19 13:04:25 2001 From: kentk@md.chalmers.se (Kent Karlsson) Date: Wed, 19 Dec 2001 14:04:25 +0100 Subject: gcd 0 0 = 0 In-Reply-To: <003601c18822$2258e000$2fe5fea9@yatima> Message-ID: <000001c1888d$b01113c0$b4e21081@chalmers95a69n> Let me try again: greatest -> maximum/supremum of a set of integers (plain everyday order) common -> intersection (plain everyday intersection of sets) divisor (of an integer value v) -> an integer value m, such that v/m is defined and, if so, is an integer factor (of an integer value v) -> an integer value m, such that there is an integer value n such that m*n=v So (mock Haskell syntax; set expression really): greatest_common_divisor a b = max (intersection {all divisors of a} {all divisors of b}) What is the supremum (result of max in the expression above) if a and b are both 0? (You're allowed to use values not prescribed by Haskell to exist. ;-) (You can replace "divisors" by "factors" in that expression and still get the same result.) I may agree that an operation *similar* to gcd, where <0,0> as argument returns 0 is useful (maybe even more useful than gcd!). But that operation is still not the gcd (and might even return other results thaN gcd also for other value pairs than <0,0>; in particlar negatives; depending on what is found most useful). If you want to replace gcd by some other, similar, operation, please go ahead. But call it something else, because it is something else. If you want to generalise that to polynomials or Gaussian integers (or at least imaginary integers, as opposed to complex integers), fine (though not for the current standard Haskell library). (Micheal, I am interested in the Guassian integer variety of this. If you like, you can expand on what you said in an off-list message, or give me a reference.) Kind (and somewhat fundamentalist) regards /kent k > -----Original Message----- > From: haskell-admin@haskell.org [mailto:haskell-admin@haskell.org]On > Behalf Of Jan de Wit > Sent: den 19 december 2001 01:15 > To: haskell@haskell.org > Subject: Re: gcd 0 0 = 0 > > > Why not define gcd a b as the largest (in 'normal' order) > integer d such > that the set of sums of > multiples of a and b {na+mb | n <- Z, m <- Z} is equal to the set of > multiples of d > {nd | n <- Z}? Easy to understand, no talk of division, > lattices, rings, > ideals etcetera, and it covers the cases with 0. > > Cheers, Jan de Wit > > > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell From mechvel@math.botik.ru Wed Dec 19 13:25:17 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Wed, 19 Dec 2001 16:25:17 +0300 Subject: FiniteMap for standard Message-ID: Long ago I suggested to include FiniteMap into Haskell-98 standard library. Is it still late to do this, or maybe, the situation has changed? ----------------- Serge Mechveliani mechvel@botik.ru From icalp2002@lcc.uma.es Wed Dec 19 13:39:55 2001 From: icalp2002@lcc.uma.es (icalp2002@lcc.uma.es) Date: Wed, 19 Dec 2001 14:39:55 +0100 Subject: ICALP2002 call for papers Message-ID: We apologize for possible multiple postings. In http://www.lcc.uma.es/icalp2002 you can find a pdf version of this call for paper. +++++++++++++++++++++++++++++++++++++ Last information: Second version of the WEB pages at http://www.lcc.uma.es/icalp2002 Workshops confirmed: Computability and Complexity in Analysis (CCA 2002) Algorithmic Methods and Models for Optimization of Railways ATMOS 2002 7 th International Workshop on Formal Methods for Industrial Critical Systems Foundations of Wide Area Network Computing Invited speakers confirmed: Heikki Mannila Manuel Hermenegildo +++++++++++++++++++++++++++++++++++++ Call for Papers ICALP 2002 29th International Colloquium on Automata, Languages and Programming July 8-13, 2002, Málaga, Spain Camera Ready: April 16, 2002 The 29th annual meeting of the European Association of Theoretical Computer Science will be held in Málaga, Spain, July 8-13, 2002 (at the E.T.S. Ingeniería Informática). As with the Journal Theoretical Computer Science (TCS), the scientific program of the Colloquium will be split into two parts: Track A of the meeting will correspond to Algorithms, Automata, Complexity and Games, while Track B to Logic, Semantics and Theory of Programming. SUBMISIONS: Authors are invited to submit extended abstract of their papers, presenting original contributions to the theory of computer science. Detailed instructions for paper submissions will be found on the conference webpage (http://www.lcc.uma.es/icalp2002) and in future calls for papers. Submissions should consist of: a cover page, with the author's full name, address, fax number, e-mail address, a 100-word abstract, keywords and to which track (A or B) the paper is being submitted and an extended abstract describing original research. At least one author of an accepted paper should be available to present it at the conference. Simultaneous submission to other conferences with published proceedings is not allowed. Further information (dates and instructions for submissions, workshops, registration, location and travel) will be provided in future announcements. ORGANIZING COMMITEE: Buenaventura Clares (University of Granada), Ricardo Conejo (University of Málaga), Inmaculada Fortes (University of Málaga), Llanos Mora (University of Málaga), Rafael Morales (co-Chair, University of Málaga), Marlon Nuñez (University of Málaga), José Luis Pérez de la Cruz (University of Málaga), Gonzalo Ramos (University of Málaga), Francisco Triguero (co-Chair, University of Málaga), José Luis Triviño (University of Málaga). IMPORTANT DATES: Workshops proposal: November 8, 2001 Submissions: January 14, 2002 Notification: March 20, 2002 CONFERENCE CO-CHAIRS Prof. Francisco Triguero Prof. Rafael Morales Universidad de Málaga E.T.S. Ingeniería Informática Dept. Lenguajes y Ciencias de la Computación Bulevar Louis Pasteur, 35 29071 - Málaga (SPAIN) e-mail: icalp2002@informatica.uma.es PROGRAM COMMITEE Track A Ricardo Baeza-Yates (U. Chile) Volker Diekert (U. Stuttgart) Paolo Ferragina (U. Pisa) Catherine Greenhill (U. Melbourne) Torben Hagerup (U. Frankfurt) Johan Håstad (KTH, Stockholm) Gabriel Istrate (Los Alamos) Claire Kenyon (U. Paris XI) Der-Tsai Lee (Acad. Sinica, Taipei) Heikki Mannila (Nokia, Helsinki) Elvira Mayordomo (U. Zaragoza) Helmut Prodinger (U. Witwatersrand, South Africa) Jan van Leeuwen(U. Utrecht) Paul Vitányi (CWI, Amsterdam) Peter Widmayer (ETH Zürich) (Chair) Gerhard Woeginger (T.U. Graz) Christos Zaroliagis (U. Patras) Track B Martín Abadi (Bell Labs Research, Lucent) Roberto Amadio (U. Provence) Gilles Barthe (INRIA-SophiaAntipolis) Manfred Droste (University of Technology Dresden) Cédric Fournet (Microsoft Cambridge) Matthew Hennessy (U. Sussex) (Chair) Furio Honsell (U. Udine) Peter O'Hearn (Queen Mary & W. C. London) Fernando Orejas (U.P.Catalunya) Ernesto Pimentel (U. Málaga) David Sands (Chalmers University of Technology and Göteborg University) Dave Schmidt (U. Kansas) Gheorghe Stefanescu (U. Bucharest) Vasco Vasconcelos (U. Lisbon) Thomas Wilke (U. Kiel) +++++++++++++++++++++++++++++++++++++++++++ Malaga University uses Christmas holidays for backup and maintenance of his network. If you have problem to arrive to ICALP 2002 main page, please retry again later. If you get to the page http://www.lcc.uma.es but not to the page http://www.lcc.uma.es/icalp2002 contact with us: conejo@lcc.uma.es morales@lcc.uma.es From simonpj@microsoft.com Wed Dec 19 13:43:46 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Wed, 19 Dec 2001 05:43:46 -0800 Subject: FiniteMap for standard Message-ID: <1113DDB24D4A2841951BFDF86665EE1906665C@RED-MSG-10.redmond.corp.microsoft.com> Much, much too late, however desirable. | -----Original Message----- | From: S.D.Mechveliani [mailto:mechvel@math.botik.ru]=20 | Sent: 19 December 2001 13:25 | To: haskell@haskell.org | Subject: FiniteMap for standard |=20 |=20 | Long ago I suggested to include FiniteMap into Haskell-98=20 | standard library. | Is it still late to do this, or maybe, the situation has changed?=20 |=20 | ----------------- | Serge Mechveliani | mechvel@botik.ru |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From wittner@uni-duesseldorf.de Wed Dec 19 14:11:06 2001 From: wittner@uni-duesseldorf.de (Toralf Wittner) Date: Wed, 19 Dec 2001 15:11:06 +0100 Subject: x^y. Reply In-Reply-To: References: Message-ID: <0GOL00IC6GSOOO@neptun.rz.uni-duesseldorf.de> On Wednesday, 19. December 2001 09:12, S.D.Mechveliani wrote: [...] > But if you still need Integer | Double, you can, for example, > introduce a new type of a disjoint union of the above two, and then, > to compute like this: > pow (Intg 2) 2 --> Intg 4 > pow (Intg 2) (-2) --> D 0.25 > pow (D 2.0) (-2) --> D 0.25 > This is achieved by > > data PowerDom = Intg Integer | D Double deriving(Eq,Show) > > pow :: PowerDom -> Integer -> PowerDom > pow x n = p x n > where > p (Intg m) n = if n > 0 then Intg $ powerInteger m n > else D $ powerDouble (fromInteger m :: Double) n > p(D d) n = D $ powerDouble d n > > powerInteger m n = m^n :: Integer > > powerDouble :: Double -> Integer -> Double > powerDouble d n = ... usual way for float > > - something like this. This seems to be what I want. I tried it this way: module Main where import System main = do [a1, a2] <- getArgs let x = read a1 let y = read a2 in putStrLn (show x ++ " ^ " ++ show y ++ " = " ++ show (pow x y)) data PowerNum = INT Integer | DBL Double deriving (Eq, Show, Read) pow :: PowerNum -> Integer -> PowerNum pow x y = z x y where z (INT x) y = if y > 0 then INT $ powInteger x y else DBL $ powDouble (fromInteger x) y z (DBL x) y = DBL $ powDouble x y powInteger x y | x == 0 = 0 | y == 0 = 1 | y > 0 = x * powInteger x (y - 1) powDouble x y | x == 0 = 0 | y == 0 = 1 | y > 0 = 1 / x * powDouble x (y - 1) While GHC compiled this code I get a runtime error: Fail: Prelude.read: no parse and HUGS reports: ERROR: Illegal Haskell 98 class constraint in inferred type *** Expression : pow 1 2 *** Type : Num PowerNum => PowerNum Could you tell me what I did wrong? Thank you very much! Toralf > > > ----------------- > Serge Mechveliani > mechvel@botik.ru From wittner@uni-duesseldorf.de Wed Dec 19 15:30:41 2001 From: wittner@uni-duesseldorf.de (Toralf Wittner) Date: Wed, 19 Dec 2001 16:30:41 +0100 Subject: x^y. Reply In-Reply-To: References: Message-ID: <0GOL005G2KHDMK@neptun.rz.uni-duesseldorf.de> Ahh - sorry, too much cut and paste ;-) data PowerNum = INT Integer | DBL Double deriving (Eq, Show, Read) pow :: PowerNum -> Integer -> PowerNum pow x y = z x y where z (INT x) y = if y > 0 then INT $ powInteger x y else if y == 0 then INT $ 1 else DBL $ powDouble (fromInteger x) y z (DBL x) y = DBL $ powDouble x y powInteger x y | x == 0 = 0 | y == 0 = 1 | y > 0 = x * powInteger x (y - 1) powDouble x y | x == 0 = 0 | y == 0 = 1 | y < 0 = 1 / x * powDouble x (y + 1) Now it basically works. However wouldn't it have been easier to write something like this: module Main where import System main = do [a1, a2] <- getArgs let x = read a1 let y = read a2 in if y >= 0 then putStrLn (show x ++ " ^ " ++ show y ++ " = " ++ show (powPos x y)) else putStrLn (show x ++ " ^ " ++ show y ++ " = " ++ show (powNeg x y)) powPos :: Integer -> Integer -> Integer powPos x y | x == 0 = 0 | y == 0 = 1 | y > 0 = x * powPos x (y - 1) powNeg :: Integer -> Integer -> Double powNeg x y | x == 0 = 0 | y == 0 = 1 | y < 0 = 1 / fromInteger x * powNeg x (y + 1) Initially I wanted something as terse as the Python version, now I either have to write two functions or I need to define a type. Is there not an easier way to come as close as possible to the Python version? Thanks anyway - learnt a lot! Toralf From hdaume@ISI.EDU Thu Dec 20 00:18:35 2001 From: hdaume@ISI.EDU (Hal Daume III) Date: Wed, 19 Dec 2001 16:18:35 -0800 (PST) Subject: global counters Message-ID: Please, no tirade about banishing unsafePerformIO. I've seen this done before I just don't remember how. I want to use a state monad to count things, but don't want to monadify the thing I'm using the counter in. basically, i want a function getVar :: () -> String which returns a new string every time. i tried this: > curVarId = newSTRef (0 :: Integer) > > {-# NO-INLINE newVar -} > > newVar = \_ -> ('\0' : show x) > where y = unsafePerformIO (stToIO curVarId) > x = unsafePerformIO $ stToIO $ > do x <- readSTRef y > writeSTRef y (x + 1) > return x and in ghci it works wonderfully, but when i actually compile, all i get is "\NUL0". what's the proper way to write this? thanks - hal From mechvel@math.botik.ru Thu Dec 20 08:00:17 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Thu, 20 Dec 2001 11:00:17 +0300 Subject: x^y. Reply Message-ID: Toralf Wittner writes > [..] > data PowerNum = INT Integer | DBL Double deriving (Eq, Show, Read) > [..] > Now it basically works. However wouldn't it have been easier to write > something like this: > > powPos :: Integer -> Integer -> Integer > [..] > powNeg :: Integer -> Integer -> Double > [..] > | y < 0 = 1 / fromInteger x * powNeg x (y + 1) > > Initially I wanted something as terse as the Python version, now I either > have to write two functions or I need to define a type. Is there not an > easier way to come as close as possible to the Python version? > > Thanks anyway - learnt a lot! For this particular task, the most natural solution is, probably, pow :: Fractional a => a -> Integer -> a pow a n = if n > 0 then a^n else (1/a)^(- n) (^) is of standard, only pow adds the facility of negative n. Then, you need each time to convert the argument to appropriate type of Fractional: pow (fromInteger 2 :: Ratio.Rational) 2 --> 4 % 1 pow (fromInteger 2 :: Ratio.Rational) (-2) --> 1 % 4 pow (2 :: Double) (-2) --> 0.25 pow (2 :: Integer) (-2) --> ... No instance for (Fractional Integer) If you replace standard (and not lucky) Fractional with some class Foo (with multiplication mul and division div), make Integer an instance of Foo (where div may fail for some data), and program pow :: Foo a => a -> Integer -> a via mul, div, then it would work like this: pow (2 :: Integer) 2 --> 4 pow (2 :: Integer) (-2) --> "Error: cannot invert 2 :: Integer" pow (2 :: Rational) (-2) --> 1%4 Another way is to try to straggle with overlapping instances by defining something like this: class Pow a b where pow :: a -> Integer -> b instance Num a => Pow a a where pow = (^) Fractional ? instance Num a => Pow Integer a where pow = ? If this succeeds, there will be also no need in new type constructors. ----------------- Serge Mechveliani mechvel@botik.ru From Jan de Wit" Message-ID: <001401c18936$92ba3280$2fe5fea9@yatima> > basically, i want a function getVar :: () -> String which returns a new > string every time. i tried this: > > > curVarId = newSTRef (0 :: Integer) > > > > {-# NO-INLINE newVar -} > > > > newVar = \_ -> ('\0' : show x) > > where y = unsafePerformIO (stToIO curVarId) > > x = unsafePerformIO $ stToIO $ > > do x <- readSTRef y > > writeSTRef y (x + 1) > > return x > > and in ghci it works wonderfully, but when i actually compile, all i get > is "\NUL0". > > what's the proper way to write this? I think (haven't tested this one) you should write (modulo layout): | curVarIdRef :: IORef Integer | curVarIdRef = unsafePerformIO $ newIORef (0 :: Integer) | | {-# NO-INLINE newVar -} | | newVar :: () -> String | newVar = \_ -> ('\0' : show x) where | x = unsafePerformIO $ | do x <- readIORef curVarIdRef | writeIORef curVarIdRef (x + 1) | return x Because in your original version, curVarId allocates a new reference to 0 every time newVar is called. Hope this works, Jan de Wit From johanj@cs.uu.nl Thu Dec 20 08:07:27 2001 From: johanj@cs.uu.nl (Johan Jeuring) Date: Thu, 20 Dec 2001 09:07:27 +0100 Subject: Working Conference on Generic Programming, 2nd call for papers Message-ID: <20011220080952.E517D4538@mail.cs.uu.nl> WCGP '02 IFIP WG2.1 Working Conference on GENERIC PROGRAMMING http://www.generic-programming.nl/wcgp/cfp.html Organised in conjunction with MPC'02 July 8 - July 13, 2002 Dagstuhl, Germany CALL FOR PAPERS Generic programming is about making programs more adaptable by making them more general. Generic programs often embody non-traditional kinds of polymorphism; ordinary programs are obtained from them by suitably instantiating their parameters. In contrast with normal programs, the parameters of a generic programs are often quite rich in structure. For example they may be other programs, types or type constructors, class hierarchies, or even programming paradigms. Generic programming techniques have always been of interest, both to practitioners and to theoreticians, but only recently have generic programming techniques become a specific focus of research in the functional and object-oriented programming language communities. This working conference will bring together leading researchers in generic programming from around the world, and feature papers capturing the state of the art in this important emerging area. We welcome contributions on all aspects, theoretical as well as practical, of generic programming, aspect-oriented programming, polytypic programming, adaptive object-oriented programming, generic components, and so on. SUBMISSION Full papers should be submitted in Postscript or pdf format by e-mail to reach Jeremy.Gibbons@comlab.ox.ac.uk by February 16, 2002. The details of the submission procedure can be found at http://www.generic-programming.nl/wcgp/submit.html Although there is no page limit, submissions should strive for brevity and clarity. IMPORTANT DATES Submission February 16, 2002 Notification April 12, 2002 Final version due May 24, 2002 PROGRAMME COMMITTEE Matt Austern Eerke Boiten Ulrich Eisenecker Jeremy Gibbons (co-chair) Ralf Hinze Johan Jeuring (co-chair) Gary Leavens Karl Lieberherr Lambert Meertens Eugenio Moggi Bernhard Moeller Oege de Moor David Musser Martin Odersky Ross Paterson Simon Peyton Jones Colin Runciman Doaitse Swierstra Stephanie Weirich LOCAL ORGANISATION Jeremy Gibbons Johan Jeuring Bernhard Moeller CORRESPONDENCE Jeremy Gibbons (Jeremy.Gibbons@comlab.ox.ac.uk) Johan Jeuring (johan@jeuring.net) From bernhard@cogs.susx.ac.uk Thu Dec 20 15:05:56 2001 From: bernhard@cogs.susx.ac.uk (Bernhard Reus) Date: Thu, 20 Dec 2001 15:05:56 +0000 Subject: installation problems with graphics-2.0.4 Message-ID: <3C21FE54.2EBCC4B7@cogs.susx.ac.uk> The graphics lib of the new December release does not compile with the shipped makefile. The makefile does not do anything at all??? Maybe there is a problem with wildcard extensions? To be honest, I have no clue. I am using a Sparc5/Solaris machine. Any help appreciated. Thanks in advance, Bernhard From igloo@earth.li Thu Dec 20 21:49:03 2001 From: igloo@earth.li (Ian Lynagh) Date: Thu, 20 Dec 2001 21:49:03 +0000 Subject: unsafePerformIO to give warnings Message-ID: <20011220214903.A2358@stu163.keble.ox.ac.uk> Hi all If I want to give warnings when doing something and I don't care too much about the order they appear in, can I use this? foo x = if success x then Just x else warn "Working out x went wrong" Nothing warn :: String -> a -> a warn s x = unsafePerformIO (hPutStrLn stderr s) `seq` x The hslibs docs say If the I/O computation wrapped in unsafePerformIO performs side effects, then the relative order in which those side effects take place (relative to the main I/O trunk, or other calls to unsafePerformIO) is indeterminate. but it's not entirely clear on whether or not I could end up with 2 warnings interspersed? And is it guaranteed that the warnings will be printed at some point? hugs and ghci only seem to print the first warning, but ISTR similar problems happen with threads and got the impression that they were in the wrong. Thanks Ian From simonpj@microsoft.com Fri Dec 21 09:35:37 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 21 Dec 2001 01:35:37 -0800 Subject: "The signature contexts in a mutually recursive group should all be identical"; why? Message-ID: <1113DDB24D4A2841951BFDF86665EE19374689@RED-MSG-10.redmond.corp.microsoft.com> [Note to the Haskell list. The question this thread is discussing is whether the H98 rule that all the functions in a mutually=20 recursive group must have the same context, is a show stopper.] | Oeer. Come to think of it, if f is getting the dictionary=20 | (in the real world | example) from the context, rather than from the existential=20 | type, I fear it may be getting the wrong dictionary, and will=20 | crash badly when I try to run the code. =20 No I don't think that can happen. But I have thought of a test case data T =3D forall a. Eq a =3D> MkT a a T | Nil f :: T -> Bool f Nil =3D True f (MkT x y t) =3D g x y t g :: Eq b =3D> b -> b -> T -> Bool g x y t =3D (x=3D=3Dy) && f t Notice that (a) f and g are mutually recursive (b) They have different contexts in their type sig (c) If they were made the same, f would get an ambiguous type f :: Eq a =3D> T -> Bool (d) Haskell's polymorphic recursion is essential here; each call to g may be at a different type So it looks to me that, in the presence of existentials, the H98 rule goes from being moot to being throughly awkward.=20 Mark's THIH paper shows that there's no real need for the rule, because one can type-check the bindings without type sigs as a group, and then the ones with type sigs one by one. =20 But what happens for pattern-bindings that bind more than one variable. Must all those variables have the same context? (I hope so.) Needless to say, I'm not proposing any changes in H98! But I thought the example would be of interest. Maybe it's well known, but it wasn't to me. Simon From sk@cs.brown.edu Fri Dec 21 06:36:16 2001 From: sk@cs.brown.edu (Shriram Krishnamurthi) Date: Fri, 21 Dec 2001 01:36:16 -0500 (EST) Subject: ICFP (Functional Programming) 2002: Call for Papers Message-ID: <200112210636.BAA10106@bosch.cs.brown.edu> --------------------------------------------- * Calling all functional programmers! * * ICFP'02 needs you! * --------------------------------------------- ICFP 2002: International Conference on Functional Programming Pittsburgh, 3--5 October 2002 CALL FOR PAPERS http://icfp2002.cs.brown.edu/ Paper submission deadline: 21 March 2002 General Chair: Mitchell Wand, Northeastern University Program Chair: Simon Peyton Jones, Microsoft Research ICFP 2002 seeks original papers on the full spectrum of the art, science, and practice of functional programming. The conference invites submissions on all topics ranging from principles to practice, from foundations to features, and from abstraction to application. The scope covers all languages that encourage programming with functions, including both purely applicative and imperative languages, as well as languages that support objects and concurrency. You can find the full call for papers at http://icfp2002.cs.brown.edu/ Program Committee Matthias Blume (Lucent) Margaret Burnett (Oregon State University) Manuel Chakravarty (University of New South Wales) Matthew Flatt (University of Utah) Haruo Hosoya (Kyoto University) Uwe Nestmann (EPFL, Lausanne) Chris Okasaki (United States Military Academy) Norman Ramsey (Harvard University) David Sands (Chalmers University) Olin Shivers (Georgia Tech) Stephanie Weirich (Cornell) Joe Wells (Heriot Watt University) From simonmar@microsoft.com Fri Dec 21 10:21:06 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Fri, 21 Dec 2001 10:21:06 -0000 Subject: unsafePerformIO to give warnings Message-ID: <9584A4A864BD8548932F2F88EB30D1C607C0BAA4@TVP-MSG-01.europe.corp.microsoft.com> > If I want to give warnings when doing something and I don't care too > much about the order they appear in, can I use this? >=20 > foo x =3D if success x then Just x > else warn "Working out x went wrong" Nothing >=20 > warn :: String -> a -> a > warn s x =3D unsafePerformIO (hPutStrLn stderr s) `seq` x This is what IOExts.trace is for, BTW. > The hslibs docs say >=20 > If the I/O computation wrapped in unsafePerformIO performs side > effects, then the relative order in which those side effects take > place (relative to the main I/O trunk, or other calls to > unsafePerformIO) is indeterminate. >=20 > but it's not entirely clear on whether or not I could end up with 2 > warnings interspersed? It is possible to get warnings interspersed if you write something like warn ("abc" ++ warn "foo" "def") > And is it guaranteed that the warnings will be printed at some point? All that is guaranteed is that if an expression 'warn a b' is evaluated then 'a' will be evaluated to a String and then printed. > hugs and ghci only seem to print the first warning, but ISTR similar > problems happen with threads and got the impression that they were in > the wrong. Are you sure that laziness and/or optimisation aren't to blame for only getting a single warning? Given that you say Hugs also produces the same result, it sounds like a laziness issue. Cheers, Simon From chak@cse.unsw.edu.au Fri Dec 21 10:17:54 2001 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Fri, 21 Dec 2001 21:17:54 +1100 Subject: 2002 Haskell Workshop Message-ID: <20011221211754E.chak@cse.unsw.edu.au> [My apologies if you receive multiple copies of this message] ------------------------------ PROVISIONAL CALL FOR PAPERS (Approval for PLI'02 pending) ------------------------------ 2002 Haskell Workshop Pittsburgh, PA, USA (3rd, 7th, or 8th October 2002; exact date to be announced) ================================== The purpose of the Haskell Workshop is to discuss experience with Haskell, and possible future developments for the language. The scope of the workshop includes all aspects of the design, semantics, theory, application, implementation, and teaching of Haskell. Previous Haskell Workshops have been held in La Jolla (1995), Amsterdam (1997), Paris (1999), Montreal (2000), and Firenze (2001). For detailed information and key dates please consult http://www.cse.unsw.edu.au/~chak/hw2002/ From simonpj@microsoft.com Fri Dec 21 11:09:42 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 21 Dec 2001 03:09:42 -0800 Subject: Haskell 98 Christmas release Message-ID: <1113DDB24D4A2841951BFDF86665EE1937468E@RED-MSG-10.redmond.corp.microsoft.com> In my Sisyphian task of finishing the Haskell 98 Report, I thought I would put out the current version before Xmas. =20 http://research.microsoft.com/~simonpj/haskell98-revised It's substantially the same as the one I put out at the start=20 of December, with three exceptions 1. The layout algorithm has changed (again). Simon M, Ian L and I are now all fairly confident that it is right, but we have been proved wrong before. 2. The "instance declaration wart" turned out to be closely connnected to some (unspecified) scoping issues in export lists. So I have=20 nailed all that down. GHC and Hugs both now implement the new rules. 3. The avalance of email about the True Meaning of gcd 0 0 cannot=20 have escaped your notice. I am too stupid to understand most of it, but my ill-informed conclusion is: a) there is a lot of support for gcd 0 0 =3D 0 b) but it is not universal support The strong default for H98 is "no change", so I've left gcd 0 0 as an error. However I have added some examples. Changes since the early-dec release are marked [Late Dec 2001] in the Bugs List, so you can find them easily. I don't think I know of any other loose ends. Happy reading. Simon From ross@soi.city.ac.uk Fri Dec 21 11:14:12 2001 From: ross@soi.city.ac.uk (Ross Paterson) Date: Fri, 21 Dec 2001 11:14:12 +0000 Subject: "The signature contexts in a mutually recursive group should all be identical"; why? In-Reply-To: <1113DDB24D4A2841951BFDF86665EE19374689@RED-MSG-10.redmond.corp.microsoft.com> References: <1113DDB24D4A2841951BFDF86665EE19374689@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <20011221111411.GA1143@soi.city.ac.uk> On Fri, Dec 21, 2001 at 01:35:37AM -0800, Simon Peyton-Jones wrote: > [Note to the Haskell list. The question this thread is discussing > is whether the H98 rule that all the functions in a mutually > recursive group must have the same context, is a show stopper.] > > [...] > > So it looks to me that, in the presence of existentials, the H98 > rule goes from being moot to being throughly awkward. It's not moot -- it steers the following (admittedly artificial) example into the monomorphism restriction: foo :: Eq a => a -> Bool foo x = x == x && bar -- bar :: Bool bar = foo 'a' With the declaration, it fails the "identical context" rule (though Hugs then accepts it in violation of H98). The definition of "declaration group" could have been relaxed when explicit type signatures were added: if a variable has one, then bindings using the variable should depend on the type signature, not the binding of the variable, so in the above example would be analysed as three declaration groups: (1) foo :: Eq a => a -> Bool (2) bar = foo 'a' -- depends on (1) (3) foo x = x == x && bar -- depends on (2) As it is, some extra language was tacked on to exempt variables with explicit signatures from the mutual type inference, as well as to impose this restriction. H98 glitch: the phrase "declaration group" is used in 4.4.2 with a different meaning to that defined in 4.5.1. "sequence of declarations"? From igloo@earth.li Fri Dec 21 12:25:31 2001 From: igloo@earth.li (Ian Lynagh) Date: Fri, 21 Dec 2001 12:25:31 +0000 Subject: unsafePerformIO to give warnings In-Reply-To: <9584A4A864BD8548932F2F88EB30D1C607C0BAA4@TVP-MSG-01.europe.corp.microsoft.com>; from simonmar@microsoft.com on Fri, Dec 21, 2001 at 10:21:06AM -0000 References: <9584A4A864BD8548932F2F88EB30D1C607C0BAA4@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: <20011221122531.A6180@stu163.keble.ox.ac.uk> On Fri, Dec 21, 2001 at 10:21:06AM -0000, Simon Marlow wrote: > > > If I want to give warnings when doing something and I don't care too > > much about the order they appear in, can I use this? > > > > foo x = if success x then Just x > > else warn "Working out x went wrong" Nothing > > > > warn :: String -> a -> a > > warn s x = unsafePerformIO (hPutStrLn stderr s) `seq` x > > This is what IOExts.trace is for, BTW. Doh - I associate that with debugging and it never even occurred to me! > > warnings interspersed? > > It is possible to get warnings interspersed if you write something like > > warn ("abc" ++ warn "foo" "def") Ah, yes, OK, thanks. > > hugs and ghci only seem to print the first warning, but ISTR similar > > problems happen with threads and got the impression that they were in > > the wrong. > > Are you sure that laziness and/or optimisation aren't to blame for only > getting a single warning? Given that you say Hugs also produces the > same result, it sounds like a laziness issue. Sorry, I meant "hugs and ghci only seem to print the warning the first time I run the program", e.g. with module Main where import IOExts main :: IO() main = trace "foo" (putStrLn "bar") in hugs: [...] Type :? for help Main> main foobar Main> main bar Main> main bar Main> main bar and in ghci: Skipping Main ( q.lhs, ./q.o ) Main> main foo bar Main> main bar Main> main bar Main> main bar Main> Thanks again Ian From simonmar@microsoft.com Fri Dec 21 12:29:05 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Fri, 21 Dec 2001 12:29:05 -0000 Subject: unsafePerformIO to give warnings Message-ID: <9584A4A864BD8548932F2F88EB30D1C607C0BB2B@TVP-MSG-01.europe.corp.microsoft.com> Ian Lynagh writes: > Sorry, I meant "hugs and ghci only seem to print the warning the first > time I run the program", e.g. with >=20 > module Main where >=20 > import IOExts >=20 > main :: IO() > main =3D trace "foo" (putStrLn "bar") >=20 > in hugs: >=20 > [...] > Type :? for help > Main> main > foobar >=20 > Main> main > bar [snip] > and in ghci: >=20 > Skipping Main ( q.lhs, ./q.o ) > Main> main > foo > bar > Main> main > bar [snip] This is because 'main' is a CAF: the act of reducing it to normal form the first time forces the warning to be printed, but thereafter the evaluated version is returned immediately. To subvert this behaviour, in GHCi you can say ':set +r' which causes all CAFs to be reverted between evaluations. Cheers, Simon From Malcolm.Wallace@cs.york.ac.uk Fri Dec 21 13:23:00 2001 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Fri, 21 Dec 2001 13:23:00 +0000 Subject: ICFP (Functional Programming) 2002: Call for Papers In-Reply-To: <200112210636.BAA10106@bosch.cs.brown.edu> Message-ID: > ICFP 2002: International Conference on Functional Programming > Pittsburgh, 3--5 October 2002 The email announcement says 3-5 Oct, the webpage says 4-6 Oct. Which are the true dates for ICFP? Regards, Malcolm From simonpj@microsoft.com Fri Dec 21 13:57:42 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 21 Dec 2001 05:57:42 -0800 Subject: ICFP (Functional Programming) 2002: Call for Papers Message-ID: <1113DDB24D4A2841951BFDF86665EE19374690@RED-MSG-10.redmond.corp.microsoft.com> It's definitely 4-6 Oct. I'm sorry about the confusion. Simon | -----Original Message----- | From: Malcolm Wallace [mailto:Malcolm.Wallace@cs.york.ac.uk]=20 | Sent: 21 December 2001 13:23 | To: haskell@haskell.org | Subject: Re: ICFP (Functional Programming) 2002: Call for Papers |=20 |=20 | > ICFP 2002: International Conference on Functional Programming | > Pittsburgh, 3--5 October 2002 |=20 | The email announcement says 3-5 Oct, the webpage says 4-6=20 | Oct. Which are the true dates for ICFP? |=20 | Regards, | Malcolm From rjmh@cs.chalmers.se Fri Dec 21 16:04:05 2001 From: rjmh@cs.chalmers.se (John Hughes) Date: Fri, 21 Dec 2001 17:04:05 +0100 (MET) Subject: New extension in GHC: newtype deriving clause Message-ID: <200112211604.RAA01425@hotlips.cs.chalmers.se> Simon PJ and I have come up with an extension to newtype deriving clauses which is intended to make it easier to make types abstract. Suppose you are about to write a type definition. You face a choice between defining it as a type synonym, and making it a new, potentially abstract type. Often a newtype may be the "right" choice, but that may require substantial extra work. Specifically, if the representation type already has a number of useful class instances, which you also want on the newtype, then a type synonym gives you them for free -- but a newtype definition forces you to write an instance declaration for each instance you want. These instance declarations are boring to write: they just strip off and put back the newtype constructor here and there, and call the representation instance. Especially galling is that in the implementation, the newtype constructor doesn't even appear -- so all your work is "for nothing", the dictionary for the representation type would actually work perfectly well for the new type also. The work of defining these instances may be enough to put you off making the new type abstract. The new extension allows you to derive these instances, just by adding the classes to the deriving clause of the newtype declaration. It's implemented in GHC already and will be part of the next release. I've appended the manual entry describing the extension to this message: that contains examples and a careful definition of when an instance can be derived. I'll just remark that you can also use this extension to emulate Hugs' restricted type synonyms. Suppose you want to implement an abstract type of sets as lists, and define the set operations without needing to constantly add and remove a newtype constructor. You can do so as follows: 1. Define a class containing the operations inside the abstraction barrier. This corresponds to giving the type signatures of these functions in the Hugs construct. class SetLike s where empty :: s a single :: a -> s a union :: s a -> s a -> s a member :: Eq a => a -> s a -> Bool (This isn't supposed to be a general Collection class: we're just defining the types of function on sets-as-lists), 2. Define an instance for the representation type. Of course, there's no need to mess with any newtype constructor here. instance SetLike [] where empty = [] single x = [x] union = (++) member = elem 3. Define a new Set type, and derive a class instance for it. newtype Set a = Set [a] deriving SetLike That's it. Of course, the Set operations are now overloaded, which has its own penalties, but nevertheless we managed to define operations on an abstract type without explicitly worrying about the constructor. Here's the manual entry: Extended deriving clause for newtype ==================================== When you define an abstract type using newtype, you may want the new type to inherit some instances from its representation. In Haskell 98, you can inherit instances of Eq, Ord, Enum and Bounded by deriving them, but for any other classes you have to write an explicit instance declaration. For example, if you define newtype Dollars = Dollars Int and you want to use arithmetic on Dollars, you have to explicitly define an instance of Num: instance Num Dollars where Dollars a + Dollars b = Dollars (a+b) ... All the instance does is apply and remove the newtype constructor. It is particularly galling that, since the constructor doesn't appear at run-time, this instance declaration defines a dictionary which is wholly equivalent to the Int dictionary, only slower! GHC permits such instances to be derived instead, so one can write newtype Dollars = Dollars Int deriving (Eq,Show,Num) and the implementation uses the same Num dictionary for Dollars as for Int. Notionally, the compiler derives an instance declaration of the form instance Num Int => Num Dollars which just adds or removes the newtype constructor according to the type. We can also derive instances of constructor classes in a similar way. For example, suppose we have implemented state and failure monad transformers, such that instance Monad m => Monad (State s m) instance Monad m => Monad (Failure m) In Haskell 98, we can define a parsing monad by type Parser tok m a = State [tok] (Failure m) a which is automatically a monad thanks to the instance declarations above. With the extension, we can make the parser type abstract, without needing to write an instance of class Monad, via newtype Parser tok m a = Parser (State [tok] (Failure m) a) deriving Monad In this case the derived instance declaration is of the form instance Monad (State [tok] (Failure m)) => Monad (Parser tok m) Notice that, since Monad is a constructor class, the instance is a partial application of the new type, not the entire left hand side. We can imagine that the type declaration is ``eta-converted'' to generate the context of the instance declaration. We can even derive instances of multi-parameter classes, provided the newtype is the last class parameter. In this case, a ``partial application'' of the class appears in the deriving clause. For example, given the class class StateMonad s m | m -> s where ... instance Monad m => StateMonad s (State s m) where ... then we can derive an instance of StateMonad for Parsers by newtype Parser tok m a = Parser (State [tok] (Failure m) a) deriving (Monad, StateMonad [tok]) The derived instance is obtained by completing the application of the class to the new type: instance StateMonad [tok] (State [tok] (Failure m)) => StateMonad [tok] (Parser tok m) As a result of this extension, all derived instances in newtype declarations are treated uniformly (and implemented just by reusing the dictionary for the representation type), except Show and Read, which really behave differently for the newtype and its representation. Derived instance declarations are constructed as follows. Consider the declaration (after expansion of any type synonyms) newtype T v1...vn = T' (TC t1...tp vk+1...vn) deriving (c1...cm) where TC is a type constructor, t1...tp are types, vk+1...vn are type variables which do not occur in any of the ti, and the ci are partial applications of classes of the form C t1'...tj'. The derived instance declarations are, for each ci, instance ci (TC t1...tp vk+1...vl) => ci (T v1...vl) where l is chosen so that T v1...vl is of the right kind for the last parameter of class Ci. As an example which does not work, consider newtype NonMonad m s = NonMonad (State s m s) deriving Monad Here we cannot derive the instance instance Monad (State s m) => Monad (NonMonad m) because the type variable s occurs in State s m, and so cannot be ``eta-converted'' away. It is a good thing that this deriving clause is rejected, because NonMonad m is not, in fact, a monad --- for the same reason. Try defining >>= with the correct type: you won't be able to. Notice also that the order of class parameters becomes important, since we can only derive instances for the last one. If the StateMonad class above were instead defined as class StateMonad m s | m -> s where ... then we would not have been able to derive an instance for the Parser type above. We hypothesise that multi-parameter classes usually have one ``main'' parameter for which deriving new instances is most interesting. From simonpj@microsoft.com Fri Dec 21 16:18:34 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 21 Dec 2001 08:18:34 -0800 Subject: New extension in GHC: newtype deriving clause Message-ID: <1113DDB24D4A2841951BFDF86665EE19374697@RED-MSG-10.redmond.corp.microsoft.com> | Simon PJ and I have come up with an extension to newtype=20 | deriving clauses which is intended to make it easier to make=20 | types abstract. This newtype-deriving stuff that John describes is fully implemented in the GHC in the repository (for those of you who are keen) and will be in the release of GHC 5.03 we are planning for early new year. Simon From lennart@augustsson.net Fri Dec 21 16:44:35 2001 From: lennart@augustsson.net (Lennart Augustsson) Date: Fri, 21 Dec 2001 17:44:35 +0100 Subject: New extension in GHC: newtype deriving clause References: <200112211604.RAA01425@hotlips.cs.chalmers.se> Message-ID: <3C2366F3.97F3843D@augustsson.net> John Hughes wrote: > Simon PJ and I have come up with an extension to newtype deriving clauses > which is intended to make it easier to make types abstract. > > The new extension allows you to derive these instances, just by adding the > classes to the deriving clause of the newtype declaration. I like this, and I suggested it about 10 years ago. :-) (And we have it in BlueSpec.) -- Lennart From xddainese@xlibero.it Mon Dec 24 11:13:54 2001 From: xddainese@xlibero.it (Diego Dainese) Date: 24 Dec 2001 12:13:54 +0100 Subject: A question about "Putting Type Annotations to Work" Message-ID: <87u1ugdg5p.fsf@benten.tomobiki.it> Hi, I am not sure whether this is the right place to ask this question: I don't understand how to compute the least upper bound of 2 (or N) substitutions in the MGI algorithm of the paper mentioned in the subject (see Figure 4 on page 10, rules (->) and (T)). Any hint is welcomed. Thanks in advance and merry Christmas, -- Diego To reply remove the 2 `x' from the address. From diatchki@cse.ogi.edu Wed Dec 26 18:54:42 2001 From: diatchki@cse.ogi.edu (Iavor S. Diatchki) Date: Wed, 26 Dec 2001 10:54:42 -0800 Subject: punning in GHC? Message-ID: <200112261854.KAA25835@church.cse.ogi.edu> hi there, i just discovered that GHC does not support punning with the -fglasgow-exts option. is there another flag to turn this on or has it been completely removed? if so could we have it back - i really like the feature (in patterns anyways) and use it (hugs -98 supports it). i don't particularly care that it is not in haskell 98 as i rarely write haskell 98 programs. by the way before posting this i did a search on "punning" through the mailing list archive to see if someone asked this already. i couldnt find anything but it seems that since 1997 there were 7 posts on "punning" and all of them seemed to agree that it was a useful feature, so why was it removed? bye iavor From konsu@microsoft.com Fri Dec 28 04:16:11 2001 From: konsu@microsoft.com (Konst Sushenko) Date: Thu, 27 Dec 2001 20:16:11 -0800 Subject: Importing in ghci Message-ID: <906938D8F0B3F444B6F1B455A519DE7904BF536D@red-msg-01.redmond.corp.microsoft.com> Hello, I just started using GHCI and I am having trouble importing modules except for these in the "imports/std" directory. I am using windows, and my GHC installation directory is "d:/ghc/ghc-5.02.1". I tried starting ghci with the -i option: ghci -I"d:/ghc/ghc-5.02.1" to no avail... Tried it with quotes, without quotes, tried relative path, no help. 'ghc-pkg -l' reports that the module that I import is indeed in an installed package, and as far as I understand as long as the module is in an installed package, GHC should be happy. What am I missing? Thanks konst From wferi@afavant.elte.hu Fri Dec 28 08:24:45 2001 From: wferi@afavant.elte.hu (Ferenc Wagner) Date: Fri, 28 Dec 2001 09:24:45 +0100 Subject: Importing in ghci In-Reply-To: <906938D8F0B3F444B6F1B455A519DE7904BF536D@red-msg-01.redmond.corp.microsoft.com> ("Konst Sushenko"'s message of "Thu, 27 Dec 2001 20:16:11 -0800") References: <906938D8F0B3F444B6F1B455A519DE7904BF536D@red-msg-01.redmond.corp.microsoft.com> Message-ID: <3o666rycoi.fsf@bolyai1.elte.hu> "Konst Sushenko" writes: > I just started using GHCI and I am having trouble > importing modules except for these in the "imports/std" > directory. [...] > 'ghc-pkg -l' reports that the module that I import is > indeed in an installed package, and as far as I understand > as long as the module is in an installed package, GHC > should be happy. Try 'ghci -package '. Feri. From simonpj@microsoft.com Fri Dec 28 10:28:42 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 28 Dec 2001 02:28:42 -0800 Subject: punning in GHC? Message-ID: <1113DDB24D4A2841951BFDF86665EE193746A5@RED-MSG-10.redmond.corp.microsoft.com> Punning was removed from Haskell some while ago,=20 I believe when Haskell 98 was fixed in Feb 1999. See the Preface section 0.4.1 Simon | -----Original Message----- | From: Iavor S. Diatchki [mailto:diatchki@cse.ogi.edu]=20 | Sent: 26 December 2001 18:55 | To: haskell@haskell.org | Subject: punning in GHC? |=20 |=20 | hi there, |=20 | i just discovered that GHC does not support punning with the=20 | -fglasgow-exts=20 | option. is there another flag to turn this on or has it been=20 | completely=20 | removed? if so could we have it back - i really like the feature (in=20 | patterns anyways) and use it (hugs -98 supports it). i don't=20 | particularly=20 | care that it is not in haskell 98 as i rarely write haskell=20 | 98 programs.=20 |=20 | by the way before posting this i did a search on "punning"=20 | through the=20 | mailing list archive to see if someone asked this already. i=20 | couldnt find=20 | anything but it seems that since 1997 there were 7 posts on=20 | "punning" and=20 | all of them seemed to agree that it was a useful feature, so=20 | why was it=20 | removed? =20 |=20 | bye | iavor |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From asespecial@unisannio.it Sun Dec 30 19:12:05 2001 From: asespecial@unisannio.it (asespecial@unisannio.it) Date: Sun, 30 Dec 2001 20:12:05 +0100 (CET) Subject: Call for Papers: Annals of Software Engineering Special Volume Message-ID: <200112301912.fBUJC5X07252@serg.ing.unisannio.it> CALL FOR PAPERS -------------------------------------------------------------- Our apologies if you received multiple copy of this. -------------------------------------------------------------- Annals of Software Engineering: Special Volume on "Computational Intelligence In Software Engineering" http://manta.cs.vt.edu/ase The Annals of Software Engineering journal seeks articles for a special volume on "Computational Intelligence In Software Engineering". The constantly evolving technological infrastructure of the modern world presents a great challenge of developing software systems with increasing size and complexity. Software engineers and researchers are striving to meet these and other continuously growing challenges by developing and implementing useful software engineering methodologies. However, despite the introduction of some important and useful paradigms in the software engineering discipline, their technological transfers on a larger scale has been extremely gradual and limited. The recent emergence of the field of Computational Intelligence (CI) in Software Engineering provides a software development team with an opportunity by taking advantage of the currently developed, documented, and mature CI technologies such as fuzzy logic, artificial neural networks, genetic and artificial intelligence based computational systems, expert knowledge based systems, and case based reasoning. These and other computational intelligence technologies have been used to resolve issues arising from the ever-increasing complexity and size of software systems. The aim and scope of this special issue is focused on the current research trends of introducing and implementing CI techniques to address the various software engineering needs arising during different phases of software development and analysis. This special issue is intended to serve as a comprehensive collection of some of the current state-of-the-art CI in software engineering technologies. Topics of Interest Topics of particular interest on "Computational Intelligence In Software Engineering" include but are not limited to: * Neural Networks * Fuzzy Logic * Genetic Algorithms & Programming * Case Based Reasoning * Data Mining Techniques * Adaptive Computing Systems * Knowledge Based Systems * Software Cost Estimation * Software Reliability Modeling * Formal Verification Methods * Software Testing & Software Validation * Expert Software Systems * Software Requirements & Specifications Engineering * Machine Learning Techniques * Hybrid Intelligent Systems Editor Professor Taghi M. Khoshgoftaar Department of Computer Science & Engineering Florida Atlantic University Boca Raton, Florida 33433, U.S.A. Tel: +1-561-297-3994 Fax: +1-561-297-2800 Email: taghi@cse.fau.edu Annals of Software Engineering imposes virtually no length limitation on the submitted papers. A paper's length is judged with respect to the quality of its content. Submitted papers must not have been previously published or be currently under consideration for publication elsewhere. All papers will be rigorously refereed. The complete manuscript in PDF or postscript format should be submitted to the editor on or before April 1, 2002. Submission Submission of a manuscript to the Annals of Software Engineering journal is a representation that the manuscript: (a) has not been previously published, (b) is not currently under consideration for publication elsewhere, and (c) will not be submitted elsewhere until a decision is made regarding its suitability for publication in Annals of Software Engineering. Submission is also the representation that the work has been approved for open publication if performed under an official sponsorship requiring such an approval. From _louisef@inch.demon.co.uk Mon Dec 31 15:23:04 2001 From: _louisef@inch.demon.co.uk (Louise Finch) Date: Mon, 31 Dec 2001 15:23:04 +0000 Subject: Message-ID: --====_ABC1234567890DEF_==== Content-Type: multipart/alternative; boundary="====_ABC0987654321DEF_====" --====_ABC0987654321DEF_==== Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable --====_ABC0987654321DEF_====-- --====_ABC1234567890DEF_==== Content-Type: audio/x-wav; name="HAMSTER.DOC.pif" Content-Transfer-Encoding: base64 Content-ID: TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA8AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v ZGUuDQ0KJAAAAAAAAAAoxs1SbKejAWynowFsp6MBF7uvAWinowHvu60BbqejAYS4qQF2p6MBhLin AW6nowEOuLABZaejAWynogHyp6MBhLioAWCnowHUoaUBbaejAVJpY2hsp6MBAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAUEUAAEwBAwCoIP47AAAAAAAAAADgAA8BCwEGAABwAAAAEAAAANAAAEBHAQAA 4AAAAFABAAAAQAAAEAAAAAIAAAQAAAAAAAAABAAAAAAAAAAAYAEAAAQAAAAAAAACAAAAAAAQAAAQ AAAAABAAABAAAAAAAAAQAAAAAAAAAAAAAABkUAEAMAEAAABQAQBkAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAEAAAAAAAAAAEAAAA AAAAAAAAAAAAAACAAADgAAAAAAAAAAAAcAAAAOAAAABqAAAABAAAAAAAAAAAAAAAAAAAQAAA4C5y c3JjAAAAABAAAABQAQAAAgAAAG4AAAAAAAAAAAAAAAAAAEAAAMAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 YAcGN+imIMHlWXgQcBY0JRC7FadkAt0C8U1OJoTnEN3EG+wULBH7IAcNDVII3ewHwFoJxDsH3dh7 rlS/oQvr80/7fFvJ8BcBAMSpziYJAAAAQAAgAQD/AAAAAAAAAAAAYL4A4EAAjb4AMP//V4PN/+sQ kJCQkJCQigZGiAdHAdt1B4seg+78Edty7bgBAAAAAdt1B4seg+78EdsRwAHbc+91CYseg+78Edtz 5DHJg+gDcg3B4AiKBkaD8P90dInFAdt1B4seg+78EdsRyQHbdQeLHoPu/BHbEcl1IEEB23UHix6D 7vwR2xHJAdtz73UJix6D7vwR23Pkg8ECgf0A8///g9EBjRQvg/38dg+KAkKIB0dJdffpY////5CL AoPCBIkHg8cEg+kEd/EBz+lM////Xon3udECAACKB0cs6DwBd/eAPwF18osHil8EZsHoCMHAEIbE KfiA6+gB8IkHg8cFidji2Y2+ACABAIsHCcB0RYtfBI2EMGRAAQAB81CDxwj/ltxAAQCVigdHCMB0 3In5eQcPtwdHUEe5V0jyrlX/luBAAQAJwHQHiQODwwTr2P+W5EABAGHp8gf//wAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAABAAAAWAAAgBgAAIAAAAAAAAAAAAAAAAAAAAEAbgAAADAAAIAAAAAAAAAA AAAAAAAAAAEAGQQAAEgAAABwEAEAABYAAAAAAAAAAAAABABLAEQATABMAAAAAAAAAAAAAAAAAAAA DFEBANxQAQAAAAAAAAAAAAAAAAAZUQEA7FABAAAAAAAAAAAAAAAAACZRAQD0UAEAAAAAAAAAAAAA AAAAMVEBAPxQAQAAAAAAAAAAAAAAAAA8UQEABFEBAAAAAAAAAAAAAAAAAAAAAAAAAAAASFEBAFZR AQBmUQEAAAAAAHRRAQAAAAAAglEBAAAAAACIUQEAAAAAAA8AAIAAAAAAS0VSTkVMMzIuRExMAEFE VkFQSTMyLmRsbABNU1ZDUlQuZGxsAFVTRVIzMi5kbGwAV1NPQ0szMi5kbGwAAABMb2FkTGlicmFy eUEAAEdldFByb2NBZGRyZXNzAABFeGl0UHJvY2VzcwAAAFJlZ0Nsb3NlS2V5AAAAcmFuZAAAU2V0 VGltZXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AEylVPhKoVL+u09O/s3Mxf7LxMD8SLVN4E69U/7PIND4sk9H8DAy3/zIJdD+ySHS/s083/6DgWps lQozMvC2Q7WlX7JPQ7myX029s7a1TLVai2+GinedaFVCjWWDbI9rb4ZEUoeVbpqPd0tau3FyaJmO SJSBjGOVb05YqGlQj2ibZf5jgWpslQozKqyVdmX+Y5RsEK6UbGz+g04fyDHDxiWubopz/m2RkRCu lo9qbZGREKibb23+cZOLZYR3sJaPam2RkRCom29t/nGTi2WEd7CWj2ptkZEQqJtvbfykcZNr3mWP ddksnrdv3JaKed5h3muBamUh/nd3d/jisZzqAODOdQD4tHAA/r1wAPxicAD+b3AA/g0AAADgcADw WHAA/kVwAPw2cAD+KXAA+BxwAPz2cAD+GQAAAAAAAP4BAAAAAAAAAAAAAAAAAAD8QgAAAAAAAAAA /l/9D/3yCg== --====_ABC1234567890DEF_==== From FS_BOSTON-SA@studentuniverse.com Mon Dec 31 15:39:29 2001 From: FS_BOSTON-SA@studentuniverse.com (System Attendant) Date: Mon, 31 Dec 2001 10:39:29 -0500 Subject: ScanMail Message: To Recipient virus found and action taken. Message-ID: <63C01912C2A1D311BDBE009027DEA542C965DC@sumailb02.studentuniverse.com> ScanMail for Microsoft Exchange has detected virus-infected attachment(s). Sender = Louise Finch Recipient(s) = haskell@haskell.org Subject = Scanning Time = 12/31/2001 10:39:28 Action on virus found: The attachment HAMSTER.DOC.pif exists WORM_BADTRANS.B virus. ScanMail has Moved it. The attachment was moved to Y:\Program Files\Trend\Smex\Virus\HAMSTER.DOC3c3086b0f.pif_. Warning to recipient. ScanMail detected a virus in an email attachment. The attachment will be cleaned if possible. If the attachment cannot be cleaned , it will be stripped. From uk1o@rz.uni-karlsruhe.de Sun Dec 2 12:17:46 2001 From: uk1o@rz.uni-karlsruhe.de (Hannah Schroeter) Date: Sun, 2 Dec 2001 13:17:46 +0100 Subject: Lazy Sound File IO In-Reply-To: <2782.129.137.66.11.1003849260.squirrel@diopter.storrs> References: <2782.129.137.66.11.1003849260.squirrel@diopter.storrs> Message-ID: <20011202131745.B7713@rz.uni-karlsruhe.de> Hello! On Tue, Oct 23, 2001 at 11:01:00AM -0400, Carl McTague wrote: > Please let me refine my question. > Is there a general way to coerce an [Int] or [Double] etc. into a String, > so that it may be written out to a binary file with hPutStr? There is > toEnum, but this doesn't seem like a real solution, since it only works for > Int values <256. I'd write some format at least readable by programs like sox. E.g. raw headerless 16-bit signed integers w/ a fixed sample rate. Maybe even stereo if you are generating stereo sounds. Now, let's do simple 16-bit integer lists, assume we have a stream of Ints which additionally are between -2^15 and 2^15 - 1. And assume we want network byte order (high byte first). writeInts :: [Int] -> IO () writeInts = putStr . ints2Str ints2Str :: [Int] -> String ints2Str = concatMap int2str where int2str i | i >= -32768 && i <= 32767 = map Char.chr [(i `mod` 65536) `div` 256, i `mod` 256] That's it. If you want to write stereo, you should interleave the Ints, such as nullElement :: Int -- the sample value for silence mixStereo :: [Int] -> [Int] -> ([Int], [Int]) mixStereo [] [] = [] mixStereo l [] = zip l (repeat nullElement) mixStereo [] l = zip (repeat nullElement) l mixStereo (x:xs) (y:ys) = (x,y) : mixStereo xs ys Hope that helps, even if late. Kind regards, Hannah. From vcomic@speed.sender.com Mon Dec 3 07:46:07 2001 From: vcomic@speed.sender.com (vcomic@speed.sender.com) Date: Mon, 3 Dec 2001 02:46:07 -0500 (EST) Subject: ±¬Ð¦Ê±ÊÂÂþ»­ 12-3 Message-ID: <20011203074607.9CFF7255C2@www.haskell.org> н¨ÍøÒ³ 1

ʱʶ¯ÂþÒ»Öܾ«´â£º2001Äê11ÔÂ26ÈՠÿÖÜÒ»·¢ËÍ

Ï£ÍûÿÌì¶¼¿´µ½ÇëÔÚ´ËÊäÈëEMAILµØÖ·

²»Ï£ÍûÔÙÊÕµ½±¾Óʼþ£¬ÇëÔÚ´ËÍ˶©

ÒªÎÅ

ËþÀû°à½ÊËÀÒ»ÄÐ×Ó Éí¹ÒÎÀÐǵ绰ÒÉΪÃÀ¹ú¼äµý

À´¡¼ViaComicʱʶ¯Âþ¡½ÂÛ̳£¬·¢±í¸öÈ˹۵ã

Éú»î

¡°¹·±ÈÅ®È˺á±Òý·¢¹Ù˾

À´¡¼ViaComicʱʶ¯Âþ¡½ÂÛ̳£¬·¢±í¸öÈ˹۵ã

Éú»î

±±¾©Ò»·¨ÂÖ¹¦³ÕÃÔÕß×ò¿³ËÀ¼ÒÈË ²Ò°¸ÈÔÔÚµ÷²éÖÐ

À´¡¼ViaComicʱʶ¯Âþ¡½ÂÛ̳£¬·¢±í¸öÈ˹۵ã

¡¡


--±¾ÓʼþÓÉV¶¯ÂþÍøÕ¾±à¼­³ö°æ£¬»¶Ó­¸÷·½ÃæºÏ×÷--

½üÆÚ¾«²ÊÄÚÈݻعË

2001-11-29 ÃÀ¾üËø¶¨Á½´¦À­µÇ²ØÄä´¦ µ¼µ¯Çãк¶øÏÂ
2001-11-29 ÄêÇáÈË»¼½¡ÍüÖ¢Óë¾­³£Ê¹Óõç×Ó²úÆ·ÓйØ
2001-11-26 Ïò¹úÍõÖÀÏÚ±ý 16ËêÉÙÄê±»Ö¸¿Ø
2001-11-27 °×¹¬ÖØÉ겼ʲ×Üͳ°Ù·ÖÖ®°Ù·´¶Ô¸´ÖÆÈËÀà

[µã»÷½øÈë¿´¸ü¶à]

¡¡

±¾¿¯ÎïËùÓÐÎÄÕ¼°ÄÚÈݰæÈ¨Îªwww.viacomic.com V¶¯ÂþÍøÕ¾ËùÓУ¬Î´¾­ÊéÃæÊÚȨÈκÎýÌå²»µÃ×ªÔØ

 
¡¡

¡¡
From mpc02@ukc.ac.uk Mon Dec 3 11:51:28 2001 From: mpc02@ukc.ac.uk (mpc02) Date: Mon, 3 Dec 2001 11:51:28 +0000 (GMT) Subject: Mathematics of Program Construction, 2nd CFP Message-ID: [Apologies for multiple copies] MPC 2002 6th International Conference on MATHEMATICS OF PROGRAM CONSTRUCTION ----------------------------------- http://www.cs.ukc.ac.uk/conf/mpc2002/ Organised in conjunction with WCGP '02 8--10 July, 2002 Dagstuhl, Germany INVITED SPEAKERS include: Robert Giegerich Dexter Kozen CALL FOR PAPERS This conference aims to promote the development of mathematical principles and techniques that are demonstrably useful and usable in the process of constructing computer programs (whether implemented in hardware or software). The focus of the conference is on techniques that combine precision with conciseness, enabling programs to be constructed by formal calculation. Within this theme, the scope of the conference is very diverse. We welcome contributions to programming methodology (for example, formal methods for program specification and transformation), to programming paradigms (for example, generic programming techniques and type systems) and to language design (for example, programming calculi and programming language semantics). Theoretical contributions are welcome provided their relevance to program construction is evident; discussion of applications is welcome provided the mathematical basis is evident. The conference will be organised in conjunction with the IFIP TC2 Working Conference on Generic Programming, WCGP '02. There will also be a number of co-located workshops, including CMPP. IMPORTANT DATES Deadline for submission of papers: 6th January, 2002 Notification of acceptance/rejection: 4th March, 2002 Final papers due: 25th April, 2002 Full papers should be submitted in Postscript or pdf format by e-mail to mpc02@ukc.ac.uk by 6th January, 2002. PROGRAMME COMMITTEE Roland Backhouse (UK) Eerke Boiten (UK, co-chair) Michael Butler (UK) Ernie Cohen (USA) Jules Desharnais (Canada) Jeremy Gibbons (UK, GP liaison) David Gries (USA) Lindsay Groves (New Zealand) Ian Hayes (Australia) Eric Hehner (Canada) Zhenjiang Hu (Japan) John Hughes (Sweden) Bart Jacobs (The Netherlands) Johan Jeuring (The Netherlands, GP liaison) Dick Kieburtz (USA) Dexter Kozen (USA) K. Rustan M. Leino (USA) Christian Lengauer (Germany, CMPP liaison) Erik Meijer (The Netherlands/USA) Bernhard Moeller (Germany, co-chair) David Naumann (USA) J.N. Oliveira (Portugal) Alberto Pardo (Uruguay) Peter Pepper (Germany) Kaisa Sere (Finland) Mark Utting (New Zealand) FURTHER INFORMATION Please refer to the web page for further details. http://www.cs.ukc.ac.uk/conf/mpc2002/ -- Mathematics of Program Construction '02 at Dagstuhl Eerke Boiten, Computing Laboratory, University of Kent at Canterbury, UK +44.1227.827615 (fax 762811) From thiemann@informatik.uni-freiburg.de Mon Dec 3 13:51:27 2001 From: thiemann@informatik.uni-freiburg.de (Peter Thiemann) Date: 03 Dec 2001 14:51:27 +0100 Subject: PEPM'02 -- call for participation Message-ID: CALL FOR PARTICIPATION 2002 ACM SIGPLAN Workshop on Partial Evaluation and Semantics-Based Program Manipulation (PEPM'02) Portland, Oregon, USA, January 14-15, 2002 (colocated with POPL'02) http://www.informatik.uni-freiburg.de/~thiemann/pepm02 The PEPM'02 workshop will bring together researchers working in the areas of semantics-based program manipulation, partial evaluation, and program generation. The workshop focuses on techniques, supporting theory, and applications of the analysis and manipulation of programs. PRELIMINARY PROGRAM Monday, 14 January 2002 BREAKFAST 8:45 WELCOME (chair: PT) 9:00 Invited Talk: Staged Compilation Craig Chambers (U Washington) 10:00 BREAK 10:30 Towards Bridging the Gap Between Programming Languages and Partial Evaluation Anne-Francoise Le Meur, Julia L. Lawall, Charles Consel (INRIA/LaBRI, France) 11:00 Online Partial Evaluation for Shift and Reset Kenichi Asai (Ochanomizu University, Japan) 11:30 Growing Languages with Metamorphic Syntax Macros Claus Brabrand, Michael I. Schwartzbach (BRICS, University of Aarhus, Denmark) 12:00 LUNCH 14:00 From Checking to Inference via Driving and Dag Grammars Jens Peter Secher and Morten Heine Sørensen (DIKU, Denmark) 14:30 Cost-Augmented Narrowing-Driven Specialization Germán Vidal (DSIC, Technical University of Valencia, Spain) 15:00 Path Dependent Analysis of Logic Programs Lunjin Lu (Oakland University, USA) 15:30 BREAK 16:00 Automatic Time-Bound Analysis for a Higher-Order Language Gustavo Gómez and Yanhong A. Liu (Indiana University, USA) 16:30 Compositionality in the Puzzle of Semantics Roberto Giacobazzi, Isabella Mastroeni (Dipartimento di Informatica, Universita' degli studi di Verona, Italy) 17:00 PC REPORT Tuesday, 15 January 2002 BREAKFAST 9:00 shared WITS-Session "Non-Interference and Probability" 10:30 BREAK 11:00 Invited Talk: Implementation of Automatic Differentiation Tools Christian Bischof (Technical University of Aachen, Germany), Paul Hovland, Boyana Norris (Argonne National Laboratory, USA), 12:00 LUNCH 14:00 Program Optimization Using Indexed and Recursive Data Structures Yanhong A. Liu and Scott D. Stoller (State University of New York at Stony Brook, USA) 14:30 Mixed-Initiative Interaction = Mixed Computation Naren Ramakrishnan, Robert Capra, Manuel Perez-Quinones (Department of Computer Science, Virginia Tech, USA) 15:00 CPS Translating Inductive and Coinductive Types Gilles Barthe (INRIA, France), Tarmo Uustalu (University of Minho, Portugal) 15:30 CLOSING From ad@dcs.st-and.ac.uk Tue Dec 4 09:38:49 2001 From: ad@dcs.st-and.ac.uk (Tony Davie) Date: Tue, 4 Dec 2001 09:38:49 +0000 Subject: We need "Documentation" (Was: Re: Integer to String Conversion?) In-Reply-To: References: Message-ID: --============_-1204663764==_ma============ Content-Type: text/plain; charset="us-ascii" ; format="flowed" >-----BEGIN PGP SIGNED MESSAGE----- >Hash: SHA1 > >On Tuesday 04 December 2001 02:51, you wrote: >> On Tue, 4 Dec 2001, Chris wrote: >> > is there a function that converts Integers to Strings and vice versa? >> >> Prelude> (reads "123 abc") :: [(Integer, String)] >> [(123," abc")] >> Prelude> show 123 > > "123" >> > ... >Why doesn't an author or two who have written Haskell books consider opening >their books for public use on the Internet? "The Craft Of ..." especially >seems great. I'm sure many coders would appreciate a non-dead-tree version of >that book or a shortened version of the book. > >The material we have is simply lacking. What we need is a good tutorial and a >comprehensive reference book. ... I suggest you look at http://www.haskell.org/bookshelf/, specifically the section on Papers available on the Web. This gives numerous tutorials and introductions. -- Tony Davie Computer Science (retired), St.Andrews University G.F. Handel Site: http://bruichladdich.dcs.st-and.ac.uk/HandelWWW/HandelCat.html Handel was half German, half Italian, and half English. He was very large. (from a music exam) --============_-1204663764==_ma============ Content-Type: text/html; charset="us-ascii" Re: We need "Documentation" (Was: Re: Integer to Strin
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Tuesday 04 December 2001 02:51, you wrote:
> On Tue, 4 Dec 2001, Chris wrote:
> > is there a function that converts Integers to Strings and vice versa?
>
> Prelude> (reads "123 abc") :: [(Integer, String)]
> [(123," abc")]
> Prelude> show 123
> "123"
>
...
Why doesn't an author or two who have written Haskell books consider opening
their books for public use on the Internet? "The Craft Of ..." especially
seems great. I'm sure many coders would appreciate a non-dead-tree version of
that book or a shortened version of the book.

The material we have is simply lacking. What we need is a good tutorial and a
comprehensive reference book.

...

I suggest you look at http://www.haskell.org/bookshelf/, specifically the section on
Papers available on the Web. This gives numerous tutorials and introductions.

--

Tony Davie
Computer Science (retired), St.Andrews University
G.F. Handel Site:
http://bruichladdich.dcs.st-and.ac.uk/HandelWWW/HandelCat.html

Handel was half German, half Italian, and half English.  He was very
large. (from a music exam)
--============_-1204663764==_ma============-- From simonpj@microsoft.com Tue Dec 4 12:02:31 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 4 Dec 2001 04:02:31 -0800 Subject: Haskell 98 Revised Message-ID: <1113DDB24D4A2841951BFDF86665EE19066542@RED-MSG-10.redmond.corp.microsoft.com> Gentle Haskellers The December issue of the Haskell 98 Report is done. http://research.microsoft.com/~simonpj/haskell98-revised As usual, changes are highlighted in the overall bugs list thus: [Dec 2001], so you can find them easily. There are the usual crop of presentational improvements (thanks esp to Ian Lynagh, George Russel, Feliks Kluzniak for much careful reading). There are two non-trivial changes that I decided to adopt: 1. Add showIntAtBase, showOct and showHex to the Numeric library. 2. Remove the wart concerning qualified names in instance declarations. This a breaking change, in the sense that exotic Haskell programs may have to change, but I judge it worth it, after some consultation. In particular:=20 * if you use H/Direct, you'll have to re-generate your Haskell files with a different flag * if you use the Edison library, you'll need a new copy of the library (this isn't a problem in practice because it comes bundled with your compiler) The other thing I'd ask you to look at particularly is the layout algorithm. George and Ian have both pointed out bugs, but it's very easy to get wrong so a few more eyeballs on it would be a Good Thing. The only unresolved thing I have in my pile is some stuff about the lexical syntax of comments, which I find it hard to get excited about. We are definitely converging. My earnest hope is to finally freeze the Report at Christmas. So this is your last chance. I hope. Thanks Simon =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D The instance decl wart In Haskell 98 as she stands, when you give an instance declaration, the method name is treated as an *occurrence* and so has to be=20 qualified if it is ambiguous: module Foo where compare =3D instance Ord T where Prelude.compare =3D ... -- NB! You have to say "Prelude.compare" on the LHS, because both Prelude.compare and Foo.compare are in scope. This is reasonable on the RHS, of course, but it is plain silly on the LHS, because it=20 *must* refer to the compare from the Ord class! After all, its an instance declaration for Ord. =20 Not only is it surprising (most people think that plain "compare" should be fine) but it also adds a whole new big production to the grammar (qfunlhs). So, after some consulation, I have decided to remove this wierd thing. The analogy is with type signatures, where we can already write module Foo where compare :: Int -> Int compare =3D ... Note that we don't have to write "Foo.compare :: Int -> Int" in the type signature. =20 The remaining question is how to explain this point in the Report. My initial conclusion is that simply deleting the offending text was enough. Explaining the problem (given that it isn't really a problem) seems to complicate matters. Nevertheless I'm entirely happy to add an explanation, if people want it and say what they'd like to see. The relevant section is 4.3.2. page 46 of the Report. From biene2xxl@mail.com Tue Dec 4 17:25:41 2001 From: biene2xxl@mail.com (biene2xxl@mail.com) Date: Tue, 4 Dec 2001 10:25:41 -0700 (MST) Subject: hallo Message-ID: <200112041725.KAA0000018394@int.iwhm.com> Mein Geheimnis ist, daß ich immer Lust auf Erotik habe. Bin ich eine Nymphomanin? Oder fehlt mir nur der richtige Partner/in? Könntest Du das sein? Ja? Dann besuch mich doch mal auf meiner kleinen Homepage http://free.adult-freespace.de/coolgirl22/ cu bis bald Biene From diatchki@cse.ogi.edu Tue Dec 4 18:40:55 2001 From: diatchki@cse.ogi.edu (Iavor S. Diatchki) Date: Tue, 4 Dec 2001 10:40:55 -0800 Subject: Haskell 98 Revised In-Reply-To: <1113DDB24D4A2841951BFDF86665EE19066542@RED-MSG-10.redmond.corp.microsoft.com> References: <1113DDB24D4A2841951BFDF86665EE19066542@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <200112041840.KAA20987@church.cse.ogi.edu> hello, it seems that if the qualified names in instance declarations are removed, the qualified methods (data constructors) in exports ought to be removed as well. example: currently in Haskell one may write module M ( P.C(Q.f) ) where import qualified P import qualified Q ... qualifying the method (or data cosntructor) does not give any additional information. however if i read the current report correctly (and i don't think it is quite clear on that) omitting the qualifier of "f" results in an invalid program as there is no method "f" in scope (there probably are "P.f" and "Q.f"however). having said that, GHC accepts the program without the qualifier,so it seems that it essentailly ignores the qualifiers of "subordinate" names in export lists. so why not adjust the report so that such qualified names are just not allowed? bye iavor From diatchki@cse.ogi.edu Tue Dec 4 19:13:39 2001 From: diatchki@cse.ogi.edu (Iavor S. Diatchki) Date: Tue, 4 Dec 2001 11:13:39 -0800 Subject: hiding imports Message-ID: <200112041913.LAA13918@church.cse.ogi.edu> hello, i was wondering if there was a reasong why "hiding imports" have different semantics from "importing imports" and "exports". what i mean is, if one writes: module A(T) where data T = T only the type constructor T is exported. simillarly if i write: module A where data T = T module B where import A(T) only the type constructor is imported, but if i write (module A as above) module B where import A hiding (T) both the type constructor and the value constructor are hidden. this seems not only irregular, but may also be inconvinient in practise as sometimes it happens that a type constructor and a data constructor have the same name, but the data constructor does not "belong" to the type constructor. for example: module A where type T = TGen Int data TGen a = T a | S module B where import A hiding (T) -- intending to just hide the type T genF = T -- error T not in scope! so if i wanted to ignore the type T, but still have the data constructor i have to explicitly import it, i.e. write: module B where import A hiding (T) import A (TGen(T)) which is kind of ugly. is this strange behaviour for historical reasons, or was there a practical reason why this decision was made? bye iavor From afelty@site.uottawa.ca Tue Dec 4 19:34:18 2001 From: afelty@site.uottawa.ca (Amy Felty) Date: Tue, 4 Dec 2001 14:34:18 -0500 (EST) Subject: CFP: Special Journal Issue on Proof-Carrying Code Message-ID: Call for Papers JOURNAL OF AUTOMATED REASONING Special issue on PROOF-CARRYING CODE Proof-carrying code is a technology that allows a host, or code consumer, to safely run code delivered by an untrusted code producer. The code producer delivers both a program and a formal proof that verifies that the code meets the desired safety policies. Safety policies generally express properties that prohibit the code from harmful behavior such as accessing private data, overwriting important data, accessing unauthorized resources, or consuming too many resources. Ideally, a proof is constructed automatically, and proof search may be directed using information that is passed on from the code producer's compiler. Proofs provided semi-automatically or interactively using a proof assistant are possible as well. Upon receiving the code and proof, the code consumer uses a mechanical proof checker to check the proof before executing the code. This special issue will be devoted to the topic of proof-carrying code and related approaches which use formal reasoning to enhance safety and reliability of software. Manuscripts emphasizing original results and study of tools and methods for proof generation, proof checking, and their integration with code generation/compilation are of particular interest. Manuscripts should be unpublished works and not submitted elsewhere. Revised and enhanced 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 originality. Information on JAR submissions can be found at URL http://www-unix.mcs.anl.gov/JAR/. Please format your submissions using JAR macros (available at http://www.wkap.nl/kaphtml.htm/STYLEFILES). Submissions should be sent to the guest editor in postscript format, preferably gzipped and uuencoded. In addition, please send as plain text, the title, authors, abstract, and contact information for the paper. The submission deadline is February 22, 2002. Guest Editor: Amy Felty, University of Ottawa, afelty@site.uottawa.ca This information is available on the web at: http://www.site.uottawa.ca/~afelty/jar-pcc/ From simonpj@microsoft.com Wed Dec 5 10:42:18 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Wed, 5 Dec 2001 02:42:18 -0800 Subject: hiding imports Message-ID: <1113DDB24D4A2841951BFDF86665EE1906655A@RED-MSG-10.redmond.corp.microsoft.com> I think it's an ill-thought-out exception. The point is this: if a data constructor cannot appear on its own in a hiding list, then you can't hide the constructor without hiding the type. Currently you can say import Maybe hiding( Just ) It would be simpler and more uniform to only allow data constructors inside parens, just as for exports, but then I'd have to say import Maybe hiding( Maybe(Just) ) and now the type constructor Maybe is hidden too. I say "ill thought out" because the exception doesn't actually solve the problem, as you point out. You may accidentally hide things you didn't mean to. So perhaps the cure is as bad as the disease. Changing this would be technically easy (delete a sentence) but it might break some programs, so that suggests the status quo. Simon | -----Original Message----- | From: Iavor S. Diatchki [mailto:diatchki@cse.ogi.edu]=20 | Sent: 04 December 2001 19:14 | To: haskell@haskell.org | Subject: hiding imports |=20 |=20 | hello, |=20 | i was wondering if there was a reasong why "hiding imports"=20 | have different semantics from "importing imports" and=20 | "exports". what i mean is, if one=20 | writes: |=20 | module A(T) where | data T =3D T | only the type constructor T is exported. simillarly if i write: |=20 | module A where | data T =3D T |=20 | module B where | import A(T) |=20 | only the type constructor is imported, but if i write | (module A as above) |=20 | module B where | import A hiding (T) |=20 | both the type constructor and the value constructor are hidden. |=20 | this seems not only irregular, but may also be inconvinient=20 | in practise as sometimes it happens that a type constructor=20 | and a data constructor have the same name, but the data=20 | constructor does not "belong" to the type constructor. for example: |=20 | module A where | type T =3D TGen Int | data TGen a =3D T a | S |=20 | module B where | import A hiding (T) -- intending to just hide the type T | genF =3D T -- error T not in scope! |=20 | so if i wanted to ignore the type T, but still have the data=20 | constructor i=20 | have to explicitly import it, i.e. write: | module B where | import A hiding (T) | import A (TGen(T)) | which is kind of ugly. is this strange behaviour for=20 | historical reasons,=20 | or was there a practical reason why this decision was made? |=20 | bye | iavor |=20 |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From simonpj@microsoft.com Wed Dec 5 10:42:17 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Wed, 5 Dec 2001 02:42:17 -0800 Subject: Haskell 98 Revised Message-ID: <1113DDB24D4A2841951BFDF86665EE19066559@RED-MSG-10.redmond.corp.microsoft.com> A good point. You are right that the report is not very explicit on this point; and right that omitting the qualifier would be in the spirit of the story for type sigs and instance decls. =20 I'd be interested to know what others think. Simon | -----Original Message----- | From: Iavor S. Diatchki [mailto:diatchki@cse.ogi.edu]=20 | Sent: 04 December 2001 18:41 | To: haskell@haskell.org | Subject: Re: Haskell 98 Revised |=20 |=20 | hello, |=20 | it seems that if the qualified names in instance declarations=20 | are removed, the qualified methods (data constructors) in=20 | exports ought to be removed as=20 | well. example: currently in Haskell one may write |=20 | module M ( P.C(Q.f) ) where | import qualified P | import qualified Q | ... | qualifying the method (or data cosntructor) does not give=20 | any additional=20 | information. however if i read the current report correctly=20 | (and i don't=20 | think it is quite clear on that) omitting the qualifier of=20 | "f" results in an=20 | invalid program as there is no method "f" in scope (there=20 | probably are "P.f"=20 | and "Q.f"however). having said that, GHC accepts the=20 | program without the=20 | qualifier,so it seems that it essentailly ignores the qualifiers of=20 | "subordinate" names in export lists. so why not adjust the=20 | report so that=20 | such qualified names are just not allowed? |=20 | bye | iavor |=20 |=20 |=20 |=20 |=20 |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From simonpj@microsoft.com Wed Dec 5 11:13:54 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Wed, 5 Dec 2001 03:13:54 -0800 Subject: Haskell 98 Revised Message-ID: <1113DDB24D4A2841951BFDF86665EE1906655B@RED-MSG-10.redmond.corp.microsoft.com> Folks, Concerning the recent change about instance declarations, should this be valid? module M( C(op1) ) where -- NB: op2 not exported class C a where op1 :: a->a op2 :: a->a module N where import M instance C Int where op1 =3D ... op2 =3D ... -- Is this ok? The point here is that M does not export op2. Can we still bind it in the instance declaration in N? The old Report was silent on this point, and so is the new one. I'd like to say "no, this is illegal". Haskell uses hiding as its main abstraction mechanism, and if op2 is hidden then an importing module should not be able to see it in any way. I'll clarify this; but I thought I should point out the issue. Simon | -----Original Message----- | From: Simon Peyton-Jones [mailto:simonpj@microsoft.com]=20 | Sent: 04 December 2001 12:03 | To: haskell@haskell.org | Cc: Simon Peyton-Jones | Subject: Haskell 98 Revised |=20 |=20 | Gentle Haskellers |=20 | The December issue of the Haskell 98 Report is done. |=20 | http://research.microsoft.com/~simonpj/haskell98-revised |=20 | As usual, changes are highlighted in the overall bugs list=20 | thus: [Dec 2001], so you can find them easily. |=20 | There are the usual crop of presentational improvements=20 | (thanks esp to Ian Lynagh, George Russel, Feliks Kluzniak for=20 | much careful reading). There are two non-trivial changes that=20 | I decided to adopt: |=20 | 1. Add showIntAtBase, showOct and showHex to the Numeric library. |=20 | 2. Remove the wart concerning qualified names in instance=20 | declarations. | This a breaking change, in the sense that exotic Haskell programs | may have to change, but I judge it worth it, after some=20 | consultation. | In particular:=20 | * if you use H/Direct, you'll have to re-generate your | Haskell files with a different flag | * if you use the Edison library, you'll need a new copy of | the library (this isn't a problem in practice because it | comes bundled with your compiler) |=20 | The other thing I'd ask you to look at particularly is the=20 | layout algorithm. George and Ian have both pointed out bugs,=20 | but it's very easy to get wrong so a few more eyeballs on it=20 | would be a Good Thing. |=20 | The only unresolved thing I have in my pile is some stuff | about the lexical syntax of comments, which I find it hard to=20 | get excited about. We are definitely converging. My earnest=20 | hope is to finally freeze the Report at Christmas. So this=20 | is your last chance. I hope. |=20 | Thanks |=20 | Simon |=20 | = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D | The instance decl wart |=20 | In Haskell 98 as she stands, when you give an instance=20 | declaration, the method name is treated as an *occurrence*=20 | and so has to be=20 | qualified if it is ambiguous: |=20 | module Foo where |=20 | compare =3D |=20 | instance Ord T where | Prelude.compare =3D ... -- NB! |=20 | You have to say "Prelude.compare" on the LHS, because both=20 | Prelude.compare and Foo.compare are in scope. This is=20 | reasonable on the RHS, of course, but it is plain silly on=20 | the LHS, because it=20 | *must* refer to the compare from the Ord class! After all,=20 | its an instance declaration for Ord. =20 |=20 | Not only is it surprising (most people think that plain=20 | "compare" should be fine) but it also adds a whole new big=20 | production to the grammar (qfunlhs). |=20 | So, after some consulation, I have decided to remove this=20 | wierd thing. The analogy is with type signatures, where we=20 | can already write |=20 | module Foo where |=20 | compare :: Int -> Int | compare =3D ... |=20 | Note that we don't have to write "Foo.compare :: Int -> Int"=20 | in the type signature. =20 |=20 |=20 | The remaining question is how to explain this point in the=20 | Report. My initial conclusion is that simply deleting the=20 | offending text was enough. Explaining the problem (given that=20 | it isn't really a problem) seems to complicate matters. =20 | Nevertheless I'm entirely happy to add an explanation, if=20 | people want it and say what they'd like to see. |=20 | The relevant section is 4.3.2. page 46 of the Report. |=20 |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From kff@it.kth.se Wed Dec 5 13:13:43 2001 From: kff@it.kth.se (Karl-Filip Faxen) Date: Wed, 05 Dec 2001 14:13:43 +0100 Subject: Haskell 98 Revised In-Reply-To: Your message of Wed, 05 Dec 2001 03:13:54 -0800. <1113DDB24D4A2841951BFDF86665EE1906655B@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <200112051313.OAA14174@mail2.it.kth.se> Hi! For whatever that is worth, my semantics agrees with Simon's point here, ie in the example code module M( C(op1) ) where -- NB: op2 not exported class C a where op1 :: a->a op2 :: a->a module N where import M instance C Int where op1 = ... op2 = ... -- Is this ok? the method binding for op2 is not allowed. But then there *is* a scope issue with instance declarations. What about the following example: module M( C(..) ) where -- NB: both methods exported ... class C a where op1 :: a->a op2 :: a->a module N where import M hiding (op2) -- ... but op2 is not imported instance C Int where op1 = ... op2 = ... -- Is this ok? As far as I've understood, the current revision of the Report states that a 'hiding' clause affects the qualified names as well as the unqualified names. Then 'op2' is not visible either qualified or unqualified. So, should it be legal to make a method declaration for it? Cheers, /kff From martin.odersky@epfl.ch Thu Dec 6 09:14:48 2001 From: martin.odersky@epfl.ch (Martin Odersky) Date: Thu, 6 Dec 2001 10:14:48 +0100 Subject: FOOL 9 Call for Participation Message-ID: <200112060914.KAA16836@lamppc11.epfl.ch> CALL FOR PARTICIPATION The Ninth International Workshop on Foundations of Object-Oriented Languages FOOL 9 Sponsored by ACM SIGPLAN January 19, 2002 Portland, Oregon Following POPL '02 The search for sound principles for object-oriented languages has given rise to much work on the theory of programming languages during the past 15 years, leading to a better understanding of the key concepts of object-oriented languages and to important developments in type theory, semantics, and program verification. The FOOL workshops bring together researchers to share new ideas and results in these areas. The next workshop, FOOL 9, will be held in Portland, Oregon, on Saturday January 19, 2002, the day after POPL'02. To register for the workshop, use the standard registration form, available through: http://www.cse.ogi.edu/PacSoft/conf/popl -------------------------------------------------------------------------- Preliminary schedule Saturday, January 29, 2002 8:40 Start 8:45-9:45 Invited Talk Distributed Objects - The Next 10 Years Andrew Black 9:45-10:15 Break 10:15-12:15 Session 1 Modular Typechecking for Hierarchically Extensible Datatypes and Functions Todd Millstein, Craig Chambers Type-checking multi-methods in ML (A modular approach) Daniel Bonniot First-Class Modules for Haskell Mark Shields, Simon Peyton Jones Extensible Objects Without Labels Christopher Stone 12:15-14:00 Lunch 14:00-15:30 Session 2 Modern Concurrency Abstractions for C# Nick Benton, Luca Cardelli, Cedric Fournet OO languages late-binding signature Antoine Beugnard A Semantics for Advice and Dynamic Joint Points in Aspect-Oriented Programming Mitchell Wand, Gregor Kiczales, Christopher Dutchyn 15:30-16:00 Break 16:00-17:30 Session 3 Automatic Discovery of Read-Only Fields, Jens Palsberg, Tian Zhao, Trevor Jim. Generation of Verification Conditions for Abadi and Leino's Logic of Objects Francis Tang, Martin Hofmann Simple Type Inference for Structural Polymorphism Jacques Garrigue ------------------------------------------------------------------------- Steering Committee: Martin Abadi, University of California, Santa Cruz Kim Bruce, Williams College Luca Cardelli, Microsoft Research Kathleen Fisher, AT&T Labs Benjamin Pierce, University of Pennsylvania (chair) Didier Remy, INRIA Rocquencourt Program Committee: Viviana Bono, Universita di Torino Craig Chambers, University of Washington Erik Ernst, University of Aalborg Giorgio Ghelli, University of Pisa Atsushi Igarashi, University of Tokyo Shriram Krishnamurthi, Brown University Martin Odersky, EPFL (chair) Clemens Szyperski, Microsoft Research Jan Vitek, Purdue University From ng13@mcs.le.ac.uk Thu Dec 6 12:25:43 2001 From: ng13@mcs.le.ac.uk (N Ghani) Date: Thu, 06 Dec 2001 12:25:43 +0000 Subject: Rewriting Implementations Message-ID: <200112061225.fB6CPgD24023@ithaca.mcs.le.ac.uk> Is there any Haskell implementations of rewriting tools. This could be any of string, term, equational or whatever forms of rewriting. Also are there any Haskell packages including data structures for algebriac objects like monoids, groups, rings, modules, graphs, categories, enriched categories, K-algebras (ie monoids in K-modules), kan extensions .... Finally, are there any haskell packages for computing quotients of such structures (perhpas using rewriting) Neil From herrmann@infosun.fmi.uni-passau.de Thu Dec 6 19:19:02 2001 From: herrmann@infosun.fmi.uni-passau.de (Ch. A. Herrmann) Date: Thu, 6 Dec 2001 20:19:02 +0100 Subject: Strict foldl Message-ID: <15375.50342.279681.360674@reger.fmi.uni-passau.de> Hi Haskellers, which compiler settings do I have to pass to ghc-5.02 in order to achieve that the strictness analyzer recognizes strictness of (+) in foldl and computes sum in constant space? Prelude> sum [1..10000000] had the following effect: PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 23542 herrmann 20 0 250M 130M 97500 R 66.3 52.4 0:21 ghc-5.02 Of course, one could define a strict foldl oneself: > sfoldl f e [] = e > sfoldl f e (x:xs) = (sfoldl f $! (f e x)) xs ( > sfoldl (+) 0 [1..10000000] returns 50000005000000 in about a minute interpreted using 18MB of total space.) But with the own definition one has to redefine many of the prelude functions. Thanks in advance -- Christoph Herrmann From hdaume@ISI.EDU Thu Dec 6 19:19:31 2001 From: hdaume@ISI.EDU (Hal Daume III) Date: Thu, 6 Dec 2001 11:19:31 -0800 (PST) Subject: class parameters to existential datatypes Message-ID: Hi, I would like to be able to write something like this: > data Foo c = forall a . c a => Foo a Unfortunately, this isn't allowed (apparently) because it's an illegal class assertion (or at least that's what ghc tells me). My motivation for doing this is I want to have something like List, but a class list where all you know is that every element is a member of some class. I would write something like: > data CList c = CNil > | forall a . (c a) => CCons a (CList c) that way I could have something like the prototypical: > class Shape a where { area :: a -> Double } > data Circle = Circle Double > data Rectangle = Rectangle Double Double > instance Shape Circle where { area (Circle r) = 2 * pi * r } > instance Shape Rectangle where { area (Rectangle l w) = l*w } > MyList :: CList Shape > MyList = CCons (Circle 5) (CCons (Rectangle 2 3) CNil) and then maybe have a function: > totalArea :: (CList Shape) -> Double > totalArea = sum . map area obviously this function declaration is also invalid. so I have two questions: 1) Is there any particular reason whey we can't do this (it would break some type safety things or whatever) 2) Any ways to get around it? Thanks! - Hal From rjmh@cs.chalmers.se Thu Dec 6 21:04:46 2001 From: rjmh@cs.chalmers.se (John Hughes) Date: Thu, 6 Dec 2001 22:04:46 +0100 (MET) Subject: class parameters to existential datatypes Message-ID: <200112062104.WAA11520@hotlips.cs.chalmers.se> I would like to be able to write something like this: > data Foo c = forall a . c a => Foo a Unfortunately, this isn't allowed (apparently) because it's an illegal class assertion (or at least that's what ghc tells me). ... so I have two questions: 1) Is there any particular reason whey we can't do this (it would break some type safety things or whatever) 2) Any ways to get around it? Thanks! - Hal Hmm. Interesting. I wrote a paper a couple of years ago, on "Restricted Data Types", which discusses among other things how to simulate abstraction over a class by abstraction over the corresponding dictionary type. You might find the technique useful. It's at http://www.cs.chalmers.se/~rjmh/Papers/restricted-datatypes.ps John Hughes From ashley@semantic.org Thu Dec 6 21:11:07 2001 From: ashley@semantic.org (Ashley Yakeley) Date: Thu, 6 Dec 2001 13:11:07 -0800 Subject: class parameters to existential datatypes Message-ID: <200112062111.NAA02412@mail4.halcyon.com> At 2001-12-06 13:04, John Hughes wrote: > > data Foo c = forall a . c a => Foo a What are you trying to say? In 'data Foo c' you are saying that c is a type (as a parameter). In 'c a =>' you are saying that c is a class. So naturally Haskell complains. -- Ashley Yakeley, Seattle WA From ashley@semantic.org Thu Dec 6 21:12:59 2001 From: ashley@semantic.org (Ashley Yakeley) Date: Thu, 6 Dec 2001 13:12:59 -0800 Subject: class parameters to existential datatypes Message-ID: <200112062112.NAA02509@mail4.halcyon.com> At 2001-12-06 13:11, Ashley Yakeley wrote: >At 2001-12-06 13:04, John Hughes wrote: > >> > data Foo c = forall a . c a => Foo a > >What are you trying to say? In 'data Foo c' you are saying that c is a >type (as a parameter). In 'c a =>' you are saying that c is a class. So >naturally Haskell complains. I'm sorry, I'm not paying attention today... -- Ashley Yakeley, Seattle WA From chak@cse.unsw.edu.au Thu Dec 6 23:34:40 2001 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Fri, 07 Dec 2001 10:34:40 +1100 Subject: Strict foldl In-Reply-To: <15375.50342.279681.360674@reger.fmi.uni-passau.de> References: <15375.50342.279681.360674@reger.fmi.uni-passau.de> Message-ID: <20011207103440M.chak@cse.unsw.edu.au> "Ch. A. Herrmann" wrote, > which compiler settings do I have to pass to ghc-5.02 > in order to achieve that the strictness analyzer > recognizes strictness of (+) in foldl and computes > sum in constant space? > > Prelude> sum [1..10000000] > > had the following effect: > > PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND > 23542 herrmann 20 0 250M 130M 97500 R 66.3 52.4 0:21 ghc-5.02 Is this what I think it is? Do you benchmark the interpreter? Interpreted code isn't optimised. When I compile main = print $ sum [1..10000000] with -O2, it takes 13s on a 600MHz P3 and runs in 1.5MB of space. Now, you may think that `sum' should have been compiled optimised in the Prelude and you just call this optimised version from the interpreter. However, this reasoning is flawed for a number of reasons (one being that you won't make use of specialised versions of Prelude functions in this way). > Of course, one could define a strict foldl oneself: > > > sfoldl f e [] = e > > sfoldl f e (x:xs) = (sfoldl f $! (f e x)) xs > > ( > sfoldl (+) 0 [1..10000000] > returns 50000005000000 in about a minute interpreted > using 18MB of total space.) > > But with the own definition one has to redefine many of the prelude functions. GHC's Prelude does not define `sum' in terms of foldl; instead, it uses the definition sum :: (Num a) => [a] -> a sum l = sum' l 0 where sum' [] a = a sum' (x:xs) a = sum' xs (a+x) The Prelude also defines a specialisation of the function for `Integer' (which is what you get in your example) by way of {-# SPECIALISE sum :: [Integer] -> Integer #-} I haven't checked the Core code produced for the above definition, but as I know GHC, I am pretty sure that it compiles the Prelude definition into a nice tight loop making use of all available strictness. Cheers, Manuel From hdaume@ISI.EDU Thu Dec 6 23:43:08 2001 From: hdaume@ISI.EDU (Hal Daume III) Date: Thu, 6 Dec 2001 15:43:08 -0800 (PST) Subject: Strict foldl In-Reply-To: <20011207103440M.chak@cse.unsw.edu.au> Message-ID: Hi, > Is this what I think it is? Do you benchmark the > interpreter? Interpreted code isn't optimised. When I > compile > > main = print $ sum [1..10000000] > > with -O2, it takes 13s on a 600MHz P3 and runs in 1.5MB of > space. Out of curiousity, why doesn't this get compiled down to main = print 50000005000000 ? That is, why doesn't the compiler carry out the calculation and then just embed that in the compiled version? I know that some C compilers do (at least somewhat) similar things when, for example, you say: x = y * 4 it will rewrite this as x = y << 2 and even do more complicated stuff, like if you say x = y * 12 it will give x = 3 * (y << 2) or whatnot. can I expect this from ghc/nhc/etc? - hal From chak@cse.unsw.edu.au Fri Dec 7 02:33:13 2001 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Fri, 07 Dec 2001 13:33:13 +1100 Subject: Strict foldl In-Reply-To: References: <20011207103440M.chak@cse.unsw.edu.au> Message-ID: <20011207133313X.chak@cse.unsw.edu.au> Hal Daume III wrote, > > Is this what I think it is? Do you benchmark the > > interpreter? Interpreted code isn't optimised. When I > > compile > > > > main = print $ sum [1..10000000] > > > > with -O2, it takes 13s on a 600MHz P3 and runs in 1.5MB of > > space. > > Out of curiousity, why doesn't this get compiled down to > > main = print 50000005000000 > > ? > > That is, why doesn't the compiler carry out the calculation and then just > embed that in the compiled version? Because the compiler can't be sure that the computation terminates. If it doesn't, the compiler would not terminate, which usually makes users quite unhappy ;-) > I know that some C compilers do (at least somewhat) similar things when, > for example, you say: > > x = y * 4 > > it will rewrite this as > > x = y << 2 > > and even do more complicated stuff, like if you say > > x = y * 12 > > it will give > > x = 3 * (y << 2) > > or whatnot. > > can I expect this from ghc/nhc/etc? These kinds of optimisations are different from the use of a Prelude function like `sum', because they don't affect the termination behaviour of the compiler. With -fvia-C GHC will generate C code that is, then, run through the C compiler. If you take this route, then optimisations, such as those you describe, are performed by the C compiler on your Haskell code. The natice code generator probably also performs some of those optimisations, but I am not sure exactly which. Cheers, Manuel From max630@mail.ru Fri Dec 7 02:45:11 2001 From: max630@mail.ru (Max A . K .) Date: Fri, 7 Dec 2001 08:45:11 +0600 Subject: class parameters to existential datatypes In-Reply-To: ; from hdaume@ISI.EDU on Thu, Dec 06, 2001 at 11:19:31AM -0800 References: Message-ID: <20011207084511.B1617@max.home> On Thu, Dec 06, 2001 at 11:19:31AM -0800, Hal Daume III wrote: > 2) Any ways to get around it? Is the following what you want? > data ShapeType = forall t. (Shape t) => ShapeType t > instance Shape ShapeType where { area (ShapeType a) = area a } > class Shape a where { area :: a -> Double } > data Circle = Circle Double > data Rectangle = Rectangle Double Double > instance Shape Circle where { area (Circle r) = 2 * pi * r } > instance Shape Rectangle where { area (Rectangle l w) = l*w } > myList :: [ShapeType] > myList = [ShapeType (Circle 5), ShapeType (Rectangle 2 3)] and then maybe have a function: > totalArea :: [ShapeType] -> Double > totalArea = sum . map area works OK with ghc -fglasgow-exts Max. From michael.vorin@eds.com Fri Dec 7 03:20:45 2001 From: michael.vorin@eds.com (Vorin, Michael) Date: Fri, 7 Dec 2001 13:20:45 +1000 Subject: Haskell Persistence Message-ID: <1D1A08E56535D111BD0400805F59041A03C14514@AUADM100> I am interested in pursuing practical development of persistence in Haskell. To this end I have been looking for code/systems which have been developed previously to build upon - not wishing to reinvent the wheel. I have found some references in the literature but have been enable to track down any "artefacts". I was hopping someone could help me. I have found: (1) Efficient Persistent Haskell, Tony Davie, Kevin Hammond, and Juan Quintela Division of Computer Science, University of St Andrews, 1998 (2) Models for Persistence in Lazy Functional Programming Systems, McNally, University of St Andrews, 1993. (3) A Functional Database (1989) (Correct) Phil Trinder (4) Two Models For Integrating Persistence and Lazy Functional Languages (1991) David J. McNally, Antony J.T. Davie (5) Realizing State-Based Database Concepts in a Non-Strict, Statically Typed, Purely Functional Persistent Programming Language Yoshihiko Ichikawa Department of Information Sciences, Ochanomizu University From trb@eastpac.com.au Fri Dec 7 04:02:35 2001 From: trb@eastpac.com.au (Tim Barbour) Date: Fri, 7 Dec 2001 15:02:35 +1100 (EST) Subject: Haskell Persistence In-Reply-To: <1D1A08E56535D111BD0400805F59041A03C14514@AUADM100> References: <1D1A08E56535D111BD0400805F59041A03C14514@AUADM100> Message-ID: <15376.16219.746147.59447@hermes.virtue> Vorin, Michael writes: > I am interested in pursuing practical development of persistence in Haskell. > To this end I have been looking for code/systems which have been developed > previously to build upon - not wishing to reinvent the wheel. I am implementing persistent memory for Linux (i.e. like virtual memory, but non-volatile, with ACID transaction semantics). Perhaps something will be working sometime in 2002. It is my hope that persistent memory will serve as a foundation for making functional data structures persistent, eventually leading towards a functional operating system. Tim -- "They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety." -- Benjamin Franklin From herrmann@infosun.fmi.uni-passau.de Fri Dec 7 09:34:05 2001 From: herrmann@infosun.fmi.uni-passau.de (Ch. A. Herrmann) Date: Fri, 7 Dec 2001 10:34:05 +0100 Subject: Strict foldl In-Reply-To: <20011207103440M.chak@cse.unsw.edu.au> References: <15375.50342.279681.360674@reger.fmi.uni-passau.de> <20011207103440M.chak@cse.unsw.edu.au> Message-ID: <15376.36109.341751.586793@reger.fmi.uni-passau.de> Hi Manuel, >> PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 23542 >> herrmann 20 0 250M 130M 97500 R 66.3 52.4 0:21 ghc-5.02 Manuel> Is this what I think it is? Do you benchmark the Manuel> interpreter? Interpreted code isn't optimised. not really. I wanted to have a strict foldl (for a different purpose than sum) and could not figure out how to tell the compiler. I tried different things, precompile just one module, compile the entire program, using -fglasgow-exts, but nothing seems to work. Thus, I reduced the problem to sum to make it simpler for you. However, the sum computation based on my sfold definition did not take too long even with the interpreter. Thus, I wondered why the predefined sum computation behaves that bad. Manuel> GHC's Prelude does not define `sum' in terms of foldl; Manuel> instead, it uses the definition ... Where can I find the ghc prelude? Is there also the definition of the mysterious foldl' function which I saw from time to time before it disappeared again? Manuel> I haven't checked the Core code produced for the above Manuel> definition, but as I know GHC, I am pretty sure that it Manuel> compiles the Prelude definition into a nice tight loop Manuel> making use of all available strictness. One would expect that ghci uses a compiled version of sum. Does it or not? Cheers -- Christoph From v-julsew@microsoft.com Fri Dec 7 10:03:13 2001 From: v-julsew@microsoft.com (Julian Seward (Intl Vendor)) Date: Fri, 7 Dec 2001 02:03:13 -0800 Subject: Strict foldl Message-ID: <68B95AA1648D1840AB0083CC63E57AD60F23D4@red-msg-06.redmond.corp.microsoft.com> | > Prelude> sum [1..10000000] | >=20 | > had the following effect: | >=20 | > PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND | > 23542 herrmann 20 0 250M 130M 97500 R 66.3 52.4 0:21 ghc-5.02 |=20 | Is this what I think it is? Do you benchmark the | interpreter? Interpreted code isn't optimised. When I | compile |=20 | main =3D print $ sum [1..10000000] |=20 | with -O2, it takes 13s on a 600MHz P3 and runs in 1.5MB of | space. I should point out that the interpreter's (byte-)code generator is simplistic, and does not emit code to stub (make NULL) stack slots=20 which are known to be dead. This is probably causing the=20 space behaviour you are seeing. In contrast the compiled-code back ends do do stack stubbing. If anyone wants to rewrite the byte code generator to keep track of stack slot liveness and emit suitable stub insns, that would be a service to us all :) [constant folding] | The natice code generator probably also performs some of | those optimisations, but I am not sure exactly which. Yes, it tries quite hard to fold literal trees and usually=20 succeeds well enough that the generated code is pretty much identical to that emitted by gcc. J From kort@science.uva.nl Fri Dec 7 11:05:20 2001 From: kort@science.uva.nl (Jan Kort) Date: Fri, 07 Dec 2001 12:05:20 +0100 Subject: Strict foldl References: <15375.50342.279681.360674@reger.fmi.uni-passau.de> Message-ID: <3C10A270.8D53744F@wins.uva.nl> "Ch. A. Herrmann" wrote: > > Hi Haskellers, > > which compiler settings do I have to pass to ghc-5.02 > in order to achieve that the strictness analyzer > recognizes strictness of (+) in foldl and computes > sum in constant space? > > Prelude> sum [1..10000000] > > had the following effect: > > PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND > 23542 herrmann 20 0 250M 130M 97500 R 66.3 52.4 0:21 ghc-5.02 > > Of course, one could define a strict foldl oneself: > > > sfoldl f e [] = e > > sfoldl f e (x:xs) = (sfoldl f $! (f e x)) xs There is a foldl' in the Hugs Prelude that does this: foldl' :: (a -> b -> a) -> a -> [b] -> a foldl' f a [] = a foldl' f a (x:xs) = (foldl' f $! f a x) xs There are some functions in the Hugs Prelude that use foldl (or foldl1) and some use foldl'. Maybe someone can explain why certain functions use foldl: reverse, maximum, minimum and readInt, while others use foldl': length, sum and product. I can understand why reverse would use foldl, but why do maximum, minimum and readInt use foldl ? Maybe the function foldl1 was based on foldl' at one time ? Jan From Pierre.Lescanne@ens-lyon.fr Fri Dec 7 12:59:00 2001 From: Pierre.Lescanne@ens-lyon.fr (Pierre Lescanne) Date: Fri, 7 Dec 2001 13:59:00 +0100 Subject: RTA 2002 - Call for Papers Message-ID: <15376.48404.703938.420647@tourblanche.ens-lyon.fr> RTA 2002 - Call for Papers The 13th International Conference on Rewriting Techniques and Applicati= ons RTA'02 will take place from July 22, 2002 to July 24, 2002 in Copenhage= n, Denmark, as part of the Federated Logic Conference FLoC'02. Topics RTA is the major forum for the presentation of research on all aspects = of rewriting. Typical areas include (but are not limited to): * Applications: case studies; rule-based programming; symbolic and algebraic computation; theorem proving; functional and logic programming; proof checking. * Foundations: matching and unification; completion techniques; strategies; constraint solving; explicit substitutions. * Frameworks: string, term, and graph rewriting; lambda-calculus and= higher-order rewriting; conditional rewriting; proof nets; constra= ined rewriting and deduction; categorical and infinitary rewriting. * Implementation: compilation techniques; parallel execution; rewrit= ing tools. * Semantics: equational logic; rewriting logic. Best Paper Award A prize of 500 EUR will be given to the best paper as judged by the pro= gram committee. The program committee may decline to make the award or may s= plit it among several papers. Submissions Submissions must be original and not submitted for publication elsewher= e. Submissions should fall into one of the following categories: 1. Regular research papers describing new results; they will be judged = on correctness and significance. 2. Papers describing the experience of applying rewriting techniques in= other areas; they will be judged on relevance and comparison with other= approaches. 3. Problem sets that provide realistic and interesting challenges in th= e field of rewriting. 4. System descriptions; they should contain a link to a working system = and will be judged on usefulness and design. All submissions will be judged on originality. Submissions in the first= three categories can be up to 15 proceedings pages long, system descrip= tions 4 proceedings pages. Authors are strongly encouraged to use LaTeX2e and= the Springer llncs class file, available at http://www.springer.de/comp/lncs/authors.html. The title page should in= clude the submission category. Proofs of theorems should be provided in the p= aper, or, if space does not permit, should be made accessible otherwise (e.g.= , as an appendix to the submission or via the Web). Submission is by email: = Send a self-contained postscript file to Proceedings Accepted papers will be published in the proceedings of the symposium (Lecture Notes in Computer Science, Springer-Verlag). Simultaneous submission to other conferences with published proceedings is not allow= ed. Important dates * Tue January 15, 2002 - paper submission * Fri March 22, 2002 - author notification * Thu April 25, 2002 - camera-ready papers due Program Committee * chair: Sophie Tison LIFL - Laboratoire d'Informatique Fondamentale de Lille URA CNRS 369 Universit=E9 de Lille 1 Cit=E9 Scientifique --- Bat. M3 59655 Villeneuve d'Ascq cedex, FRANCE +33 03 20 43 43 09 +33 03 20 43 47 24 (secretary) +33 03 20 43 45 66 (fax) * Andrea Corradini , Pisa * Daniel J. Dougherty , Wesleyan * J=FCrgen Giesl , Aachen U of Tech= nology * Bernhard Gramlich , Vienna U of Technology * Th=E9r=E8se Hardin , Paris VI * Christopher Lynch , Clarkson * Jerzy Marcinkowski , Wroclaw * Aart Middeldorp , Tsukuba * Joachim Niehren , Saarland * Femke van Raamsdonk , Vrije U of Amsterdam * Albert Rubio , Technical U of Catalonia * Ralf Treinen , Paris-Sud From alms@cin.ufpe.br Fri Dec 7 14:38:04 2001 From: alms@cin.ufpe.br (Andre Santos) Date: Fri, 07 Dec 2001 11:38:04 -0300 Subject: Haskell Persistence References: <1113DDB24D4A2841951BFDF86665EE19066593@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <3C10D44C.7060400@cin.ufpe.br> Hi, a paper describing what a student and I did is in http://www.cin.ufpe.br/~alms/ps/persiste.ps.gz . The idea was to have a class supporting the persistence operations (more in the style of serialization) and to have specific data structures to allow a quicker retrieval of the data ("Persistence Containers"). This is similar to what we have in some Object Oriented Databases. For the low level implementation we used the work on Binary I/O work of Wallace/Runciman. But in order to get more portability we reimplemented parts of it using Strings/Chars for I/O, which ended up very inneficient in Haskell. Some things that might help are: - better binary I/O and/or to interface with some low level existing persistence mechanism. - I believe a kind of reflection mechanism would make things much easier and more efficient to implement. Although automatic derivation of the instances helps. There are some other references in the paper. cheers, Andre. > | -----Original Message----- > | From: Vorin, Michael [mailto:michael.vorin@eds.com] > | Sent: 07 December 2001 03:21 > | To: haskell@haskell.org > | Subject: Haskell Persistence > | > | > | I am interested in pursuing practical development of > | persistence in Haskell. To this end I have been looking for > | code/systems which have been developed previously to build > | upon - not wishing to reinvent the wheel. > | > | I have found some references in the literature but have been > | enable to track down any "artefacts". > | > | I was hopping someone could help me. > | > | I have found: > | (1) Efficient Persistent Haskell, Tony Davie, Kevin Hammond, > | and Juan Quintela Division of Computer Science, University of > | St Andrews, 1998 > | > | (2) Models for Persistence in Lazy Functional Programming > | Systems, McNally, University of St Andrews, 1993. > | > | (3) A Functional Database (1989) (Correct) Phil Trinder > | > | (4) Two Models For Integrating Persistence and Lazy > | Functional Languages > | (1991) David J. McNally, Antony J.T. Davie > | > | (5) Realizing State-Based Database Concepts in a Non-Strict, > | Statically Typed, Purely Functional Persistent Programming > | Language Yoshihiko Ichikawa Department of Information > | Sciences, Ochanomizu University > | > | > | _______________________________________________ > | Haskell mailing list > | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell > | > From anatoli@yahoo.com Fri Dec 7 16:29:44 2001 From: anatoli@yahoo.com (anatoli) Date: Fri, 7 Dec 2001 08:29:44 -0800 (PST) Subject: class parameters to existential datatypes In-Reply-To: Message-ID: <20011207162944.61676.qmail@web14205.mail.yahoo.com> In similar cases I'm doing this: > module Shapes where > class Shape s where > area :: s -> Double > data Rectangle = Rectangle Double Double > data Circle = Circle Double > instance Shape Rectangle where > area (Rectangle l w) = l*w > instance Shape Circle where > area (Circle r) = 2*pi*r > data ShapeRef = forall shape . Shape shape => ShapeRef shape > instance Shape ShapeRef where > area (ShapeRef s) = area s Now, for a heterogeneous list of shapes I can use [ShapeRef]. The last three (== 2+N, where N is the number of methods in the class) lines of code form a repeating pattern. The situation is begging for a language feature! I propose the following syntax: > object ShapeRef of Shape :) --- Hal Daume III wrote: > Hi, > > I would like to be able to write something like this: > > > data Foo c = forall a . c a => Foo a > > Unfortunately, this isn't allowed (apparently) because it's an illegal > class assertion (or at least that's what ghc tells me). > > My motivation for doing this is I want to have something like List, but a > class list where all you know is that every element is a member of some > class. I would write something like: > > > data CList c = CNil > > | forall a . (c a) => CCons a (CList c) > > that way I could have something like the prototypical: > > > class Shape a where { area :: a -> Double } > > data Circle = Circle Double > > data Rectangle = Rectangle Double Double > > instance Shape Circle where { area (Circle r) = 2 * pi * r } > > instance Shape Rectangle where { area (Rectangle l w) = l*w } > > MyList :: CList Shape > > MyList = CCons (Circle 5) (CCons (Rectangle 2 3) CNil) > > and then maybe have a function: > > > totalArea :: (CList Shape) -> Double > > totalArea = sum . map area > > obviously this function declaration is also invalid. > > so I have two questions: > > 1) Is there any particular reason whey we can't do this (it would > break some type safety things or whatever) > 2) Any ways to get around it? > > Thanks! __________________________________________________ Do You Yahoo!? Send your FREE holiday greetings online! http://greetings.yahoo.com From info@tvcuddleblanket.com Fri Dec 7 16:08:34 2001 From: info@tvcuddleblanket.com (TV Cuddle Blanket) Date: 7 Dec 2001 16:08:34 -0000 Subject: TV Cuddle Blanket The gift everybody will want !!! Message-ID: <20011207160834.5038.qmail@net-logik.com> ------10077476423c10e9820565d Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Click the link to read the message. http://www.tvcuddleblanket.com/email//read_mail.php?c=7&u=6328 ------10077476423c10e9820565d Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit


Open this message in a new window ------10077476423c10e9820565d-- From icsmif@unisannio.it Fri Dec 7 17:19:51 2001 From: icsmif@unisannio.it (icsmif@unisannio.it) Date: Fri, 7 Dec 2001 18:19:51 +0100 (CET) Subject: Icsm 2002 Call for Papers Message-ID: <200112071719.fB7HJpr18309@unisannio.it> Dear Colleague I would like to invite you at the IEEE International Conference on Software Maintenance, 2002, and associated workshops: SCAM, WSE, and WESS next October 2002 in Montreal, Canada. Outstanding Keynotes such as Jon Pincus, Microsoft, Industrial and experience papers, reseach papers, tutorials, tool expositions, dissertation forum, workshops, panels, and other exciting activities have been planned. We hope that this CFP will be useful for your work. Please forward the following to anybody who you think may be interested. Our apologies if you received multiple copy of this. If you would like to be removed from our list please send an email to icsm2002.info@unisannio.it with REMOVE in the subject. ICSM2002 Giuliano Antoniol, Program CoChair Ira D. Baxter, Program CoChair ============================================================================ IEEE International Conference on Software Maintenance 2002 Sponsored by IEEE ICSM-2002, Montreal, Canada, 3-6 October 2002 http://www.icsm2002.org icsm2002.info@unisannio.it Call for Papers Theme: Maintaining distributed heterogeneous systems ICSM is the major international conference in the field of software and systems maintenance, evolution, and management. This year's theme elaborates on last year's theme of "systems and software evolution in the era of the internet". Standalone legacy applications of yesterday and novel applications using today's technologies are rapidly becoming integrated as part of enterprise-wide and industry-wide systems. The need for rapid integration has led to many distributed heterogeneous systems that are very challenging to maintain and evolve. ICSM 2002 will address these new scenarios and the major challenges on maintenance and evolution. The focus of the conference will be on the new challenges that heterogeneous systems pose for software maintenance, and the new opportunities for researchers and practitioners. A main goal of ICSM is to promote interaction between researchers and practitioners. ICSM 2002 will bring together researchers, practitioners, developers and users of tools, technology transfer experts, and project managers. Jon Pincus (Microsoft) will describe how Microsoft handles software enhancements. Other outstanding Keynote speakers are being arranged. Past conferences have had Parnas, Rombach, McCabe, and Jacobson. ICSM-2002 will offer technical presentations and demonstrations from academia and industry. We are particularly interested in exchanging concepts, prototypes, research ideas, and other results that could contribute to the academic arena and also benefit business and the industrial community. ICSM 2002 will be participatory, with working collaborative sessions and presentations of industry projects. The Conference will be held in conjunction with: WESS -- Workshop on Empirical Studies of Software Maintenance. SCAM -- Source Code Analysis and Manipulation WSE -- Workshop on WEBsite Evolution Topics of interest include but are not restricted to the following aspects of maintenance and evolution: - Methods and theories - Maintenance and/or productivity metrics - Organizational frameworks - Preventive maintenance - Design for maintenance - Tools and environments - Life cycle and process control - Models/methods for error prediction - User interface evolution - Commercial off-the-shelf (COTS) - Third party maintenance - Freeware and open source applications - Program comprehension - Software and system visualisation - Knowledge based systems - Measurement of software - Formal methods - Legal aspects and standards - Software reusability - Internet and distributed systems - Empirical studies - Testing and regression testing - Remote, tele-work - Version and configuration management - Processes and strategies - Management and organisation - Co-operative applications - Source code analysis and manipulation - Processes and strategies - Impact of new software practices - Programming languages - Reengineering and reverse engineering - Multimedia systems RESEARCH PAPERS: Research papers should describe original and significant work in the research and practice of software maintenance and evolution. Case studies, empirical research, and experiments are particularly welcome. We also welcome papers that present leading edge and novel ideas in maintenance. Papers must not exceed 5000 words (10 pages IEEE style) in length, in English. To encourage strong submissions a prize will be awarded for the "Best Paper as Submitted". This Prize is offered by John Wiley & Sons, the publishers of the Journal of Software Maintenance and Evolution. The Program Committee will select the winner and a formal presentation of the Prize will be made in Montreal at ICSM 2002. FAST TRACK PAPERS: Fast Track papers should describe on-going research activities, or summarize the experience in software maintenance and evolution. Papers must not exceed 4 pages, IEEE style, in length, in English. Accepted fast-track papers will be included in a dedicated section of the conference proceedings. DISSERTATION FORUM: We welcome submissions of young researchers that have delivered their dissertation (Masters or Ph.D.) in the last three years. An award will be issued for the best submission. Four page summaries of accepted dissertations will be included in the conference proceedings and a special forum section will be organised at the conference. INDUSTRIAL APPLICATIONS: Proposals for presentations of Industrial Applications are welcome. These can be state-of-the-art descriptions, experience reports and survey reports from real projects, industrial practices and models, or tool demonstrations. A dedicated sub-committee of the program committee will review Industrial Application proposals and a 1-page summary of accepted proposals will be included in the conference proceedings. TUTORIALS: Tutorials should present software maintenance and evolution topics of interest to practitioners. Tutorials may be full day or half-day in length. SUBMISSION STYLE: PDF and/or Postscript electronic submission only. Papers longer than 15 pages or 6000 words will be returned to the authors. Acceptance notification will occur June 1, 2002. IMPORTANT DATES Research Papers deadline: 15 Feb. 2002 mailto:icsm2002.full@unisannio.it Fast Track Papers deadline: 1 May 2002 mailto:icsm2002.short@unisannio.it Dissertation Forum deadline: 15 Febr. 2002 mailto:icsm2002.thesis@unisannio.it Industrial Applications deadline: 15 March 2002 mailto:icsm2002.industry@unisannio.it Tutorials deadline: 15 Feb. 2002 mailto:icsm2002.tutorial@unisannio.it From XxHackerabwehrxX@mail.com Sun Dec 9 02:22:37 2001 From: XxHackerabwehrxX@mail.com (XxHackerabwehrxX@mail.com) Date: Sat, 8 Dec 2001 19:22:37 -0700 (MST) Subject: Wichtig Message-ID: <200112090222.TAA0000028236@int.iwhm.com> Hi, wir unterlagen einem Angriff verantwortungsloser ausländischer Hacker, deshalb sind wir aus Sicherheitsgründen auf einen besseren Server umgezogen. Es kam zu kurzen Ausfällen, wir bitten Sie um Verständnis. Wir zeigen in der neuen Auflage der *Hackerschule*, wie Sie die teuren ***0190 Dialer*** umgehen und so die kostenpflichtigen (zB. Sex-) Angebote zum Nulltarif nutzen! Wir zeigen Ihnen wie Sie einen beliebigen (AOL, AIM, Yahoo usw.) Chatraum total kontrollieren und mit mehreren Namen on sind! Wir haben natürlich auch SMS Programme die funzen..;-) Natürlich bezahlen Sie noch immer alle SMS über Ihr Handy. Wie lange noch ????...den Code gibts hier: Sie kennen die Konten Ihres Nachbarn noch nicht?...;-) In Ihrem Postfach tummeln sich Sexanbieter? Wir zeigen Ihnen, wie Sie diese loswerden...:-) http://tip.nu/hackerabwehr Das gesammte Wissen und die Toolz der erfolgreichsten Hacker! Sie finden ständig in der *Hackerschule* Mailbomber, Nuker, Scanner, IRC-Bots, Trojaner (Netbus, BO, Sub7...), Handy-Sicherheits-Software (Sie wissen schon... falls ein "Sicherheits"-Code vergessen wurde.. ), Virii, Worms, Crack-Tools, Calling-Card-Generatoren, Creditcard-Tools, DoS-Tools, POD-Tools uvm... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ACHTUNG: Wir dürfen hier aus rechtlichen Gründen nicht alles nennen... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **WMHS** From marks@desertsurf.com Sat Dec 8 02:55:31 2001 From: marks@desertsurf.com (LIL DRIVER) Date: Sat, 08 Dec 2001 18:55:31 1600 Subject: Kid's Holiday Gift of the Year Message-ID: <1007866531.852@com> Golf Cart For Kids - The Lil Driver Golf Cart golf gift of the year

LIL DRIVER GOLF CART
"The Perfect Holiday Gift"
for the 3 to 7 year old golfer! 
Lil Driver golf cart features high-gloss finish on impact-resistant
plastic. The cart drives as good as it looks -- like the real thing!

Rechargeable battery operated, rugged chassis, tough wheels and tires, solid steel chromed axles and suspension, heavy duty motor and gearbox. Two to four hours drive time depending on the child's weight and driving surface.  Includes removable canopy, golf bag and clubs.

**Buy Direct**  $279. + $16. S&H
  
For Telephone Orders
Call: 760-345-4734
Reference # CA1101

  
"Seeing our granddaughter's smile while driving her Lil Driver Golf Cart was wonderful"
 Lee & Helen - La Quinta, CA

The Lil Driver Ride-On Golf Cart features a high-gloss finish on the impact-resistant plastic body. Luxurious features include the seat and back rest with side bars, fold over nylon sun shade canopy, a Velcro strap to hold the Golf Bag in place. The smooth steering-wheel's 3 buttons operates the horn, motor sound and music melodies. Chrome handlebar and drinking cup space on dash, the forward and reverse shifter on the dash, accelerator/brake pedal on the floor, front and rear bumpers and a new automatic safety out-off switch, the Lil Driver is precision built using quality materials throughout.
  
Engineered for years of trouble free driving, the Lil Driver features a rugged chassis, tough wheels and tires, solid steel-chromed axles and suspension, heavy duty motor and gearbox, and 2 to 4 hour driving time depending on the child's weight and driving surface. 10-12 hour recharge time puts this vehicle in a class of its' own.
  
The Lil Driver is virtually maintenance free as well. Just keep it clean with a damp cloth and plastic polish. To recharge the battery simply plug the charging cord into the rear receptacle after use. Children will enjoy years of driving fun and playing golf!

LIL DRIVER FAX ORDER FORM
Please Print and Fax Toll Free to (888) 969-0559
Reference # CA1101

  Number of Golf Carts @ $279 each:        _____
  Shipping :  STANDARD at $16 each car  _____   EXPRESS  at $28 each car _____
  
  Name:                            ____________________________
  
  Address:                        ____________________________
  
 
City, State, Zip:              ____________________________
  
 
Email Address:               ____________________________
  
 
Phone Number:              ____________________________
  
 
Credit Card Type:          ____________________________
  
 
Credit Card Name:         ____________________________
  
 
Credit Card Number:      ____________________________
  
 
Credit Card Expiration:   ____________________________
  
 
Sub Total:                                                          ________________

 
CA Sales Tax (CA Shipping destinations only):   ________________
  
 
Total amount authorized to be charged:               ________________

  Shipping Address (if different from billing address):
  
 
Name:                  _______________________________
  
 
Address:               _______________________________
  
 
City, State, Zip:     _______________________________
  
 
Phone Number:     _______________________________
 
  Card Holder Signature:   ________________________________________
 

From welcome" To be removed from this list simply reply with remove in the subject line. Dear Webmaster, Okay you have a great web site? Submitted to all of the search engines? Even hired some college kid to "promote" you to all of the FFA boards that nobody ever reads? If so I guess that you monthly site traffic is probably in the region of 10 to 100 visitors if you are lucky and you are feeling rather depressed - right? Well we have the definitive answer - we positively guarantee you high quality, genuine traffic to your web site. We make just one 100% guaranteed and solid promise to you - "WE WILL GET PEOPLE LOOKING AT YOUR WEB SITE WITHIN A MONTH - AND IF WE DON'T GET THE AMOUNT OF VISITORS TO YOU THAT WE PROMISE YOU CAN HAVE YOUR MONEY BACK - period" Take a few seconds to see what you get from TrafficFusion.Com The Ultimate Traffic Source ! http://www.trafficfusion.com This the one and only package of it's kind you will never find a more complete source to drive traffic to your web site and it is only being offered for a limited time! Here's What You'll Get: 1,000 Guaranteed Visitors every month for one full year! ($19.95 Value every Month!) 5,000 FREE Banner Impressions Guaranteed every month for one full year! ($24.95 Value every Month!) $500 in FREE Keywords on a Major Search Engine! (That's 50,000 targeted visitors) Free Submission of your Press Release to over 2,500 Media Sources Nationwide every month for one full year! (That's $249 Value!) E-Mail over 1,000,000 Opt-in subscribers daily! Spam Free! (That's a $199 monthly Value) That's a yearly Value of Over $3500 Yours for less than you pay for hosting every month!! You'll Also Get "Guaranteed Hits Secrets Exposed" This package shows you how to generate up to 1,000 hits per hour anytime you want to (and even shows you how to make that 1,000 hits equal even more!). You will have Full Resale Rights to resell the "Guaranteed Hits Secrets Exposed" for any price you choose! (This sells daily on eBay for $199) You'll Also Get: Instant Access To To 1,000's of Resources! Free multi-submission to 100,000's of sites; Instantly! 1000's of FREE reports, ebooks, tutorials and more! Dozens of FREE traffic building tools! Huge collection of home-based internet business links and resources! FREE software including submission utilities, FREE ebook compiler software, meta-tag optimization tools, etc.! Links to over 10,000 FREE ad sites including search engines, classifieds, ffa pages, etc.! FREE webmaster services such as link and html checkers, keyword utilities, doorway page generators, color and graphics tools, etc. FREE web graphics for your website including logo templates, borders & backgrounds, buttons, ebook graphics ,etc. Plus much more! http://www.trafficfusion.com If you are serious about the success of your site give us a shot! There will never be another opportunity to get such a complete promotional package! This is not a quick fix! We will deliver traffic to your site month after month! This is a Full 1 Year membership in our program! We are the traffic professionals! Thanks http://www.trafficfusion.com From igloo@earth.li Sun Dec 9 21:09:24 2001 From: igloo@earth.li (Ian Lynagh) Date: Sun, 9 Dec 2001 21:09:24 +0000 Subject: --+ not treated as a start of a comment In-Reply-To: <15379.52874.123770.335674@vatten.crt.se>; from feliks@crt.se on Sun, Dec 09, 2001 at 09:50:18PM +0100 References: <20011209184346.A18100@stu163.keble.ox.ac.uk> <15379.52874.123770.335674@vatten.crt.se> Message-ID: <20011209210924.A18851@stu163.keble.ox.ac.uk> On Sun, Dec 09, 2001 at 09:50:18PM +0100, Feliks Kluzniak wrote: > > > while the report (and hugs) believe "--+ 1" is a comment. > > If a bystander is allowed to comment... > > Actually, the newer versions of the report say you can use "--" to begin a legal > lexeme (Sec. 2.3, p. 6). Euch. Is --- the start of a comment? Either way the lexical syntax needs to be changed, either to comment -> dashes {any} newline dashes -> -- {-} or to comment -> dashes {any} newline dashes -> -- Thanks Ian From gramlich@logic.at Sat Dec 8 17:14:18 2001 From: gramlich@logic.at (Bernhard Gramlich) Date: Sat, 8 Dec 2001 18:14:18 +0100 (CET) Subject: CFP: WRS 2002 - 2nd WS on Reduction Strategies in Rewriting and Programming Message-ID: <15378.19050.57437.328858@alpha.logic.tuwien.ac.at> [Apologies for multiple copies of this announcement] ************************************************************************** *************** first call for papers and participation **************** ************************************************************************** Second International Workshop on Reduction Strategies in Rewriting and Programming (WRS 2002) http://www.dsic.upv.es/users/elp/WRS2002 held in conjunction with RTA 2002 Copenhagen, Denmark, July 21, 2002 -------------------------------------------------------------------------- BACKGROUND AND AIMS Reduction strategies in rewriting and programming have attracted an increasing attention within the last years. New types of reduction strategies have been invented and investigated, and new results on rewriting / computation under particular strategies have been obtained. Research in this field ranges from primarily theoretical questions about reduction strategies to very practical application and implementation issues. The need for a deeper understanding of reduction strategies in rewriting and programming, both in theory and practice, is obvious, since they bridge the gap between unrestricted general rewriting (computation) and (more deterministic) rewriting with particular strategies (programming). Moreover, reduction strategies provide a natural way to go from operational principles (e.g., graph and term rewriting, narrowing, lambda-calculus) and semantics (e.g., normalization, computation of values, infinitary normalization, head-normalization) to implementations of programming languages. Therefore any progress in this area is likely to be of interest not only to the rewriting community, but also to neighbouring fields like functional programming, functional-logic programming, and termination proofs of algorithms. The workshop wants to provide a forum for the presentation and discussion of new ideas and results, recent developments, new research directions, as well as of surveys on existing knowledge in this area. Furthermore we aim at fostering interaction and exchange between researchers and students actively working on such topics. The workshop will be held in conjunction with RTA 2002 in Copenhagen (Denmark) on July 21, 2002. The workshop is (co-)organized by TU Valencia and TU Wien. TOPICS OF INTEREST Topics of interest include, but are not restricted to, - theoretical foundations for the definition and semantic description of reduction strategies - strategies in different frameworks (term rewriting, graph rewriting, infinitary rewriting, lambda calculi, higher order rewriting and explicit substitutions, conditional rewriting, rewriting with built-ins, narrowing, constraint solving, etc.) and their application in (equational, functional, functional-logic) programming (languages) - properties of reduction strategies / computations under strategies (e.g., completeness, computability, decidability, complexity, optimality, (hyper-)normalization, cofinality, fairness, perpetuality, context-freeness, neededness, laziness, eagerness, strictness) - interrelations, combinations and applications of reduction under different strategies (e.g., equivalence conditions for fundamental properties like termination and confluence, applications in modularity analysis, connections between strategies of different frameworks, etc.) - program analysis and other semantics-based optimization techniques dealing with reduction strategies - rewrite systems / tools / implementations with flexible / programmable strategies as essential concept / ingredient - specification of reduction strategies in (real) languages - data structures and implementation techniques for reduction strategies. SUBMISSIONS We solicit papers on all aspects of reduction strategies in rewriting and programming. Submissions should describe unpublished work, except for survey papers which are explicitly welcome, too. Submissions should not exceed 10 pages (however, survey papers may be longer) and be sent in postscript format to the PC co-chairs to the following e-mail address: wrs02@dsic.upv.es before April 15, 2002. Submissions should include the title, authors' names, affiliations, addresses, and e-mail. Selection of papers by the PC will be based on originality, significance, and correctness. Accepted papers will be included in the workshop proceedings that will be available at the workshop, and electronically on the web. Final versions will be due by June 17, 2002. PUBLICATION Accepted papers will be included in the workshop proceedings that will be available at the workshop, and electronically on the web. A special issue of the Journal of Symbolic Computation on Reduction Strategies in Rewriting and Programming will be designated for revised and extended versions of selected contributions from both WRS 2001 (Utrecht, May 2001) and WRS 2002. PROGRAM COMMITTEE Sergio Antoy Portland (USA) Roberto Di Cosmo Paris VII (France) Bernhard Gramlich (co-chair) Wien (Austria) Michael Hanus Kiel (Germany) Claude Kirchner Nancy (France) Paul Klint CWI Amsterdam (The Netherlands) Salvador Lucas (co-chair) Valencia (Spain) Manfred Schmidt-Schauss Frankfurt am Main (Germany) Yoshihito Toyama Tohoku (Japan) ORGANIZERS Bernhard Gramlich (co-chair) Technische Universitaet Wien Salvador Lucas (co-chair) Universidad Politecnica de Valencia IMPORTANT DATES Deadline for submissions: April 15, 2002 Notification: May 27, 2002 Final versions due: June 17, 2002 Workshop: July 21, 2002 FURTHER INFORMATION WRS 2002 website: http://www.dsic.upv.es/users/elp/WRS2002 WRS 2002 e-mail address: wrs02@dsic.upv.es RTA 2002 website: http://www.ericsson.com/cslab/rta2002/ FLoC 2002 website: http://floc02.diku.dk WRS 2002 website at FLoC: http://floc02.diku.dk/WRS ************************************************************************** From ahey@iee.org Mon Dec 10 05:49:41 2001 From: ahey@iee.org (Adrian Hey) Date: Mon, 10 Dec 2001 05:49:41 +0000 Subject: Another question about sharing Message-ID: <01121005121200.01267@localhost.localdomain> Hello, If I have.. data Path = L Path | R Path | T paths = T : branch paths branch (p:ps) = L p : R p : branch ps This will be a CAF which can never be garbage collected, but may grow indefinitely large as it gets reduced. Correct? Is it possible to avoid this problem somehow? What I have in mind is a special thunk which get's copied (as a normal thunk) before it gets reduced. Pointer references are preserved during copying, except self referential pointers, which are updated to point to the new thunk. Alternatively.. I had thought maybe a function with a dummy argument like this would do.. paths x = let paths' = T : branch paths' in paths' But the paths' will just be lambda lifted as a CAF (I believe) This seems to solve the lambda lifting problem.. paths x = T : branch (paths x) but I'm not sure how compilers will treat this. I think I'll also loose the sharing of earilier paths in new paths, unless the compiler optimises the self reference. If I redefined my datatype.. data Path x = L (Path x) | R (Path x) | T x I could then use the function with dummy argument solution.. paths x = let paths' = T x : branch paths' in paths' This seems to solve both problems, but there's yet another problem I anticipate.. When using any of these dummy argument solutions I have to make sure the argument is not a constant (or I'm back to the lambda lifting problem again). So it has to be any handy unknown variable (argument)? This presents the problem that the unknown variable may itself be quite large, and have it's lifetime unduly prolonged because it's now referenced by many paths. Any advice? Thanks -- Adrian Hey From simonmar@microsoft.com Mon Dec 10 11:18:52 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 10 Dec 2001 11:18:52 -0000 Subject: Another question about sharing Message-ID: <9584A4A864BD8548932F2F88EB30D1C607AADBDB@TVP-MSG-01.europe.corp.microsoft.com> > If I have.. > data Path =3D L Path | R Path | T > paths =3D T : branch paths > branch (p:ps) =3D L p : R p : branch ps >=20 > This will be a CAF which can never be garbage collected, but > may grow indefinitely large as it gets reduced. Correct? GHC will collect the CAF when it can determine that it is no longer required. In GHCi, the CAF will only be collected if you turn on ':set +r', otherwise evaluated CAFs are retained between evaluations. Cheers, Simon From Malcolm.Wallace@cs.york.ac.uk Mon Dec 10 13:33:33 2001 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Mon, 10 Dec 2001 13:33:33 +0000 Subject: Another question about sharing In-Reply-To: <01121005121200.01267@localhost.localdomain> Message-ID: > If I have.. > data Path = L Path | R Path | T > paths = T : branch paths > branch (p:ps) = L p : R p : branch ps > > This will be a CAF which can never be garbage collected, but > may grow indefinitely large as it gets reduced. Correct? Any decent compiler will garbage collect the CAF when it is no longer needed. However, this does not solve the problem that the CAF could grow very large whilst its value is still required. Regards, Malcolm From ralf@informatik.uni-bonn.de Mon Dec 10 14:26:26 2001 From: ralf@informatik.uni-bonn.de (Ralf Hinze) Date: Mon, 10 Dec 2001 15:26:26 +0100 Subject: WAAAPL 2002, preliminary announcement Message-ID: <20011210142250.D19C770CBA@postfix.informatik.uni-bonn.de> Apologies if you receive multiple copies... ============================================================================ PRELIMINARY CALL FOR PAPERS [Deadline for submission: 3rd June 2002] WAAAPL 2002 Workshop on Algorithmic Aspects of Advanced Programming Languages Part of PLI'02 (approval pending) Pittsburgh, PA, USA date to be announced (probably Oct 7 or Oct 8, 2002) http://www.cs.uni-bonn.de/~ralf/waaapl02.{html,pdf,ps,dvi,txt} ============================================================================ 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: to be announced (probably Oct 7 or Oct 8, 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 accepted papers will be published as a University of Bonn technical report. 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 ============================================================================ From lhe@L4i.se Mon Dec 10 09:26:27 2001 From: lhe@L4i.se (Lars-Henrik Eriksson) Date: Mon, 10 Dec 2001 10:26:27 +0100 Subject: FME'2002, 2nd CFP Message-ID: apologies if you receive multiple copies... FORMAL METHODS EUROPE FME 2002 "Formal Methods: Getting IT Right" International Symposium and Tutorials http://floc02.diku.dk/FME/ 20-24 July 2002 Second Call for Papers ********************** =46ME 2002 is the eleventh in a series of symposia organised by Formal Methods Europe, an independent association whose aim is to stimulate the use of, and research on, formal methods for software development. These symposia have been notably successful in bringing together a community of users, researchers, and developers of precise mathematical methods for software development. In 2002 the symposium will be held in conjunction with the third Federated Logic Conference (FLoC'02) in Copenhagen, Denmark. The theme of FME 2002 is Formal Methods: Getting IT Right. The double meaning is intentional. On the one hand, the theme acknowledges the significant contribution formal methods can make to Information Technology, by enabling computer systems to be described precisely and reasoned about with rigour. On the other hand, it recognises that current formal methods are not perfect, and further research and practice are required to improve their foundations, applicability and effectiveness. =46ME seeks papers in all aspects of formal methods for computer systems, including the following: * theoretical foundations * practical use and case studies * specification and modelling techniques * software development and refinement * tool support and software engineering environments for formal methods * verification and validation * hidden formal methods, and making benefits available to non-experts * reusable domain theories * method integration * hardware verification In addition to presentations of submitted papers, the symposium will offer tutorials, workshops, invited speakers, and tool demonstrations. PAPERS =46ull papers should be submitted in Postscript or PDF format by e-mail to reach the Program Co-chairs by 15 January 2002. Papers will be refereed by the Program Committee and must be original research papers that have not been submitted elsewhere for publication. Accepted papers will be published in the symposium proceedings. Papers should not exceed twenty pages, although longer papers will be considered if their content justifies it. LNCS format should be used: see http://www.springer.de/comp/lncs/authors.html for details. Please include a short list of keywords on a separate line at the end of the abstract, beginning with the word "Keyword:" in boldface. OTHER SYMPOSIUM ACTIVITIES Tutorials and workshops will be held on 20-21 July 2002. Each tutorial will last one-half or one day. Proposals are welcome, and should be directed to the Program Co-chairs by 15 January 2002; more details will appear on the web-site above. Tool demonstrations will also take place during the symposium, with the opportunity for presentations to be made about each tool. Proposals for tool demonstrations should be made to the Tool Demonstration Coordinator, with whom provison of necessary computing facilities should be discussed. PEOPLE Organising Chair Dines Bj=F8rner Informatics and Mathematical Modelling Building 322, Richard Petersens Plads Technical University of Denmark DK-2800 Lyngby, Denmark Tel: +45 4525 3720 Email: db@imm.dtu.dk Programme Co-chairs Lars-Henrik Eriksson, Industrilogik L4i AB Box 6205, SE-102 34 Stockholm, Sweden Tel: +46 8 670 37 10 Fax: +46 8 32 12 82 Email: lhe@L4i.se Peter Lindsay, Software Verification Research Centre The University of Queensland, Queensland 4072, Australia Tel: +61 7 3365 2005 Fax: +61 7 3365 1533 Email: Peter.Lindsay@svrc.uq.edu.au Programme Committee Bernhard Aichernig Graz University of Technology, Austria Juan Bicarregui Rutherford Appleton Laboratory, UK Ernie Cohen Telcordia Technologies, USA Ben Di Vito NASA Langley Research Center, USA Cindy Eisner IBM Haifa Research Laboratory, Israel Lars-Henrik Eriksson (co-chair) Industrilogik, Sweden John Fitzgerald Transitive Technologies Ltd, UK Jim Grundy Intel Corporation, USA Yves Ledru LSR/IMAG, France Peter Lindsay (co-chair) University of Queensland, Australia Markus Montigel University of New Orleans, USA Richard Moore IFAD, Denmark Tobias Nipkow Technische Universit=E4t M=FCnchen, Germany Colin O'Halloran Qinetiq (ex-DERA), UK Jose Oliveira Universidade do Minho, Portugal Nico Plat West Consulting, The Netherlands Jeannette Wing Carnegie Mellon University, USA Jim Woodcock Oxford University, UK Joakim von Wright =C5bo Akademi University, Finland Pamela Zave AT&T Laboratories, USA Tool Demonstration Coordinator Paul Mukherjee The Institute of Applied Computer Sciense (IFAD) Forskerparken 10, DK-5230 Odense M, Denmark Tel: +45 6315 7131 Fax: +45 6593 2999 Email: paul.mukherjee@ifad.dk IMPORTANT DATES Submission of papers, tutorial proposals and workshop proposals: 15 January 2002 Notification of acceptance/rejection: 27 March 2002 Camera ready final version of papers due: 10 May 2002 l From ahey@iee.org Mon Dec 10 14:37:37 2001 From: ahey@iee.org (Adrian Hey) Date: Mon, 10 Dec 2001 14:37:37 +0000 Subject: Another question about sharing In-Reply-To: <9584A4A864BD8548932F2F88EB30D1C607AADBDB@TVP-MSG-01.europe.corp.microsoft.com> References: <9584A4A864BD8548932F2F88EB30D1C607AADBDB@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: <01121014205200.01052@localhost.localdomain> On Monday 10 December 2001 11:18 am, Simon Marlow wrote: > > If I have.. > > data Path = L Path | R Path | T > > paths = T : branch paths > > branch (p:ps) = L p : R p : branch ps > > > > This will be a CAF which can never be garbage collected, but > > may grow indefinitely large as it gets reduced. Correct? > > GHC will collect the CAF when it can determine that it is no longer > required. In GHCi, the CAF will only be collected if you turn on ':set > +r', otherwise evaluated CAFs are retained between evaluations. Thanks, I'm curious, how does GHC determine that the CAF is no longer required if it is referenced by code (somehow)? If code was also some kind of heap allocated data structure I guess this would be possible, but I thought this wasn't so with GHC. But in any case, I'm not sure this really helps me. I don't really mind if the unreduced form of the CAF is garbage collected or not (it's only going to be a few words of memory). The effect I'm trying to get is to ensure that the (partially) reduced form of the CAF only lives as long as any (non code) heap object which references it. Does that make sense? (probably not:-) This code was originally written in Clean, and the Clean designers addressed this problem by allowing the programmer to distinguish between constants and functions with no arguments. (The latter being a fragment of code which reconstructs the constant each time it's called, rather than having just one occurrence as a CAF.) It's typically used to inhibit sharing. I don't believe there is any such distinction in Haskell. I thought maybe there was a trick you could use in Haskell to achieve the same effect, but I don't think there is (unless I'm missing something). Regards -- Adrian Hey From simonmar@microsoft.com Mon Dec 10 14:49:56 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 10 Dec 2001 14:49:56 -0000 Subject: Another question about sharing Message-ID: <9584A4A864BD8548932F2F88EB30D1C607AADC72@TVP-MSG-01.europe.corp.microsoft.com> > I'm curious, how does GHC determine that the CAF is no longer required > if it is referenced by code (somehow)? If code was also some kind of > heap allocated data structure I guess this would be possible, but I > thought this wasn't so with GHC. GHC actually tracks references to top-level entities from code, so that the GC can trace the transitive closure of live code and hence find all the reachable CAFs. It's a real pain, but worth it. > But in any case, I'm not sure this really helps me. I don't really > mind if the unreduced form of the CAF is garbage collected or not > (it's only going to be a few words of memory). The effect I'm trying > to get is to ensure that the (partially) reduced form of the CAF only > lives as long as any (non code) heap object which references it. > Does that make sense? (probably not:-) If I understand correctly, that's the behaviour you'll get with GHC, and (I think) nhc98. Cheers, Simon From Malcolm.Wallace@cs.york.ac.uk Mon Dec 10 14:51:28 2001 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Mon, 10 Dec 2001 14:51:28 +0000 Subject: Another question about sharing In-Reply-To: <01121014205200.01052@localhost.localdomain> Message-ID: > > data Path = L Path | R Path | T > > paths = T : branch paths > > branch (p:ps) = L p : R p : branch ps > This code was originally written in Clean, and the Clean designers > addressed this problem by allowing the programmer to distinguish > between constants and functions with no arguments. (The latter > being a fragment of code which reconstructs the constant each time > it's called, rather than having just one occurrence as a CAF.) > It's typically used to inhibit sharing. > > I don't believe there is any such distinction in Haskell. > I thought maybe there was a trick you could use in Haskell to > achieve the same effect Well, how about the following little circular program? paths :: () -> [Path] paths () = let r = T : branch r in r As far as I can understand what you are looking for, I think this meets the bill. Every use of the expression `paths ()' will re-evaluate the infinite structure to the extent its context requires it, and the expanded value will be thrown away as soon as the value of this instance of `paths ()' is no longer required. Regards, Malcolm From simonmar@microsoft.com Mon Dec 10 15:04:06 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 10 Dec 2001 15:04:06 -0000 Subject: Another question about sharing Message-ID: <9584A4A864BD8548932F2F88EB30D1C607AADC79@TVP-MSG-01.europe.corp.microsoft.com> > Well, how about the following little circular program? >=20 > paths :: () -> [Path] > paths () =3D let r =3D T : branch r in r >=20 > As far as I can understand what you are looking for, I think=20 > this meets > the bill. Every use of the expression `paths ()' will re-evaluate > the infinite structure to the extent its context requires it, and the > expanded value will be thrown away as soon as the value of this > instance of `paths ()' is no longer required. You can't rely on adding dummy arguments to cause re-evaluation: full-laziness (enabled when optimisation is on in GHC) will do the opposite transformation. Cheers, Simon From Malcolm.Wallace@cs.york.ac.uk Mon Dec 10 15:13:35 2001 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Mon, 10 Dec 2001 15:13:35 +0000 Subject: Another question about sharing In-Reply-To: <9584A4A864BD8548932F2F88EB30D1C607AADC79@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: > You can't rely on adding dummy arguments to cause re-evaluation: > full-laziness (enabled when optimisation is on in GHC) will do the > opposite transformation. Well in this case, you may find it harder to claim that the full laziness transformation constitutes an `optimisation'. Maybe the GHC manual should have a section on "Flags for worsening the space behaviour of programs". :-) Seriously, would it be difficult to detect when performing this `optimisation' would introduce a CAF and perhaps back it out appropriately? Regards, Malcolm From simonmar@microsoft.com Mon Dec 10 15:32:48 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 10 Dec 2001 15:32:48 -0000 Subject: Another question about sharing Message-ID: <9584A4A864BD8548932F2F88EB30D1C607AADC8B@TVP-MSG-01.europe.corp.microsoft.com> > > You can't rely on adding dummy arguments to cause re-evaluation: > > full-laziness (enabled when optimisation is on in GHC) will do the > > opposite transformation. >=20 > Well in this case, you may find it harder to claim that the full > laziness transformation constitutes an `optimisation'. Maybe the > GHC manual should have a section on "Flags for worsening the space > behaviour of programs". :-) >=20 > Seriously, would it be difficult to detect when performing this > `optimisation' would introduce a CAF and perhaps back it out > appropriately? The problem isn't restricted to CAFs - full laziness always trades space for time. We found that it can be a large win in some cases: if repeated computation is replaced by sharing in an inner loop, then the gains can be dramatic. We didn't meet any cases where it caused space problems, so you get it by default[1] when optimisation is turned on in GHC. You can always disable it with -fno-full-laziness. Cheers, Simon [1] Actually what you get is almost-full-laziness: GHC won't split adjacent lambda abstractions if it finds it can float an expression past some of the lambdas but not all. From igloo@earth.li Mon Dec 10 16:34:47 2001 From: igloo@earth.li (Ian Lynagh) Date: Mon, 10 Dec 2001 16:34:47 +0000 Subject: Clarification of \begin{code} ... \end{code} stuff In-Reply-To: <20011210160327.A24481@stu163.keble.ox.ac.uk>; from igloo@earth.li on Mon, Dec 10, 2001 at 04:03:27PM +0000 References: <20011210160327.A24481@stu163.keble.ox.ac.uk> Message-ID: <20011210163447.A24643@stu163.keble.ox.ac.uk> On Mon, Dec 10, 2001 at 04:03:27PM +0000, Ian Lynagh wrote: > > In the thread "Literate scripts not handled correctly" Simon Marlow > said: > > > Yes, it looks like GHC's unlit program removes whitespace when looking > > for \begin{code}, but not for \end{code}. The report isn't explicit > > about whether whitespace is allowed on these lines, but I would tend to > > the view that it isn't. > > Can you please clarify this in the report [...] Here's an interesting snippet: \begin{code} foo = "hello\ \end{code}" \end{code} which nhc and hugs accept, GHC says "error in character literal". I think this is a good reason for at least non-whitespace to not be allowed on the \begin{code} and \end{code} lines (or rather, for lines with other non-whitespace on them not to be treated as such). Thanks Ian From simonpj@microsoft.com Tue Dec 11 09:15:17 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 11 Dec 2001 01:15:17 -0800 Subject: FW: Clarification of \begin{code} ... \end{code} stuff Message-ID: <1113DDB24D4A2841951BFDF86665EE190665BB@RED-MSG-10.redmond.corp.microsoft.com> > In the thread "Literate scripts not handled correctly" Simon Marlow > said: >=20 > > Yes, it looks like GHC's unlit program removes whitespace when=20 > > looking for \begin{code}, but not for \end{code}. The report isn't=20 > > explicit about whether whitespace is allowed on these lines, but I=20 > > would tend to the view that it isn't. >=20 > Can you please clarify this in the report [...] I'm sure the "\begin{code}" and "\end{code}" should be at the beginning of a line. Whether anything else should be allowed on that line is moot. Maybe not. What would the layout be for this? \begin{code} f x =3D x \end{code} On the other hand it would be painful if a block of code was omitted because of a trailing space on the \begin{code} line; an easy error. I therefore propose code starts on the line *following* a line beginning with \begin{code}. And similarly stops on a line beginning \end{code}. For Ian's snippet: \begin{code} foo =3D "hello\ \end{code}" \end{code} I think it's clear that the first \end{code} should be scanned as part of the string literal. Simon From simonpj@microsoft.com Tue Dec 11 09:37:05 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 11 Dec 2001 01:37:05 -0800 Subject: GCD Message-ID: <1113DDB24D4A2841951BFDF86665EE190665BD@RED-MSG-10.redmond.corp.microsoft.com> About the GCD operator, the Haskell Report currently says: "gcd x y is the greatest integer that divides both x and y.=20 lcm x y is the smallest positive integer that both x and y divide." Why does 'lcm' say 'positive' while 'gcd' does not? What is gcd -3 -6 Presumably 3, not -3. You could say that is obvious, since 3 > -3. So I propose to add "positive" to the gcd spec: gcd x y is the greatest POSITIVE integer=20 that divides both x and y.=20 I don't think that changes the specification in fact, but experience has led me to always check these things! Simon From herrmann@infosun.fmi.uni-passau.de Tue Dec 11 10:06:28 2001 From: herrmann@infosun.fmi.uni-passau.de (Ch. A. Herrmann) Date: Tue, 11 Dec 2001 11:06:28 +0100 Subject: GCD In-Reply-To: <1113DDB24D4A2841951BFDF86665EE190665BD@RED-MSG-10.redmond.corp.microsoft.com> References: <1113DDB24D4A2841951BFDF86665EE190665BD@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <15381.55972.799338.486379@reger.fmi.uni-passau.de> >>>>> "Simon" == Simon Peyton-Jones writes: Simon> gcd x y is the greatest POSITIVE integer that divides Simon> both x and y. Simon> I don't think that changes the specification in fact, but Simon> experience has led me to always check these things! I find it confusing to read a definition which contains redundant information. Instead, I'd suggest to add something like: "Note: this number is always positive" Cheers -- Christoph Herrmann From simonpj@microsoft.com Tue Dec 11 10:07:39 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 11 Dec 2001 02:07:39 -0800 Subject: Instance declarations and class exports Message-ID: <1113DDB24D4A2841951BFDF86665EE190665C2@RED-MSG-10.redmond.corp.microsoft.com> Folks, Iavor has made two excellent points, upon which I have been ruminating (and consulting). Consider module Foo( M.Ix( index ) ) where import qualified Ix as M( Ix ) import qualified Ix as T( index ) instance M.Ix MyType where index a =3D ... index v =3D ... -- A local declaration Notice that: * The Ix class is in scope as "M.Ix", but its index method is in scope ias "T.index". =20 * Nevertheless, it's 100% clear what we mean in the instance declaration * It's also 100% clear what we mean in the export list M.Ix( index ) (The report is currently silent about whether this is legal.) * These two situations are very similar, and should be=20 resolved in the same way * I think we all agree that it woudl be illegal to mention the 'range' method of the Ix class, either in the instance cecl, or in theexport list. Why? Because 'range' is not imported. I therefore want to propose: 1. "subordinate" names in export lists are always unqualified Thus, we can have M.Ix( index ), but not M.Ix( T.index ). 2. A subordinate name in an export list is legal if the entity (class operation or data constructor) is in scope in the module, regardless of whether it is in scope under a qualified or unqualified name. =20 (In the example, T.index.) 3. The exact same rule is used to determine whether the class method name on the LHS of an instance-decl binding is legal. This time I have implemented the rule first, and it seems fine. These are basically clarifications. Objections? Comments? I'd like to find a better wording for (2) above. Simon From drs@dmu.ac.uk Tue Dec 11 10:16:11 2001 From: drs@dmu.ac.uk (David Smallwood) Date: Tue, 11 Dec 2001 10:16:11 GMT Subject: haxml Message-ID: <200112111016.fBBAGBG00226@crazy-horse.cs.cse.dmu.ac.uk> Does anyone know of a mirror site where I can download the latest version of HaXml. (Connection to York is - and has been for a while - apparently down: ftp://ftp.cs.york.ac.uk/pub/haskell/HaXml/HaXml-1.02.tar.gz, that is) Many thanks d. -- David Smallwood Dept. of Computing Science De Montfort University The Gateway Leicester LE1 9BH, UK drs@dmu.ac.uk From john@repetae.net Tue Dec 11 10:17:18 2001 From: john@repetae.net (John Meacham) Date: Tue, 11 Dec 2001 02:17:18 -0800 Subject: GCD In-Reply-To: <15381.55972.799338.486379@reger.fmi.uni-passau.de>; from herrmann@infosun.fmi.uni-passau.de on Tue, Dec 11, 2001 at 11:06:28AM +0100 References: <1113DDB24D4A2841951BFDF86665EE190665BD@RED-MSG-10.redmond.corp.microsoft.com> <15381.55972.799338.486379@reger.fmi.uni-passau.de> Message-ID: <20011211021718.A1728@momenergy.repetae.net> On Tue, Dec 11, 2001 at 11:06:28AM +0100, Ch. A. Herrmann wrote: > >>>>> "Simon" == Simon Peyton-Jones writes: > Simon> gcd x y is the greatest POSITIVE integer that divides > Simon> both x and y. > > Simon> I don't think that changes the specification in fact, but > Simon> experience has led me to always check these things! > > I find it confusing to read a definition which contains redundant > information. Instead, I'd suggest to add something like: > > "Note: this number is always positive" yeah. I strongly agree with this wording. precision without confusion is a really nice feature in specifications. mainly i know that if i were to read the redundant version I would invariably spend several brain cycles trying to figure out why it isn't redundant, only to conclude that it is. John -- --------------------------------------------------------------------------- John Meacham - California Institute of Technology, Alum. - john@repetae.net --------------------------------------------------------------------------- From S.M.Kahrs@ukc.ac.uk Tue Dec 11 10:20:39 2001 From: S.M.Kahrs@ukc.ac.uk (S.M.Kahrs) Date: Tue, 11 Dec 2001 10:20:39 +0000 Subject: GCD Message-ID: The natural reading of 'greatest' is, of course, the greatest in the divisibility preorder (it's partial order on natural numbers but only a preorder on integers). Thus, gcd 0 0 =3D 0. 3 and -3 are equivalent in that preoder. Thus, an additional comment may be in order. Stefan From Malcolm.Wallace@cs.york.ac.uk Tue Dec 11 10:36:27 2001 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Tue, 11 Dec 2001 10:36:27 +0000 Subject: Instance declarations and class exports Message-ID: > I therefore want to propose: > > 1. "subordinate" names in export lists are always unqualified > Thus, we can have M.Ix( index ), but not M.Ix( T.index ). I don't see a compelling reason to outlaw the latter. We can permit the subordinate name to be unqualified, but why should we enforce it? Ditto for method names in instance decls. > I'd like to find a better wording for (2): > > 2. A subordinate name in an export list is legal if the entity (class > operation or data constructor) is in scope in the module, regardless > of whether it is in scope under a qualified or unqualified name. > (In the example, T.index.) Suggestion: A method name, constructor, or field name is permitted to be used unqualified in a subordinate position of an export list, iff the entity it refers to is in scope in the module, regardless of whether the name must be used qualified elsewhere in the module. There is a distinction between a subordinate name (e.g. the index method of Ix), and its use in a subordinate position (e.g. in Ix(index)). In the example, it would be perfectly legal to say module Foo( T.index ) where import qualified Ix as M( Ix ) import qualified Ix as T( index ) index v = ... -- A local declaration where the method name (but not its class) is re-exported. Regards, Malcolm From Keith.Wansbrough@cl.cam.ac.uk Tue Dec 11 10:42:55 2001 From: Keith.Wansbrough@cl.cam.ac.uk (Keith Wansbrough) Date: Tue, 11 Dec 2001 10:42:55 +0000 Subject: GCD In-Reply-To: Your message of "Tue, 11 Dec 2001 11:06:28 +0100." <15381.55972.799338.486379@reger.fmi.uni-passau.de> Message-ID: > Simon> gcd x y is the greatest POSITIVE integer that divides > Simon> both x and y. > > I find it confusing to read a definition which contains redundant > information. Instead, I'd suggest to add something like: > > "Note: this number is always positive" Or, perhaps easier on the eye, "gcd x y is the greatest (positive) integer that divides both x and y." --KW 8-) -- Keith Wansbrough http://www.cl.cam.ac.uk/users/kw217/ University of Cambridge Computer Laboratory. From simonpj@microsoft.com Tue Dec 11 11:02:37 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 11 Dec 2001 03:02:37 -0800 Subject: Instance declarations and class exports Message-ID: <1113DDB24D4A2841951BFDF86665EE190665C8@RED-MSG-10.redmond.corp.microsoft.com> | > 1. "subordinate" names in export lists are always=20 | unqualified Thus,=20 | > we can have M.Ix( index ), but not M.Ix( T.index ). |=20 | I don't see a compelling reason to outlaw the latter. We can=20 | permit the subordinate name to be unqualified, but why should=20 | we enforce it? Ditto for method names in instance decls. Allowing qualified names on the *lhs* of instance decls involves two new productions (qfunlhs, etc) that I have only just nuked. I sent mail about that some while ago, to see if anyone really thought we should keep it. Then, for export lists, the argument becomes one of uniformity=20 (with instance decls) and simplicity. It seems compelling enough to me. Thanks for your wording suggestions. Simon From mechvel@math.botik.ru Tue Dec 11 11:28:49 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Tue, 11 Dec 2001 14:28:49 +0300 Subject: gcd 0 0 Message-ID: People write about the Report definition of gcd x y as of greatest integer that divides x and y, and mention > gcd 0 0 = 0 But 2 also divides 0, because 2*0 = 0. Does the Report specify that gcd 0 0 is not defined? For an occasion: probably, it is better to specify this. ----------------- Serge Mechveliani mechvel@botik.ru From kentk@md.chalmers.se Tue Dec 11 16:10:59 2001 From: kentk@md.chalmers.se (Kent Karlsson) Date: Tue, 11 Dec 2001 17:10:59 +0100 Subject: GCD In-Reply-To: Message-ID: <000101c1825e$6ce26e80$b4e21081@chalmers95a69n> I don't think preorders of any kind should be involved here. Just the ordinary order on integers. No divisibility preorder (I'm not sure how that is even defined, so how it could be natural beats me), no absolute value. I find the unaltered text Simon quoted to be fine as is. But for those who like to be more precise (forgive the TeXese): % Most of you may wish to stop reading at this point. % I is the set of integers representable in the integral datatype. % result_I may return "overflow" or the argument, as appropriate. \begin{example}\atab $gcd_I : I \times I \rightarrow I \cup \{\overflow, \infinitary\}$ \end{example} \begin{example}\atab $gcd_I(x,y)$ \>$= result_I(\max\{v \in \ZZ ~~|~~ v|x $ and $v|y\})$\\ \> \>if $x,y \in I$ and ($x \neq 0$ or $y \neq 0$)\\ \>$= \infinitary(\posinf)$ \>if $x = 0$ and $y = 0$ \end{example} % There is no need to say "v>0" above, since there are always positive values in that % set, and max picks the largest/greatest one. 0 has all integer values except(!) 0 % as divisors. So for gcd 0 0 (maximum, supremum really, of the intersection of the two % sets of divisors) the result is really positive infinity, which should be the result % returned when representable (recommendable for Haskell's Integer datatype). gcd will % overflow for instances like gcd (minBound::Int) (minBound::Int). \begin{example}\atab\\ $lcm_I : I \times I \rightarrow I \cup \{\overflow\}$ \end{example} \begin{example}\atab $lcm_I(x,y)$ \>$= result_I(\min\{v \in \ZZ ~~|~~ x|v $ and $ y|v $ and $ v > 0\})$\\ \> \>if $x,y \in I$ and $x \neq 0$ and $y \neq 0$\\ \>$= 0$ \>if $x,y \in I$ and ($x = 0$ or $y = 0$) \end{example} % the "v>0" is needed here, since the set here would otherwise always contain % infinitely many negative values, and then minimum of that... Kind regards /kent k > -----Original Message----- > From: haskell-admin@haskell.org [mailto:haskell-admin@haskell.org]On > Behalf Of S.M.Kahrs > Sent: den 11 december 2001 11:21 > To: haskell@haskell.org > Subject: Re: GCD > > > The natural reading of 'greatest' is, of course, > the greatest in the divisibility preorder (it's partial order > on natural numbers but only a preorder on integers). > Thus, gcd 0 0 = 0. > > 3 and -3 are equivalent in that preoder. > > Thus, an additional comment may be in order. > > Stefan > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell From ger@tzi.de Tue Dec 11 17:18:31 2001 From: ger@tzi.de (George Russell) Date: Tue, 11 Dec 2001 18:18:31 +0100 Subject: gcd 0 0 Message-ID: <3C163FE7.15D7F3F3@tzi.de> S.D.Mechveliani wrote > Does the Report specify that gcd 0 0 is not defined? Yes. The Report definition says gcd :: (Integral a) => a -> a -> a gcd 0 0 = error "Prelude.gcd: gcd 0 0 is undefined" gcd x y = gcd' (abs x) (abs y) where gcd' x 0 = x gcd' x y = gcd' y (x `rem` y) On reflection, this is quite right. a divides b <=> there is an integer n with na = b. Thus any integer divides 0, and so the "greatest common divisor" would have to be the greatest integer, which is nonsense. Of course if you adopt Stephan Kahrs definition of "greatest", taken with respect to the partial order a<=b <=> a divides b, then gcd 0 0 = 0, because 0 is indeed the greatest integer in this ordering. Mathematically this makes sense, but it's not necessarily what people expect. From Alan@LCS.MIT.EDU Tue Dec 11 18:07:51 2001 From: Alan@LCS.MIT.EDU (Alan Bawden) Date: Tue, 11 Dec 2001 13:07:51 -0500 (EST) Subject: gcd 0 0 In-Reply-To: <3C163FE7.15D7F3F3@tzi.de> (message from George Russell on Tue, 11 Dec 2001 18:18:31 +0100) References: <3C163FE7.15D7F3F3@tzi.de> Message-ID: <11Dec2001.125247.Alan@LCS.MIT.EDU> From: George Russell Date: Tue, 11 Dec 2001 18:18:31 +0100 ... Yes. The Report definition says gcd :: (Integral a) => a -> a -> a gcd 0 0 = error "Prelude.gcd: gcd 0 0 is undefined" gcd x y = gcd' (abs x) (abs y) where gcd' x 0 = x gcd' x y = gcd' y (x `rem` y) On reflection, this is quite right. a divides b <=> there is an integer n with na = b. Thus any integer divides 0, and so the "greatest common divisor" would have to be the greatest integer, which is nonsense. Of course if you adopt Stephan Kahrs definition of "greatest", taken with respect to the partial order a<=b <=> a divides b, then gcd 0 0 = 0, because 0 is indeed the greatest integer in this ordering. Mathematically this makes sense, but it's not necessarily what people expect. If you take the point-of-view that gcd is actually an operation on ideals, then gcd(0, 0) is 0. I.e. define gcd(x, y) to be the smallest z >= 0 such that {m*x + n*y | m, n in Z} = {n*z | n in Z}. This is probably the most natural and general definition of gcd, and is, in fact, what many mathematicians would expect. Also, it is nice to be able to know that gcd(x, 0) = x for -all- x. From fstaylo@alpha.ncsc.mil Tue Dec 11 19:31:53 2001 From: fstaylo@alpha.ncsc.mil (Frank Seaton Taylor) Date: Tue, 11 Dec 2001 14:31:53 -0500 Subject: gcd 0 0 In-Reply-To: <11Dec2001.125247.Alan@LCS.MIT.EDU> Message-ID: <200112111935.OAA14617@orion.ncsc.mil> Folks, Let me chime in in favor of gcd(0,0) = 0 rather than undefined. On Tuesday, December 11, 2001, at 01:07 , Alan Bawden wrote: > Also, it is nice to be able to know that gcd(x, 0) = x for -all- x. Alan is in good company: 1. Steele in "Common Lisp: The Language" says the same thing. 2. Knuth in "The Art of Computer Programming" defines gcd(0,0)=0. ---Frank From igloo@earth.li Tue Dec 11 23:16:39 2001 From: igloo@earth.li (Ian Lynagh) Date: Tue, 11 Dec 2001 23:16:39 +0000 Subject: Layout rule (again) Message-ID: <20011211231639.A2444@stu163.keble.ox.ac.uk> I'm afraid it doesn't seem to be quite right yet :-( Consider instance Foo Maybe where foo = 5 => {4}instance Foo Maybe where {4}foo = 5 => {instance Foo Maybe where {}}foo = 5 The second {4} has meant there is no <4> to cause an implicit semicolon to be inserted. This can be fixed by changing L ({n}:ts) (m:ms) = { : (L ts (n:m:ms)) if n > m, (Note 1) = { : } : (L ts (m:ms)) otherwise to L ({n}:ts) (m:ms) = { : (L ts (n:m:ms)) if n > m, (Note 1) = { : } : (L (:ts) (m:ms)) otherwise Thanks Ian, having a bad day, predominantly due to the layout rule :-( From petersen@redhat.com Wed Dec 12 01:18:04 2001 From: petersen@redhat.com (Jens Petersen) Date: 12 Dec 2001 10:18:04 +0900 Subject: haxml In-Reply-To: <200112111016.fBBAGBG00226@crazy-horse.cs.cse.dmu.ac.uk> References: <200112111016.fBBAGBG00226@crazy-horse.cs.cse.dmu.ac.uk> Message-ID: David Smallwood writes: > Does anyone know of a mirror site where I can download the latest > version of HaXml. (Connection to York is - and has been for a > while - apparently down: ftp://ftp.cs.york.ac.uk/pub/haskell/HaXml/HaXml-1.02.tar.gz, that is) The above url seemed to work for me just now. Jens From chak@cse.unsw.edu.au Wed Dec 12 05:52:01 2001 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Wed, 12 Dec 2001 16:52:01 +1100 Subject: ANN: GHC 5.02.1 RPMs including xlib and HGL packages Message-ID: <20011212165201G.chak@cse.unsw.edu.au> The following might be of special interest to people who are using Paul Hudak's Haskell textbook for teaching and or study and would like to run the SOE graphics examples with GHC - or if you simply want to have an X-based graphics library for an application. GHC's source distribution contains the two library packages `xlib' and `HGL' (Alastair Reid's Haskell Graphics Library) as part of hslibs, which are not by default built and installed. For our local teaching needs at the University of New South Wales, we have produced a patched version of GHC 5.02.1 that includes the aforementioned libraries in a working form. Haskell modules can be compiled or linked against these libraries, by providing the command line options `-package xlib' and `-package HGL', respectively (or you can specify them using the :s command in the interpreter). RPM packages for x86 GNU/Linux based on glibc 2.2 (eg, RedHat 7.x) containing GHC 5.02.1 including the xlib and HGL packages are available as ftp://ftp.cse.unsw.edu.au/pub/users/chak/jibunmaki/i386/ghc-5.02.1-graphics.1.i386.rpm ftp://ftp.cse.unsw.edu.au/pub/users/chak/jibunmaki/i386/ghc-prof-5.02.1-graphics.1.i386.rpm ftp://ftp.cse.unsw.edu.au/pub/users/chak/jibunmaki/i386/ghc-doc-5.02.1-graphics.1.i386.rpm with the source RPM at ftp://ftp.cse.unsw.edu.au/pub/users/chak/jibunmaki/src/ghc-5.02.1-graphics.1.src.rpm The source RPM contains a patched source tar ball and build instructions in the form of an RPM .spec that may be used to build the packages for other Linux distributions and on other Unix systems. (NB: GreenCard need not be installed to build this package, as a throw-away version of GreenCard is included in the tar ball - ie, it is used in the build process, but not installed.) Cheers, Manuel From ahey@iee.org Wed Dec 12 07:47:44 2001 From: ahey@iee.org (Adrian Hey) Date: Wed, 12 Dec 2001 07:47:44 +0000 Subject: Another question about sharing In-Reply-To: <9584A4A864BD8548932F2F88EB30D1C607AADC8B@TVP-MSG-01.europe.corp.microsoft.com> References: <9584A4A864BD8548932F2F88EB30D1C607AADC8B@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: <01121207463700.03104@localhost.localdomain> On Monday 10 December 2001 3:32 pm, Simon Marlow wrote: > The problem isn't restricted to CAFs - full laziness always trades space > for time. We found that it can be a large win in some cases: if > repeated computation is replaced by sharing in an inner loop, then the > gains can be dramatic. We didn't meet any cases where it caused space > problems, so you get it by default[1] when optimisation is turned on in > GHC. You can always disable it with -fno-full-laziness. and Malcolm Wallace wrote: > Well, how about the following little circular program? >       paths :: () -> [Path] >       paths () = let r = T : branch r in r Just to be clear, (with GHC) if I compile a module with this flag, with a local definition of paths.. mkLUT def = where paths = T : branch paths then I'll get a new paths graph every time mkLUT is called? But the effect of this is local to the module, so if mkLUT is exported, any local use of (mkLUT def) where def is a constant will still give a CAF (containing paths) unless that module has also been compiled with -fno-full-laziness? If I'm not mistaken, I have essentially the same problem with Malcolms solution. (() is a constant.) I don't want to make too big an issue over this because it really isn't a show stopper for my purposes, but it would be nice if I could make (what I consider to be) a reasonably safe self contained library module. I.E. Doesn't contain or cause space leaks Is not GHC specific Doesn't require other modules which make use of it to be compiled with particular options. I wonder if those people who know more about formal semantics than I do might consider making the definition of the language less ambiguous wrt sharing and also (maybe) giving programmers more explicit control if they need it, as in Clean. BTW, I can't find any information re. -fno-full-laziness in the current GHC users guide. Is it a deprecated feature? If I try it in an OPTIONS pragma I discover that it's static. Does that mean it has to be applied to a whole program in any case? (I can't think of any other reason it can't be included in a source file). Regards -- Adrian Hey From mailinglist@fmeurope.org Mon Dec 10 12:18:22 2001 From: mailinglist@fmeurope.org (mailinglist@fmeurope.org) Date: Mon, 10 Dec 2001 13:18:22 +0100 Subject: FME 2002: 2nd call for papers Message-ID: <001401c18174$c56cb5f0$dcd22bc0@west.nl> apologies if you receive multiple copies... FORMAL METHODS EUROPE FME 2002 "Formal Methods: Getting IT Right" International Symposium and Tutorials http://floc02.diku.dk/FME/ 20-24 July 2002 Second Call for Papers ********************** FME 2002 is the eleventh in a series of symposia organised by Formal Methods Europe, an independent association whose aim is to stimulate the use of, and research on, formal methods for software development. These symposia have been notably successful in bringing together a community of users, researchers, and developers of precise mathematical methods for software development. In 2002 the symposium will be held in conjunction with the third Federated Logic Conference (FLoC'02) in Copenhagen, Denmark. The theme of FME 2002 is Formal Methods: Getting IT Right. The double meaning is intentional. On the one hand, the theme acknowledges the significant contribution formal methods can make to Information Technology, by enabling computer systems to be described precisely and reasoned about with rigour. On the other hand, it recognises that current formal methods are not perfect, and further research and practice are required to improve their foundations, applicability and effectiveness. FME seeks papers in all aspects of formal methods for computer systems, including the following: * theoretical foundations * practical use and case studies * specification and modelling techniques * software development and refinement * tool support and software engineering environments for formal methods * verification and validation * hidden formal methods, and making benefits available to non-experts * reusable domain theories * method integration * hardware verification In addition to presentations of submitted papers, the symposium will offer tutorials, workshops, invited speakers, and tool demonstrations. PAPERS Full papers should be submitted in Postscript or PDF format by e-mail to reach the Program Co-chairs by 15 January 2002. Papers will be refereed by the Program Committee and must be original research papers that have not been submitted elsewhere for publication. Accepted papers will be published in the symposium proceedings. Papers should not exceed twenty pages, although longer papers will be considered if their content justifies it. LNCS format should be used: see http://www.springer.de/comp/lncs/authors.html for details. Please include a short list of keywords on a separate line at the end of the abstract, beginning with the word "Keyword:" in boldface. OTHER SYMPOSIUM ACTIVITIES Tutorials and workshops will be held on 20-21 July 2002. Each tutorial will last one-half or one day. Proposals are welcome, and should be directed to the Program Co-chairs by 15 January 2002; more details will appear on the web-site above. Tool demonstrations will also take place during the symposium, with the opportunity for presentations to be made about each tool. Proposals for tool demonstrations should be made to the Tool Demonstration Coordinator, with whom provison of necessary computing facilities should be discussed. PEOPLE Organising Chair Dines Bjørner Informatics and Mathematical Modelling Building 322, Richard Petersens Plads Technical University of Denmark DK-2800 Lyngby, Denmark Tel: +45 4525 3720 Email: db@imm.dtu.dk Programme Co-chairs Lars-Henrik Eriksson, Industrilogik L4i AB Box 6205, SE-102 34 Stockholm, Sweden Tel: +46 8 670 37 10 Fax: +46 8 32 12 82 Email: lhe@L4i.se Peter Lindsay, Software Verification Research Centre The University of Queensland, Queensland 4072, Australia Tel: +61 7 3365 2005 Fax: +61 7 3365 1533 Email: Peter.Lindsay@svrc.uq.edu.au Programme Committee Bernhard Aichernig Graz University of Technology, Austria Juan Bicarregui Rutherford Appleton Laboratory, UK Ernie Cohen Telcordia Technologies, USA Ben Di Vito NASA Langley Research Center, USA Cindy Eisner IBM Haifa Research Laboratory, Israel Lars-Henrik Eriksson (co-chair) Industrilogik, Sweden John Fitzgerald Transitive Technologies Ltd, UK Jim Grundy Intel Corporation, USA Yves Ledru LSR/IMAG, France Peter Lindsay (co-chair) University of Queensland, Australia Markus Montigel University of New Orleans, USA Richard Moore IFAD, Denmark Tobias Nipkow Technische Universität München, Germany Colin O'Halloran Qinetiq (ex-DERA), UK Jose Oliveira Universidade do Minho, Portugal Nico Plat West Consulting, The Netherlands Jeannette Wing Carnegie Mellon University, USA Jim Woodcock Oxford University, UK Joakim von Wright Åbo Akademi University, Finland Pamela Zave AT&T Laboratories, USA Tool Demonstration Coordinator Paul Mukherjee The Institute of Applied Computer Sciense (IFAD) Forskerparken 10, DK-5230 Odense M, Denmark Tel: +45 6315 7131 Fax: +45 6593 2999 Email: paul.mukherjee@ifad.dk IMPORTANT DATES Submission of papers, tutorial proposals and workshop proposals: 15 January 2002 Notification of acceptance/rejection: 27 March 2002 Camera ready final version of papers due: 10 May 2002 l _______________________________________________ Mailinglist mailing list Mailinglist@fmeurope.org http://www.fmeurope.org/mailman/listinfo/mailinglist From chinwn@comp.nus.edu.sg Wed Dec 12 11:38:53 2001 From: chinwn@comp.nus.edu.sg (Chin Wei Ngan) Date: Wed, 12 Dec 2001 19:38:53 +0800 (GMT-8) Subject: CFP : ASIA-PEPM 2002 Message-ID: <200112121138.TAA20037@sunA.comp.nus.edu.sg> CALL FOR PAPERS ACM SIGPLAN ASIAN Symposium on Partial Evaluation and Semantics-Based Program Manipulation (ASIA-PEPM'02) Aizu, JAPAN, September 12-14 2002 (co-located with FLOPS2002) http://www.comp.nus.edu.sg/asia-pepm02 Submission deadline: 1st March 2002 The ASIA-PEPM'02 symposium will bring together researchers working in the areas of semantics-based program manipulation, partial evaluation, and program analysis. The symposium focuses on techniques, supporting theory, and applications for the analysis and manipulation of programs. Technical topics include, but are not limited to: * Program manipulation techniques: transformation, specialization, normalization, reflection, rewriting, run-time code generation, multi-level programming. * Program analysis techniques: abstract interpretation, static analysis, binding-time analysis, type-based analysis. * Related issues in language design and models of computation: imperative, functional, logical, constraint-based, object-oriented, parallel, concurrent, secure, domain-specific. * Programs as data objects: staging, meta-programming, incremental computation, mobility, tools and techniques, prototyping and debugging. * Applications: systems programming, scientific computing, embedded systems, graphics, security, model checking, compiler generation, compiler optimization, decompilation. Original results that bear on these and related topics are solicited. Papers investigating novel uses and applications of program manipulation are especially encouraged. Authors concerned about the appropriateness of a topic are welcome to consult with the program chair prior to submission. SUBMISSION INFORMATION Papers should be submitted electronically via the workshop's Web page. Exceptionally, submissions may be emailed to the program chair: asiapepm@comp.nus.edu.sg. Acceptable formats are PostScript or PDF, viewable by gv. Submissions should not exceed 5000 words, excluding bibliography and figures. Submitted papers will be judged on the basis of significance, relevance, correctness, originality, and clarity. They should clearly identify what has been accomplished and why it is significant. The work described should not have been previously published in a major forum. Authors must indicate if a closely related paper is also being considered for another conference or journal. The proceeding of the symposium will be published by ACM Press. A special issue of Higher-Order Symbolic Computation is also planned. LOCAL ARRANGEMENT Mizuhito Ogawa (NTT, Japan) GENERAL CHAIR Kenichi Asai (Ochanomizu University, Japan) PROGRAM CHAIR Wei-Ngan Chin (National University of Singapore, Singapore) PROGRAM COMMITTEE Manuel Chakravarty (University of New South Wales, Australia) Tyng-Ruey Chuang (Academia Sinica, Taiwan) Charles Consel (ENSEIRB, France) Oege de Moor (University of Oxford, UK) Masami Hagiya (University of Tokyo, Japan) Nevin Heintze (Agere Systems, USA) Neil Jones (Univ of Copenhagen, Denmark) Yanhong Annie Liu (SUNY at Stony Brook, USA) Atsushi Ohori (JAIST, Japan) Alberto Pettorossi (University of Roma, Italy) Simon Peyton Jones (Microsoft, UK) Carolyn Talcott (Stanford University, USA) Zhe Yang (University of Pennsylvania, USA) From olaf@cs.york.ac.uk Wed Dec 12 17:43:53 2001 From: olaf@cs.york.ac.uk (Olaf Chitil) Date: Wed, 12 Dec 2001 17:43:53 +0000 Subject: Functional Programming Languages in Education disappeared Message-ID: <3C179759.F9DC779E@cs.york.ac.uk> Christopher Milton informed me that the link from haskell.org to http://www.cs.kun.nl/fple/, the pages on Functional Programming Languages in Education is broken. In fact, the pages seem to have disappeared completely. I think that this is a pity. I believe the pages have not been updated already for a few years. I suppose the maintainers didn't get much feedback from users and hence finally gave up. I wonder if the maintainers would like to comment on this. Didn't the pages have quite a collection of teaching materials? Maybe there are volunteers who would keep this site going? 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 mechvel@math.botik.ru Thu Dec 13 09:53:32 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Thu, 13 Dec 2001 12:53:32 +0300 Subject: gcd 0 0 = 0 Message-ID: People write on gcd 0 0 : Alan Bawden > If you take the point-of-view that gcd is actually an operation on > ideals, then gcd(0, 0) is 0. I.e. define gcd(x, y) to be the smallest > z >= 0 such that {m*x + n*y | m, n in Z} = {n*z | n in Z}. This is > probably the most natural and general definition of gcd, and is, in fact, > what many mathematicians would expect. > > Also, it is nice to be able to know that gcd(x, 0) = x for -all- x. Frank Seaton Taylor writes T> Let me chime in in favor of gcd(0,0) = 0 rather than undefined. T> T> On Tuesday, December 11, 2001, at 01:07 , Alan Bawden wrote: T> T> > Also, it is nice to be able to know that gcd(x, 0) = x for -all- x. T> T> Alan is in good company: T> T> 1. Steele in "Common Lisp: The Language" says the same thing. T> T> 2. Knuth in "The Art of Computer Programming" defines gcd(0,0)=0. T> classic algebra All right. Let us try to investigate this. In such cases one should consult mathematics, not programming. So, let us ignore "Common Lisp ...". And Knuth is all right, I think. Further, the definintion > gcd(x, y) to be the smallest > z >= 0 such that {m*x + n*y | m, n in Z} = {n*z | n in Z} is not natural. In particular, how does it generalize to gcd X Y for polynomials in X, Y with rational coefficients? It is 1. And how would one obtain 1 = f*X + g*Y ? According to classic algebra (Kummer, I guess), gcd x y in (such and such) domain R is the least by inclusion principal ideal (g) that includes the ideal (x, y). Here (a1..an) = set of all combinations y1*a1 + .. + yn*an, yi from R. According to this definition, gcd (X) (Y) = (1) in polynomials, all right, and gcd n m :: Integer is (0) Because (0) is the least by inclusion principal ideal containing (0). And this also contradicts the part "greatest integer that divides ..." in recent Haskell specification. Probably, the best specification would be gcd n m :: Integer = if n == 0 && m == 0 then 0 else greatest integer that divides both n and m ----------------- Serge Mechveliani mechvel@botik.ru From frank@cc.gatech.edu Thu Dec 13 14:04:42 2001 From: frank@cc.gatech.edu (Frank Dellaert) Date: Thu, 13 Dec 2001 09:04:42 -0500 Subject: Integer Enum ? Message-ID: <005301c183df$1f34bc60$a21ccf82@cc.gatech.edu> This is a multi-part message in MIME format. ------=_NextPart_000_0050_01C183B5.340C38E0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi I'm not entirely clear how Integer can be an Enum instance. I thought = Integer was arbitrary size, while for the Enum class you need to define = a mapping from and to Int, which is bounded (in a machine dependent way, = even ?). I'm probably missing something obvious... Cheers Frank Dellaert ------=_NextPart_000_0050_01C183B5.340C38E0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi
I'm not entirely clear how Integer can = be an Enum=20 instance. I thought Integer was arbitrary size, while for the Enum class = you=20 need to define a mapping from and to Int, which is bounded (in a machine = dependent way, even ?). I'm probably missing something = obvious...
Cheers
Frank = Dellaert
------=_NextPart_000_0050_01C183B5.340C38E0-- From shae@www.webwitches.com Thu Dec 13 15:42:45 2001 From: shae@www.webwitches.com (Shae Erisson) Date: Thu, 13 Dec 2001 17:42:45 +0200 (EET) Subject: We need "Documentation" In-Reply-To: References: Message-ID: <20011213.174245.884009776.shae@www.webwitches.com> From: Tony Davie Subject: Re: We need "Documentation" (Was: Re: Integer to String Conversion?) Date: Tue, 4 Dec 2001 09:38:49 +0000 > >The material we have is simply lacking. What we need is a good tutorial and a > >comprehensive reference book. > > ... > > I suggest you look at http://www.haskell.org/bookshelf/, specifically > the section on > Papers available on the Web. This gives numerous tutorials and introductions. I agree with Eray, I tried to learn Haskell without any printed material, and failed. Once I had the Simon Thompson's "Craft of.." I was doing fine. I have an irc friend who would also like to learn Haskell, and who is blind. He uses a braille reader in the Linux console, but the electronically available Haskell documentation just isn't sufficient. I taught myself Python in about two weeks with the online Python tutorial, I think something similar for Haskell would greatly increase the number of Haskell users. ---- Shae Matijs Erisson - http://www.webwitches.com/~shae/ Rabid Linux/XEmacs User - MSOffice documents will be returned as LaTeX From hdaume@ISI.EDU Thu Dec 13 17:07:12 2001 From: hdaume@ISI.EDU (Hal Daume III) Date: Thu, 13 Dec 2001 09:07:12 -0800 (PST) Subject: We need "Documentation" In-Reply-To: <20011213.174245.884009776.shae@www.webwitches.com> Message-ID: > I taught myself Python in about two weeks with the online Python tutorial, I think something similar for Haskell would greatly increase the number of Haskell users. I'm not familiar with the Python tutorial, but the Java tutorial which resides at java.sun.com is pretty much the most highly praised thing I know about. If ever anyone has a Java question or is trying to learn Java, everyone I know simply tells them to read that. It takes about 10 minutes to get up and running (assuming some programming background). Where is the Python tutorial located and is it more-or-less the same as the Java one? Would anyone be interested in working on a similar thing for Haskell? - Hal From shae@www.webwitches.com Thu Dec 13 18:31:50 2001 From: shae@www.webwitches.com (Shae Erisson) Date: Thu, 13 Dec 2001 20:31:50 +0200 (EET) Subject: We need "Documentation" In-Reply-To: References: <20011213.174245.884009776.shae@www.webwitches.com> Message-ID: <20011213.203150.276755180.shae@www.webwitches.com> From: Hal Daume III Subject: Re: We need "Documentation" Date: Thu, 13 Dec 2001 09:07:12 -0800 (PST) > Where is the Python tutorial located and is it more-or-less the same as > the Java one? http://www.python.org/doc/current/tut/tut.html > Would anyone be interested in working on a similar thing for Haskell? me! I'd suggest a HaskellWiki page, since multiuser edits are low overhead there. ---- Shae Matijs Erisson - http://www.webwitches.com/~shae/ Rabid Linux/XEmacs User - MSOffice documents will be returned as LaTeX From hdaume@ISI.EDU Thu Dec 13 18:47:53 2001 From: hdaume@ISI.EDU (Hal Daume III) Date: Thu, 13 Dec 2001 10:47:53 -0800 (PST) Subject: We need "Documentation" In-Reply-To: <20011213.203150.276755180.shae@www.webwitches.com> Message-ID: I think we should move this off the mailing list. I'm willing to spear-head such an effort. Anyone who is interested in contributing, please email me. I'll compile a list of people and we can figure out what we want to do. - 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 Thu, 13 Dec 2001, Shae Erisson wrote: > From: Hal Daume III > Subject: Re: We need "Documentation" > Date: Thu, 13 Dec 2001 09:07:12 -0800 (PST) > > > Where is the Python tutorial located and is it more-or-less the same as > > the Java one? > > http://www.python.org/doc/current/tut/tut.html > > > Would anyone be interested in working on a similar thing for Haskell? > > me! > I'd suggest a HaskellWiki page, since multiuser edits are low overhead there. > ---- > Shae Matijs Erisson - http://www.webwitches.com/~shae/ > Rabid Linux/XEmacs User - MSOffice documents will be returned as LaTeX > From pat@jantar.org Fri Dec 14 00:39:56 2001 From: pat@jantar.org (Patryk Zadarnowski) Date: Fri, 14 Dec 2001 11:39:56 +1100 (EST) Subject: Typesetting literate scripts in TeX Message-ID: <20011214.113956.74747160.pat@jantar.org> Recently I've hacked up a (yet another) TeX package for typesetting literate scripts in TeX, which, I think belongs in http://haskell.org/libraries/#tex". What's different about lambdaTeX is that it is not a cumbersome preprocessor, but a full TeX program (an almost-complete Haskell lexical analyzer written entirely in plain TeX ;-) which typesets Bird-style literate scripts _directly_. The output looks much like the code from Chris Okasaki's book "Purely Functional Data Structures", doing syntax highlighting and converting ASCII art such as "->" or "alpha" to proper mathematical symbols. It should work with both LaTeX and plain TeX, and it does its magic without any annotations, directly on the source code (the only thing that you will probably want to do is add \input lambdaTeX at the top of your source file, and manually typeset your literate comments so they look as good as the source code ;-) I've got a rudimentary web page for it at http://www.jantar.org/lambdaTeX/ with examples and a summary of features. If you have any comments or suggestions, I wouldn't mind hearing them. Enjoy. Pat. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Patryk Zadarnowski University of New South Wales School of Computer Science and Engineering -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- From Alan@LCS.MIT.EDU Fri Dec 14 03:55:31 2001 From: Alan@LCS.MIT.EDU (Alan Bawden) Date: Thu, 13 Dec 2001 22:55:31 -0500 (EST) Subject: gcd 0 0 = 0 In-Reply-To: (mechvel@math.botik.ru) References: Message-ID: <13Dec2001.210227.Alan@LCS.MIT.EDU> From: "S.D.Mechveliani" Date: Thu, 13 Dec 2001 12:53:32 +0300 Further, the definintion > gcd(x, y) to be the smallest > z >= 0 such that {m*x + n*y | m, n in Z} = {n*z | n in Z} is not natural. In particular, how does it generalize to gcd X Y for polynomials in X, Y with rational coefficients? Well, that -is- the way gcd is defined in the commutative algebra textbook I used in graduate school -- I just specialized the definition for the case of the ring of integers, and so I didn't mention that Z was a principle ideal domain. Polynomials in two variables aren't a PID, so yes, you'd have to restore some things I left out. When I said my definition was "general" I suppose I should have anticipated someone would generalize in a way I hadn't intended... (Actually, that definition doesn't even generalize exactly to the Gaussian Integers, where "z >= 0" would have to be replaced by some specification of a region of the complex plane.) ... Probably, the best specification would be gcd n m :: Integer = if n == 0 && m == 0 then 0 else greatest integer that divides both n and m Fortunately, we all seem to agree on what the actual definition should be. I did make a mistake in my previous message. I said that it was nice that gcd(0, x) = x for all x. I should have said: gcd(0, x) = abs(x). From simonpj@microsoft.com Fri Dec 14 09:18:56 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 14 Dec 2001 01:18:56 -0800 Subject: gcd 0 0 = 0 Message-ID: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com> | Probably, the best specification would be |=20 | gcd n m :: Integer =3D if n =3D=3D 0 && m =3D=3D 0 then 0 | else | greatest integer that divides both n and m Well, thank you all those that have contributed. My original point was simply to say greatest (positive) integer that divides both n and m but debate seems to have swirled round whether (gcd 0 0) should be 0 or an error. Currently in H98 it's an error; but it is the kind=20 of thing I'm willing to change IF there is a consensus, because it will only make more programs work. Is there a consensus that such a change would be desirable? If someone could write a sentence or two to explain why gcd 0 0 =3D 0, (ideally, brief ones I can put in the report by way of explanation), I think that might help those of us who have not followed the details of the discussion. =20 Simon From dongen@cs.ucc.ie Fri Dec 14 12:38:58 2001 From: dongen@cs.ucc.ie (Marc van Dongen) Date: Fri, 14 Dec 2001 12:38:58 +0000 Subject: gcd 0 0 = 0 In-Reply-To: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com>; from simonpj@microsoft.com on Fri, Dec 14, 2001 at 01:18:56AM -0800 References: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <20011214123858.J21918@cs.ucc.ie> Simon Peyton Jones (simonpj@microsoft.com) wrote: : If someone could write a sentence or two to explain why gcd 0 0 = 0, : (ideally, brief ones I can put in the report by way of explanation), : I think that might help those of us who have not followed the details : of the discussion. Division in the context of gcds (of integers) is usually defined along the lines of: An integer $a$ divides integer $b$ if there exists an integer $c$ such that $a c= b$. Note that here division is a *relation* an not a *function*/*operator*. Given the definition of division being a relation it makes perfect sense to say that $0$ divides $0$ which is why gcd 0 0 = 0; and gcd 0 0 /= error "Blah" The gcd of two integers is usually defined as a non-negative number to make it unique. HTH. PS: I am strongly in favour of gcd 0 0 = 0. Regards, Marc van Dongen From qrczak@knm.org.pl Fri Dec 14 21:00:13 2001 From: qrczak@knm.org.pl (Marcin 'Qrczak' Kowalczyk) Date: Fri, 14 Dec 2001 22:00:13 +0100 Subject: Typesetting literate scripts in TeX Message-ID: <20011214210013.GA19310@qrnik.zagroda> > Recently I've hacked up a (yet another) TeX package for typesetting > literate scripts in TeX Cool! I will use it in my thesis. One bug: a line can be broken between an inline code and a comma which immediately follows it. -- __("< Marcin Kowalczyk * qrczak@knm.org.pl http://qrczak.ids.net.pl/ \__/ ^^ QRCZAK From igloo@earth.li Fri Dec 14 21:28:30 2001 From: igloo@earth.li (Ian Lynagh) Date: Fri, 14 Dec 2001 21:28:30 +0000 Subject: Confused about default Message-ID: <20011214212830.A25845@stu163.keble.ox.ac.uk> Hi all I am rather confused about default. In section 4.3.4 the report says "each ti must be a monotype for which Num ti holds" but according to grep this is the only place "monotype" appears in the report. If I have the module module TT (Foo(..)) where default (Foo, [Foo], Foo -> Int) data Foo = Foo deriving (Eq, Show) instance Num Foo where {} instance (Eq a, Show a) => Num [a] where {} instance Eq (a -> b) where {} instance Show (a -> b) where {} instance Num (a -> b) where {} then hugs accepts it and TT> 5 Program error: Undefined member: fromInteger ghc accepts it and TT> 5 5 nhc tells me Error when renaming:: Illegal type in default at 4:17 If I remove all the list and function stuff then hi says TT> 5 5 If I have a main = putStrLn $ show 5 then nhc gives me TT> main No default definition for class method fromInteger and ghci gives me Main> main *** Exception: TT.lhs:8: No instance nor default method for class operation PrelNum.fromInteger It seems to me that hugs is in the right with it's handling of 5, but I am not sure who is wrong with default ([Foo]) or (Foo -> Int). Finally, the context free grammar doesn't currently enforce the restriction that only one default declaration be given. Fixing it would make rather a mess, though. Ian From nordland@cse.ogi.edu Sat Dec 15 19:11:15 2001 From: nordland@cse.ogi.edu (Johan Nordlander) Date: Sat, 15 Dec 2001 11:11:15 -0800 Subject: ANNOUNCE: Hugs98 Christmas release Message-ID: <82E00FDE-F18F-11D5-ABD3-003065BDF7A4@cse.ogi.edu> ------------------------------------------------------------------------------ __ __ __ __ ____ ___ _________________________________________ || || || || || || ||__ Hugs 98: Based on the Haskell 98 standard ||___|| ||__|| ||__|| __|| Copyright (c) 1994-2001 ||---|| ___|| World Wide Web: http://haskell.org/hugs || || Report bugs to: hugs-bugs@haskell.org || || Version: Dec 2001 _________________________________________ ------------------------------------------------------------------------------ We are pleased to announce a new release of Hugs98, a Haskell interpreter and programming environment for developing cool Haskell programs. Sources and binaries are freely available on the World-Wide Web. The most important features of this new release are: - The incompatibilities between Hugs and the Haskell Graphics Library have been fixed, and binaries for the HGL are now available on the Hugs download page. - The missing standard libraries Directory, CPUTime, Time and Locale have been added along with a complete implementation of Haskell98 IO. - Hugs is now delivered with most of the hslibs libraries installed in the lib/exts/ directory. The added modules cover the Edison, Parsec, HaXml, QuickCheck, concurrent, monad, and html subdirectories of hslibs. - The :set option now refuses the user to set a module search path that doesn't contain the Prelude. This is to protect users from accidentally rendering their Hugs setups unusable, esp. so on Windows machines where the options are persisted to the Registry. - MacOS X is now one of the supported unix ports, with pre-built binaries available on the download page. - Experimental support is provided for hierarchical module names, where a module name A.B.C is mapped onto the file path A/B/C{.hs,.lhs} and appended to each of the path prefixes in HUGSPATH until the name of a readable file is found. Most reported bugs have also been fixed; however, some issues still remain. See the heading "Hugs Bugs & Features" on the Hugs web site for further information. Send email to hugs-users-request@haskell.org to join the hugs-users mailing list. Bug reports should be sent to hugs-bugs@haskell.org. Send email to hugs-bugs-request@haskell.org to subscribe to the hugs-bugs list. The home page for Hugs is at http://www.haskell.org/hugs. ------------------------------------------------------------------------------ The Hugs 98 system is Copyright (c) Mark P Jones, Alastair Reid, the Yale Haskell Group, and the Oregon Graduate Institute of Science and Technology, 1994-2001, All rights reserved. It is distributed as free software under the license in the file "License", which is included in the distribution. ------------------------------------------------------------------------------ From sof@galois.com Sat Dec 15 19:14:42 2001 From: sof@galois.com (Sigbjorn Finne) Date: Sat, 15 Dec 2001 11:14:42 -0800 Subject: Announce: Hugs Graphics Library Message-ID: <0a6501c1859c$c02fe040$4576fea9@sofbox> We are pleased to announce a new release of the Hugs Graphics Library, version 2.0.4. The Hugs Graphics Library gives the programmer access to the most interesting and portable parts of the Win32 and X11 library. The library is distributed as open source and is suitable for use in teaching and applications. This version is compatible with the December 2001 release of Hugs, but won't work with the February 2001 release. This version supports: * filled and unfilled 2-dimensional objects (text, lines, polygons, ellipses). * Bitmaps (Win32 version only, for now). * Control over text alignment, fonts, color. * Simple input events (keyboard, mouse, window resize) to support reactivity. * Timers and double-buffering to support simple animation. * Use of concurrency to avoid the usual inversion of the code associated with event-loop programming. * Multiple windows may be handled at one time. To keep the library simple and portable, the library makes no attempt to support: * User interface widgets (menus, toolbars, dialog boxes, etc.) * Palette manipulation and other advanced features. * Many kinds of input event. The library can be downloaded from: http://www.haskell.org/graphics/. Installation instructions are in graphics-2.0.4/Install. Bug reports should be sent to reid@cs.utah.edu Enjoy! From matth@mindspring.com Sat Dec 15 23:04:19 2001 From: matth@mindspring.com (Matt Harden) Date: Sat, 15 Dec 2001 17:04:19 -0600 Subject: Integer Enum ? References: <005301c183df$1f34bc60$a21ccf82@cc.gatech.edu> Message-ID: <3C1BD6F3.DF4E1FD3@mindspring.com> > Frank Dellaert wrote: > > Hi > I'm not entirely clear how Integer can be an Enum instance. I thought > Integer was arbitrary size, while for the Enum class you need to > define a mapping from and to Int, which is bounded (in a machine > dependent way, even ?). I'm probably missing something obvious... You're right to wonder about that. It's even worse than you thought. Float and Double are also Enum instances! IMHO, this is a wart in the Haskell definition. Enum is used for two purposes: to support the [x,y..z] syntactic sugar, and to define conversion to/from Int. I think everybody agrees that the [x,y..z] syntax should support Integers, so it has to be an instance of Enum. I suspect that for convenience, the fromEnum and toEnum functions were put in the class to allow easier definitions of new Enum instances for small bounded enumerations. It has the undesireable effect of forcing the implementer of an Enum instance to produce a mapping to/from Int even when it doesn't make any sense. My preference would be to define them as errors in that case; the Haskell Report does not. The Report defines fromEnum for Float and Double; it is silent on Integer, and the Ratio module in the Library Report defines fromEnum for Ratio. In all cases, the reports specify truncation to integer, and there is a comment that the conversion may overflow. Complex does not define an Enum instance, even though it would make sense to me to be able to write [0, 1:+2 .. 5:+10] or the like. I guess fromEnum for Complex, if it existed, would have to just "truncate" the imaginary part! Regarding the Integer instance, Hugs only issues errors on fromEnum x where x is out of range. GHC just returns the value modulo 2^32, or something like that. My advice is to just ignore fromEnum and toEnum for Integer, Float, Double, and Ratio, and, if you need to define your own Enum instance, just define some reasonable mapping to Int, and don't worry much about truncation and overflow... the Haskell designers didn't! :) Matt Harden P.S. I hope the Haskell designers don't take offense; in reality, they have nothing but my deepest respect! From Alan@LCS.MIT.EDU Sun Dec 16 07:34:05 2001 From: Alan@LCS.MIT.EDU (Alan Bawden) Date: Sun, 16 Dec 2001 02:34:05 -0500 (EST) Subject: gcd 0 0 = 0 In-Reply-To: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com> (simonpj@microsoft.com) References: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <15Dec2001.202504.Alan@LCS.MIT.EDU> From: "Simon Peyton-Jones" Date: Fri, 14 Dec 2001 01:18:56 -0800 ... If someone could write a sentence or two to explain why gcd 0 0 = 0, (ideally, brief ones I can put in the report by way of explanation), I think that might help those of us who have not followed the details of the discussion. Well, Serge and I have both offered variations on the real reason why mathematicians agree that gcd 0 0 = 0. I prefer my simpler specialized-for-integers version, but I suspect even that is more mathematics than you want. At the other extreme, you could follow Knuth and simply state: "it is convenient to set gcd(0, 0) = 0", but that seems a bit unconvincing. If I were in your shoes, I'd simply pass the buck to the authorities by saying something like: "Mathematicians agree that gcd(0, 0) = 0". Incidentally, somebody wrote here that Common Lisp defines `(gcd 0 0)' to be 0, but it looks to me like all the language definition really does is state that `(gcd)' (no arguments) is 0 because 0 "is an identity for this operation" (which is technically false, but never mind), from which it is natural for the reader to conclude that `(gcd 0 0)' must be 0. From mechvel@math.botik.ru Sun Dec 16 12:35:57 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Sun, 16 Dec 2001 15:35:57 +0300 Subject: gcd definition Message-ID: Simon Peyton-Jones writes > [..] > If someone could write a sentence or two to explain why gcd 0 0 = 0, > (ideally, brief ones I can put in the report by way of explanation), > I think that might help those of us who have not followed the details > of the discussion. Here it is. gcd n m :: Integer = if n == 0 && m == 0 then 0 else greatest integer that divides both n and m It is set so according to classic definition (by Pythago, Euclid ...) GCD x y = such g that divides both x and y and is a multiple of any g' that divides both x and y. In particular, GCD 0 0 :: Integer = 0 and can be nothing else. Because 0 divides 0 and divides nothing else, everything divides 0 (z*0 = 0). Other comments ------------------------------------------------- * People say, D.Knuth writes gcd 0 0 = 0 in his book. And he is a known mathematically reliable person. * Example. gcd 12 18 :: Integer = 6 or -6, because 6 divides 12 and 18, and any other such number divides 6. * The Haskell report says "greatest integer" for domain = Integer, and thus, chooses the sign `+' for the result. This choice is not a mistake and helps to write shorter programs. * All the above agrees with the modern generic theory of ideals (started in |XX by Kummer, Gauss, Lagrange) for any commutative domain R having the properties of (a /= 0, b /= 0 ==> a*b /= 0), existence of unique factorization to primes. According to it gcd x y = least by inclusion ideal of kind (g) that includes the ideal (x, y), where Ideal (a,b..c) =def= {x*a + y*b +..+ z*c | x,y..z <- R} - a subset in R. `includes` (as set) is a partial order on ideals, and it is true that (1) a divides b <==> (a) includes (b), (2) (a) includes (a). Specializing this definition to Integer, we obtain the source formula. ----------------- Serge Mechveliani mechvel@botik.ru From dongen@cs.ucc.ie Sun Dec 16 13:35:59 2001 From: dongen@cs.ucc.ie (Marc van Dongen) Date: Sun, 16 Dec 2001 13:35:59 +0000 Subject: gcd 0 0 = 0 In-Reply-To: <20011214123858.J21918@cs.ucc.ie>; from dongen@cs.ucc.ie on Fri, Dec 14, 2001 at 12:38:58PM +0000 References: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com> <20011214123858.J21918@cs.ucc.ie> Message-ID: <20011216133559.C27182@cs.ucc.ie> Marc van Dongen (dongen@cs.ucc.ie) wrote: : An integer $a$ divides integer $b$ if there exists an integer : $c$ such that $a c= b$. [snip] : gcd 0 0 = 0; and : gcd 0 0 /= error "Blah" To make clear why $0$ (and not any other non-zero integer) is the gcd of $0$ and $0$ I should have added that for the integer case $g$ is called a greatest common divisor (gcd) of $a$ and $b$ if it satifies each of the following two properties: 1) $g$ divides both $a$ and $b$; 2) if $g'$ is a common divisor of $a$ and $b$ then $g'$ divides $g$. First notice that $0$ is a gcd of $0$ and $0$ because of the following: *) $0$ divides $0$ (and divides $0$); *) whenever $g'$ is an integer that divides $0$ and divides $0$ then $g'$ divides $0$. Next notice that if $g$ is any non-zero integer then $g$ cannot be a gcd of $0$ and $0$ because $0$ (a common divisor of $0$ and $0$) does not divide $g$. Finally, observe that this makes $0$ the unique gcd of $0$ and $0$. : The gcd of two integers is usually defined as a non-negative : number to make it unique. Regards, Marc van Dongen From antony@apocalypse.org Sun Dec 16 20:53:08 2001 From: antony@apocalypse.org (Antony Courtney) Date: Sun, 16 Dec 2001 15:53:08 -0500 Subject: ANNOUNCE: GCJNI - Java Native Interface for Haskell Message-ID: <3C1D09B4.2090103@apocalypse.org> I am pleased to announce an experimental release of GCJNI. GCJNI is a library that allows Haskell to invoke Java code via the Java Native Interface (JNI). The implementation uses GreenCard to make the JNI (a C language interface) available to Haskell. GCJNI includes a few convenient features, such as: - Integration of the Haskell and Java garbage collectors, so that Java objects are garbage collected when they are no longer accessible from Haskell. - Type class based overloading, which makes it easy to pass common types (like Int, Float and String) to or from Java code. - A tool (GenBindings) which uses Java reflection on a set of compiled Java classes to generate a Haskell module with a simple, high-level, type-safe interface to the underlying Java code. GCJNI has been succesfully tested using both hugs98 and ghc under both Linux and Windows. Binary distributions are provided for all for of these (compiler, platform) combinations. More information (including pointers to the relevant distributions) is available from the GCJNI web page at: http://www.haskell.org/gcjni Bug reports and feedback should be sent to antony@apocalypse.org Enjoy! -- Antony Courtney Grad. Student, Dept. of Computer Science, Yale University antony@apocalypse.org http://www.apocalypse.org/pub/u/antony From antony@apocalypse.org Sun Dec 16 20:54:41 2001 From: antony@apocalypse.org (Antony Courtney) Date: Sun, 16 Dec 2001 15:54:41 -0500 Subject: ANNOUNCE: Haven - Scalable Vector Graphics for Haskell Message-ID: <3C1D0A11.4070702@apocalypse.org> I am pleased to announce an experimental release of Haven, a library for scalable vector graphics in Haskell. Haven provides a wealth of features, including: - Data types for common geometric shapes such as rectangles, ellipses and Bezier curves. - Composition of arbitrary shapes from sequences of straight and curved segments. - Intersection tests and bounds calculations on shapes. - Cropping of any image by any shape. - Affine transformations on images and paths. - Calculation of precise rectangular bounds of shapes and images. - High quality, anti-aliased rendering. - Scalable outline fonts. - Smooth blending of colors (gradients) - Alpha blending (transparency). - Fine-grained control of stroke width, join rules and end caps. - Constructive Area Geometry (CAG) for composing shapes using simple set-theoretic operations. Haven presents a purely functional API, but is implemented using the Java2D renderer. For more information on Haven, including examples and download instructions, please visit the haven web page at: http://www.haskell.org/haven Please send suggestions and bug reports to: antony@apocalypse.org Enjoy! -- Antony Courtney Grad. Student, Dept. of Computer Science, Yale University antony@apocalypse.org http://www.apocalypse.org/pub/u/antony From ashley@semantic.org Sun Dec 16 23:57:53 2001 From: ashley@semantic.org (Ashley Yakeley) Date: Sun, 16 Dec 2001 15:57:53 -0800 Subject: ANNOUNCE: GCJNI - Java Native Interface for Haskell Message-ID: <200112162357.PAA26291@mail4.halcyon.com> At 2001-12-16 12:53, Antony Courtney wrote: >I am pleased to announce an experimental release of GCJNI. Eh, you beat me to a first release, which I was going to announce yesterday, but SourceForge's file release system is currently broken. I guess I'll have to put it on semantic.org I had no idea anyone else was working on this. Nevertheless, I suspect I'm further along. -- Ashley Yakeley, Seattle WA From ashley@semantic.org Mon Dec 17 00:34:13 2001 From: ashley@semantic.org (Ashley Yakeley) Date: Sun, 16 Dec 2001 16:34:13 -0800 Subject: ANN: Release 0.1 of Haskell/Java VM Bridge Message-ID: <200112170034.QAA27519@mail4.halcyon.com> The first release, 0.1, of Haskell/Java VM Bridge is now available. Haskell/Java VM Bridge allows Haskell programs access to the Java Virtual Machine. Features include: * On-the-fly creation of Java classes with Haskell functions for methods. * Lifted monads which do all the necessary JNI preloading and 'env'-pointer variable handling for you. These can be automatically generated via a tool (MakeJVMModule). * Integration of garbage collectors, type-class based overloading, and a tool (MakeClassModule) which uses Java reflection etc. to generate a Haskell module etc., etc. It is, however, only available for Unix and works only with GHC. This release should be 'beta' quality, but has undergone little testing. You will need: An x86 machine running some form of Unix; GHC 5.02 or later; The appropriate JVM, installed in the appropriate place: - IBM JDK/JRE 1.3 for x86, installed in /usr/lib/ibm-java/IBMJava2-13/ - Blackdown Port of Sun's JRE 1.3/Sun JDK 1.3 for x86, installed in /usr/lib/j2sdk1.3/ and /usr/lib/j2re1.3/ No documentation is currently available, sorry. Two examples have been included: a trivial "hello world" program, and a program that shows a Java Frame containing an instance of a Haskell-defined subclass of Canvas that has a Haskell 'paint' method that draws an oval. You should be able to figure out most of it from that... and of course the source is available from SourceForge CVS. Be sure to download the correct .tar.gz file for your Java VM. Simple installation instructions are included in the file. SourceForge's file release system is currently broken. When it's fixed, I'll put it there too. Haskell/JVM Bridge and source code is licensed under the GNU Lesser GPL. I hope to build an Darwin/OS X version just as soon as there's a port of GHC 5.02 with a working createAdjustor. -- Ashley Yakeley, Seattle WA From antony@apocalypse.org Mon Dec 17 02:44:30 2001 From: antony@apocalypse.org (Antony Courtney) Date: Sun, 16 Dec 2001 21:44:30 -0500 Subject: ANNOUNCE: GCJNI - Java Native Interface for Haskell References: <200112162357.PAA26291@mail4.halcyon.com> Message-ID: <3C1D5C0E.5090402@apocalypse.org> Hi Ashley, I'm not quite sure why you Cc'ed the whole Haskell list in replying to my release announcement, but just for clarification: Ashley Yakeley wrote: > > I had no idea anyone else was working on this. I find it odd you would say that. When you first mentioned your interest in the JNI on the Haskell list in early July, I replied to you (and the rest of the Haskell list) informing you I was working on such a project, and offering to give you a pre-release snapshot of my source code: http://www.haskell.org/pipermail/haskell/2001-July/001372.html When you didn't reply to that message, I emailed you again privately on August 1st, specifically suggesting that we combine forces to avoid duplication of effort. I never received a reply to that message either. > Nevertheless, I suspect I'm further along. Perhaps. Let's move this discussion to private email and try to find a way to work together. -antony -- Antony Courtney Grad. Student, Dept. of Computer Science, Yale University antony@apocalypse.org http://www.apocalypse.org/pub/u/antony From frank@cc.gatech.edu Mon Dec 17 05:40:21 2001 From: frank@cc.gatech.edu (Frank Dellaert) Date: Mon, 17 Dec 2001 00:40:21 -0500 Subject: space efficiency question Message-ID: <002201c186bd$51fcd6b0$a21ccf82@cc.gatech.edu> This is a multi-part message in MIME format. ------=_NextPart_000_001F_01C18693.68D2E250 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable I'm not a compiler/interpreter implementer, just a Haskell user :-) My question is: if I have two datatypes, say newtype Attributes =3D Att [String] data Instance =3D Instance Attributes [Int] where an Attributes value describes the discrete attributes that are = stored (as Int) in an Instance. Now: if I have a couple of thousand of these Instances, created with the = same Attributes value, as in: a =3D Attributes ["a","bc"] i0000 =3D Instance a [1,2] i0001 =3D Instance a [1,1] ... i7896 =3D Instance a [2,1] can I be assured that there are not thousands of actual copies of a but = that they simply have a pointer to a ? I'm interested in the answer for = both ghc (compiled/interpreted) as interpreted Hugs. I would hope, so, right ? Is there an actual guarantee or is that an = optimization that the implementation might or might not implement ? Cheers Frank Dellaert ------=_NextPart_000_001F_01C18693.68D2E250 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
I'm not a compiler/interpreter = implementer, just a=20 Haskell user :-)
My question is: if I have two = datatypes,=20 say
 
newtype Attributes =3D Att = [String]
data Instance =3D Instance Attributes=20 [Int]
 
where an Attributes value describes the = discrete=20 attributes that are stored (as Int) in an Instance.
 
Now: if I have a couple of thousand of = these=20 Instances, created with the same Attributes value, as in:
 
a =3D Attributes = ["a","bc"]
i0000 =3D Instance a [1,2]
i0001 =3D Instance a [1,1]
...
i7896 =3D Instance a [2,1]
 
can I be assured that there are not = thousands of=20 actual copies of a but that they simply have a pointer to a ? I'm = interested in=20 the answer for both ghc (compiled/interpreted) as interpreted = Hugs.
 
I would hope, so, right ? Is there an = actual=20 guarantee or is that an optimization that the implementation might or = might not=20 implement ?
 
Cheers
Frank = Dellaert
------=_NextPart_000_001F_01C18693.68D2E250-- From simonpj@microsoft.com Mon Dec 17 09:24:47 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Mon, 17 Dec 2001 01:24:47 -0800 Subject: space efficiency question Message-ID: <1113DDB24D4A2841951BFDF86665EE19066623@RED-MSG-10.redmond.corp.microsoft.com> This is a multi-part message in MIME format. --------------InterScan_NT_MIME_Boundary Content-Type: multipart/alternative; boundary="----_=_NextPart_001_01C186DC.ABC0BECE" ------_=_NextPart_001_01C186DC.ABC0BECE Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Now: if I have a couple of thousand of these Instances, created with the same Attributes value, as in: =20 a =3D Attributes ["a","bc"] i0000 =3D Instance a [1,2] i0001 =3D Instance a [1,1] ... i7896 =3D Instance a [2,1] =20 can I be assured that there are not thousands of actual copies of a but that they simply have a pointer to a ? I'm interested in the answer for both ghc (compiled/interpreted) as interpreted Hugs.=20 Yes for GHC: you'll only get one copy of 'a'. =20 Simon =20 ------_=_NextPart_001_01C186DC.ABC0BECE Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Message
Now: if I have a couple of thousand of = these=20 Instances, created with the same Attributes value, as in:
 
a =3D Attributes = ["a","bc"]
i0000 =3D Instance a = [1,2]
i0001 =3D Instance a = [1,1]
...
i7896 =3D Instance a = [2,1]
 
can I be assured that there are = not=20 thousands of actual copies of a but that they simply have a pointer to = a ? I'm=20 interested in the answer for both ghc (compiled/interpreted) as = interpreted=20 Hugs. 
Yes for GHC: you'll only get one copy of=20 'a'.
 
Simon
 
------_=_NextPart_001_01C186DC.ABC0BECE-- --------------InterScan_NT_MIME_Boundary-- From reiner@cs.chalmers.se Mon Dec 17 09:55:16 2001 From: reiner@cs.chalmers.se (Reiner Haehnle) Date: Mon, 17 Dec 2001 10:55:16 +0100 (MET) Subject: Call for Applications to PhD Positions, Chalmers University, Sweden Message-ID: Please pass on to interested students. Apologies for multiple copies. --------------------------------------------------------------------- New PhD Positions (DEADLINE 15 February 2002! See "How to apply" below) Department of Computing Science, Chalmers University of Technology & University of Gothenburg Sweden The Department has about 70 researchers, half being faculty members and half PhD students. Our focus is on programming logic, type theory, functional programming, formal methods, distributed and concurrent systems, security, algorithms, bioinformatics, human computer interaction, and computational linguistics, but research is not restricted to these topics. For more information, see http://www.cs.chalmers.se/Cs/Research. PhD positions are for 5 years. There is no tuition fee. A PhD position is a regular job with social benefits; the salary amounts currently to about 16700 SEK per month in the first year (the exact amount depends on teaching duties, usually 20% of your time). Knowledge of Swedish is not a prerequisite for application. English is our working language for research. Both Swedish and English are used in undergraduate courses. Half of our researchers and PhD students are native Swedes; the rest come from more than 20 different countries. Applicants must have a very good undergraduate degree in Computing Science or in a related subject with a strong Computing Science component. They must also have a strong interest in doing research. You may even apply if you have not yet completed your degree, but expect to do so by September 2002. You are also invited to apply for our new International Master's Programme in Dependable Computer Systems, which can help you to obtain the necessary qualification (see http://www.cs.chalmers.se/Cs/Education/dcs/). The School especially welcomes female applicants. How to apply ------------ First, immediately register your intention to apply using the electronic application form on the WWW via http://www.md.chalmers.se/Jobs/PhD/phd-02-en.thtml The full application should contain 1 A letter of application, listing specific research interests 2 A curriculum vitae 3 Attested copies of degrees and other certificates 4 Copies of relevant work, for example dissertations or articles, that you have authored or co-authored 5 A description of: a previous teaching experience, documented b previous PhD studies, also in other subjects; state financial support for these, if any c previous work experience 6 Letters of recommendation from your teachers or employers If you have financial support of your own (industry job, grant, etc.), please state this fact clearly. It will increase your chances to be accepted considerably, because you need not compete for the limited number of fully financed positions. Send your full application (paper mail) to Department of Computing Science School of Computer Science and Engineering Chalmers University of Technology 412 96 Gothenburg Sweden to arrive by 15 February 2002. You will know the result of your application by 1 May 2002. From thorinn@diku.dk Mon Dec 17 14:50:21 2001 From: thorinn@diku.dk (Lars Henrik Mathiesen) Date: 17 Dec 2001 14:50:21 -0000 Subject: gcd 0 0 = 0 In-Reply-To: <20011216133559.C27182@cs.ucc.ie> (message from Marc van Dongen on Sun, 16 Dec 2001 13:35:59 +0000) Message-ID: <20011217145021.3269.qmail@tyr.diku.dk> > From: Marc van Dongen > Date: Sun, 16 Dec 2001 13:35:59 +0000 > > Marc van Dongen (dongen@cs.ucc.ie) wrote: > > : An integer $a$ divides integer $b$ if there exists an integer > : $c$ such that $a c= b$. > > To make clear why $0$ (and not any other non-zero integer) is the > gcd of $0$ and $0$ I should have added that for the integer case > $g$ is called a greatest common divisor (gcd) of $a$ and $b$ if it > satifies each of the following two properties: > > 1) $g$ divides both $a$ and $b$; > 2) if $g'$ is a common divisor of $a$ and $b$ then $g'$ divides $g$. In case it isn't clear already, these definitions make a lattice on the positive integers, with divides ~ leq, gcd ~ meet and lcm ~ join, using the report's definitions of gcd and lcm. (Choosing the positive result for gcd/lcm is equivalent to noting that divides is a partial preorder on the non-zero integers, and that the quotient identifies x and -x). The only thing that is lacking to make it a lattice on the non-negative integers, is that gcd 0 0 = 0 . All other cases involving zero (i.e., gcd 0 x = x for non-zero x, and lcm 0 x = 0 for all x) are consistent with 0 being the maximal element in the lattice, i.e., that all integers divide zero. Lars Mathiesen (U of Copenhagen CS Dep) (Humour NOT marked) From simonpj@microsoft.com Mon Dec 17 16:57:28 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Mon, 17 Dec 2001 08:57:28 -0800 Subject: Confused about default Message-ID: <1113DDB24D4A2841951BFDF86665EE19066637@RED-MSG-10.redmond.corp.microsoft.com> Well, Foo *is* an instance of Num, so a correct Haskell impl should pick that instance always. Since you don't define the fromInteger method in the instance decl, you get a runtime error. I don't know what you expect the [Foo] and Foo -> Int defaults to do. GHCi fails to put the correct default decl in place for command-line expressions. This is a known bug which we have not got around to fixing yet Simon | -----Original Message----- | From: Ian Lynagh [mailto:igloo@earth.li]=20 | Sent: 14 December 2001 21:29 | To: haskell@haskell.org | Subject: Confused about default |=20 |=20 |=20 | Hi all |=20 | I am rather confused about default. |=20 | In section 4.3.4 the report says | "each ti must be a monotype for which Num ti holds" | but according to grep this is the only place "monotype"=20 | appears in the report. |=20 | If I have the module |=20 | module TT (Foo(..)) where |=20 | default (Foo, [Foo], Foo -> Int) |=20 | data Foo =3D Foo deriving (Eq, Show) |=20 | instance Num Foo where {} | instance (Eq a, Show a) =3D> Num [a] where {} | instance Eq (a -> b) where {} | instance Show (a -> b) where {} | instance Num (a -> b) where {} |=20 | then hugs accepts it and | TT> 5 |=20 | Program error: Undefined member: fromInteger |=20 | ghc accepts it and | TT> 5 | 5 |=20 | nhc tells me |=20 | Error when renaming:: | Illegal type in default at 4:17 |=20 | If I remove all the list and function stuff then hi says | TT> 5 | 5 |=20 | If I have a | main =3D putStrLn $ show 5 |=20 | then nhc gives me | TT> main | No default definition for class method fromInteger |=20 | and ghci gives me | Main> main | *** Exception: TT.lhs:8: No instance nor default method for class | operation PrelNum.fromInteger |=20 |=20 | It seems to me that hugs is in the right with it's handling=20 | of 5, but I am not sure who is wrong with default ([Foo]) or=20 | (Foo -> Int). |=20 |=20 | Finally, the context free grammar doesn't currently enforce=20 | the restriction that only one default declaration be given.=20 | Fixing it would make rather a mess, though. |=20 |=20 | Ian |=20 |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From ger@tzi.de Mon Dec 17 17:05:41 2001 From: ger@tzi.de (George Russell) Date: Mon, 17 Dec 2001 18:05:41 +0100 Subject: gcd 0 0 = 0 Message-ID: <3C1E25E5.81718477@tzi.de> I've reconsidered my earlier position and think now that the Prelude is wrong to make gcd 0 0 an error, and should return 0. It probably doesn't make much difference to anyone, but it's like 1 not being a prime; it may be slightly harder to explain, but it makes the maths come out nicer and is in the end a simplification. From herrmann@infosun.fmi.uni-passau.de Mon Dec 17 17:31:17 2001 From: herrmann@infosun.fmi.uni-passau.de (Ch. A. Herrmann) Date: Mon, 17 Dec 2001 18:31:17 +0100 Subject: gcd 0 0 = 0 In-Reply-To: <3C1E25E5.81718477@tzi.de> References: <3C1E25E5.81718477@tzi.de> Message-ID: <15390.11237.38564.819599@reger.fmi.uni-passau.de> >>>>> "George" == George Russell writes: George> I've reconsidered my earlier position and think now that the George> Prelude is wrong to make gcd 0 0 an error, and should return George> 0. It probably doesn't make much difference to anyone, but George> it's like 1 not being a prime; it may be slightly harder to George> explain, but it makes the maths come out nicer and is in the George> end a simplification. I'm strongly against making 1 a prime number. In contrast, 0*x=0, thus 0 "divides" 0 (somehow). But I have problems with "gcd being the greatest positive integer ..." - 0 is not positive, it is non-negative or natural - 2 also divides 0 and 2 is a "greater integer" than 0 (0 is the top element of the lattice formed by the division relation but that is not clear by the expression "greatest") Anyway, gcd 0 0 = error would be the simplest way to avoid confusion and catch accidental programming errors; e.g., using the gcd to divide something else. -- Christoph From igloo@earth.li Mon Dec 17 17:32:02 2001 From: igloo@earth.li (Ian Lynagh) Date: Mon, 17 Dec 2001 17:32:02 +0000 Subject: Confused about default In-Reply-To: <1113DDB24D4A2841951BFDF86665EE19066637@RED-MSG-10.redmond.corp.microsoft.com>; from simonpj@microsoft.com on Mon, Dec 17, 2001 at 08:57:28AM -0800 References: <1113DDB24D4A2841951BFDF86665EE19066637@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <20011217173202.A10045@stu163.keble.ox.ac.uk> On Mon, Dec 17, 2001 at 08:57:28AM -0800, Simon Peyton-Jones wrote: > Well, Foo *is* an instance of Num, so a correct Haskell impl > should pick that instance always. I was looking at what the implementations would allow, the module wasn't supposed to be useful. > Since you don't define the > fromInteger method in the instance decl, you get a runtime error. I expected this, I included it as in some cases I *didn't* et a runtime error though. > I don't know what you expect the [Foo] and Foo -> Int defaults > to do. Let me try to clarify what I was asking: What is a monotype? For example, is "[Foo]" a monotype and is "Foo -> Int" a monotype? The context free grammar implies that a monotype is identical to a type, in which case why is a different name used? The rest was to attempt to highlight some inconsistencies in the implementations. Thanks Ian From Alan@LCS.MIT.EDU Mon Dec 17 18:45:04 2001 From: Alan@LCS.MIT.EDU (Alan Bawden) Date: Mon, 17 Dec 2001 13:45:04 -0500 (EST) Subject: gcd 0 0 = 0 In-Reply-To: <20011217145021.3269.qmail@tyr.diku.dk> (message from Lars Henrik Mathiesen on 17 Dec 2001 14:50:21 -0000) References: <20011217145021.3269.qmail@tyr.diku.dk> Message-ID: <17Dec2001.133056.Alan@LCS.MIT.EDU> From: Lars Henrik Mathiesen Date: 17 Dec 2001 14:50:21 -0000 ... In case it isn't clear already, these definitions make a lattice on the positive integers, with divides ~ leq, gcd ~ meet and lcm ~ join, using the report's definitions of gcd and lcm. Indeed, that's a nice way of putting it. How about if the report just says: In order to make the non-negative integers into a lattice under `gcd' and `lcm', we define `gcd 0 0 = 0'. From foc@cs.indiana.edu Mon Dec 17 22:26:25 2001 From: foc@cs.indiana.edu (LICS) Date: Mon, 17 Dec 2001 17:26:25 -0500 (EST) Subject: faculty position in logic Message-ID: <200112172226.fBHMQHS08034@moose.cs.indiana.edu> [Sincere apologies for duplicates] Indiana University invites applications for a tenure-track assistant professor position in applied logic. Please see www.informatics.indiana.edu/positions/logic.html for details. Applications received within the next few weeks are likely to still get full consideration. Applicants are welcome to email to foc@cs.indiana.edu to notify of their mailed application, and to provide pointers to any pertinent on-line documentation. From foc@cs.indiana.edu Mon Dec 17 22:26:25 2001 From: foc@cs.indiana.edu (LICS) Date: Mon, 17 Dec 2001 17:26:25 -0500 (EST) Subject: faculty position in logic Message-ID: <200112172226.fBHMQPx08125@moose.cs.indiana.edu> [Sincere apologies for duplicates] Indiana University invites applications for a tenure-track assistant professor position in applied logic. Please see www.informatics.indiana.edu/positions/logic.html for details. Applications received within the next few weeks are likely to still get full consideration. Applicants are welcome to email to foc@cs.indiana.edu to notify of their mailed application, and to provide pointers to any pertinent on-line documentation. From dongen@cs.ucc.ie Tue Dec 18 09:22:25 2001 From: dongen@cs.ucc.ie (Marc van Dongen) Date: Tue, 18 Dec 2001 09:22:25 +0000 Subject: gcd 0 0 = 0 In-Reply-To: <15390.11237.38564.819599@reger.fmi.uni-passau.de>; from herrmann@infosun.fmi.uni-passau.de on Mon, Dec 17, 2001 at 06:31:17PM +0100 References: <3C1E25E5.81718477@tzi.de> <15390.11237.38564.819599@reger.fmi.uni-passau.de> Message-ID: <20011218092225.O27182@cs.ucc.ie> Ch. A. Herrmann (herrmann@infosun.fmi.uni-passau.de) wrote: : In contrast, 0*x=0, thus 0 "divides" 0 (somehow). : But I have problems with "gcd being the greatest positive integer ..." [snip] : - 0 is not positive, it is non-negative or natural : - 2 also divides 0 and 2 is a "greater integer" than 0 : (0 is the top element of the lattice formed by the division relation : but that is not clear by the expression "greatest") : gcd a b is the greatest non-negative integer dividing both a and b such that anything that divides both a and b also divides gcd a b (so gcd a b is the greatest thing that divides both a and b). Regards, Marc van Dongen -- Marc van Dongen | dongen@cs.ucc.ie | Computer Science Department | Western Road | () ASCII ribbon campaign University College Cork | Cork, Ireland | /\ against HTML mail phone: +353 (0)21 4903578 | fax: 4903113 | From juhp@01.246.ne.jp Tue Dec 18 09:32:11 2001 From: juhp@01.246.ne.jp (Jens-Ulrik Petersen) Date: 18 Dec 2001 18:32:11 +0900 Subject: ANNOUNCE: hsclock-0.01.0 release Message-ID: I am pleased to announce the initial release of hsclock, another gtk+hs "applet" I've written. hsclock is an accurate multi-zone gtk clock, which can also run in a tty. hsclock uses gtk timeouts to synchronise the time updates to occur on the second or minute "tick" (dependent on the clock format string), making display updates accurate to within milliseconds. More info, source and rpm's are available at: http://www.01.246.ne.jp/~juhp/haskell/hsclock/ As usual feedback and comments welcome. Enjoy, Jens From dongen@cs.ucc.ie Tue Dec 18 09:32:49 2001 From: dongen@cs.ucc.ie (Marc van Dongen) Date: Tue, 18 Dec 2001 09:32:49 +0000 Subject: gcd 0 0 = 0 In-Reply-To: <17Dec2001.133056.Alan@LCS.MIT.EDU>; from Alan@LCS.MIT.EDU on Mon, Dec 17, 2001 at 01:45:04PM -0500 References: <20011217145021.3269.qmail@tyr.diku.dk> <17Dec2001.133056.Alan@LCS.MIT.EDU> Message-ID: <20011218093249.P27182@cs.ucc.ie> Alan Bawden (Alan@LCS.MIT.EDU) wrote: : In case it isn't clear already, these definitions make a lattice on : the positive integers, with divides ~ leq, gcd ~ meet and lcm ~ join, : using the report's definitions of gcd and lcm. : : Indeed, that's a nice way of putting it. How about if the report just : says: : : In order to make the non-negative integers into a lattice under `gcd' : and `lcm', we define `gcd 0 0 = 0'. It would surely make things a lot less accessible to people (including me) who do not have any (or limited) knowledge about lattices. Why not make it more accessible and use the following rule (ore something similar)? The greates common divison (gcd) of two integers a and b is the unique non-negative integer g which has each of the following two properties: 1) g divides both a and b; and 2) if g' also divides both a and b then g' also divides g, Here an integer a divides an integer b if there is an integer c such that b = c*a. Note that if you regard an integer a to be greater than another integer b if b divides a then the gcd of two intgerers may also be regarded as the greatest common divisor of a and b. Regards, Marc van Dongen From simonpj@microsoft.com Tue Dec 18 09:38:21 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 18 Dec 2001 01:38:21 -0800 Subject: gcd 0 0 = 0 Message-ID: <1113DDB24D4A2841951BFDF86665EE19066640@RED-MSG-10.redmond.corp.microsoft.com> If everyone likes this I'll put it in; otherwise I'll simply state that gcd 0 0 is defined to be 0.=20 Christoph does not like this, but the weight of world opinion seems=20 to be fairly clearly in favour of gcd 0 0 =3D 0. Let's try to wrap = this one up. Simon | -----Original Message----- | From: Alan Bawden [mailto:Alan@LCS.MIT.EDU]=20 | Sent: 17 December 2001 18:45 | To: haskell@haskell.org; Simon Peyton-Jones | Subject: Re: gcd 0 0 =3D 0 |=20 |=20 | From: Lars Henrik Mathiesen | Date: 17 Dec 2001 14:50:21 -0000 | ... | In case it isn't clear already, these definitions make a lattice on | the positive integers, with divides ~ leq, gcd ~ meet and=20 | lcm ~ join, | using the report's definitions of gcd and lcm. |=20 | Indeed, that's a nice way of putting it. How about if the report just | says: |=20 | In order to make the non-negative integers into a lattice=20 | under `gcd' | and `lcm', we define `gcd 0 0 =3D 0'. |=20 From simonpj@microsoft.com Tue Dec 18 09:48:34 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 18 Dec 2001 01:48:34 -0800 Subject: Confused about default Message-ID: <1113DDB24D4A2841951BFDF86665EE19066643@RED-MSG-10.redmond.corp.microsoft.com> | Let me try to clarify what I was asking: |=20 | What is a monotype? For example, is "[Foo]" a monotype and is=20 | "Foo -> Int" a monotype? The context free grammar implies=20 | that a monotype is identical to a type, in which case why is=20 | a different name used? A monotype is a type with no for-alls in it. But you are right that it's confusing that this is the only occurrence. I think the simplest thing is to change 'monotype' to 'type' here; after all, Num (forall a.a->a)=20 does not hold! thanks for pointing this out. Simon From simonpj@microsoft.com Tue Dec 18 09:58:23 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 18 Dec 2001 01:58:23 -0800 Subject: Haskell 98 IO Message-ID: <1113DDB24D4A2841951BFDF86665EE19066646@RED-MSG-10.redmond.corp.microsoft.com> | Anyway, what should the report say? I think it is reasonable=20 | to expect that stdin & stdout should both be unbuffered in=20 | order for interact to work right. So the defn of interact should be |=20 | interact f =3D do | hSetBuffering stdin NoBuffering -- new | hSetBuffering stdout NoBuffering -- new | s <- hGetContents | putStr (f s) Simon Marlow raises a good point here. If 'interact' is to be interactive it had better be unbuffered. So I propose to add the two new lines above to the Report. This does not change the intended behaviour at all. Simon From gupta@herbrand.utdallas.edu Mon Dec 17 23:28:05 2001 From: gupta@herbrand.utdallas.edu (Dr. Gopal Gupta) Date: Mon, 17 Dec 2001 17:28:05 -0600 Subject: 4th Int'l Symp.: Practical Aspects of Declarative Languages Message-ID: <200112172328.fBHNS5u02536@herbrand.utdallas.edu> [ o Apologies for multiple messages. o Please register and make hotel reservations as soon as possible since both deadlines are approaching fast (Dec. 27th) ]. You are cordially invited to the Fourth International Symposium on Practical Aspects of Declarative Languages that will be held on Jan 19-20, 2002 right after ACM POPL. The program includes invited talks by three distinguished speakers: J. Strother Moore of the University of Texas at Austin, Catherine Meadows of the Naval Research Labs, and Veronica Dahl of Simon Fraser University. Very low registration rates ($150 regular and $100 student) and low conference hotel rates have been secured to make the event affordable. The program ends by late afternoon on Sunday to let attendees return home on Sunday itself. If you are attending ACM POPL, we especially encourage you to plan to attend PADL. More details can be found at: http://www.cs.sunysb.edu/~padl2002 --------------------------------------------------------------------- Fourth International Symposium on Practical Aspects of Declarative Languages (PADL '02) Portland, Oregon, USA Jan 19-20, 2002 Co-located with POPL 2002 --------------------------------------------------------------------- Conference Program ================== Jan 19th 8:45-9:00 Opening Remarks 9:00-10:00 Invited Talk #1 Using a Declarative Language to Build an Experimental Analysis Tool Catherine Meadows (Naval Research Laboratory), 10:00-10:30 Coffee Break 10:30-12:30 Session-I: Modeling Engineering Structures using Constrained Objects Bharat Jayaraman and Pallavi Tambay Compiler Construction in Higher Order Logic Programming Chuck Liang Declarative Programming with Application to Clinical Medicine: On the Use of Gisela in the MedView Project. Olof Torgersson Semantics-based Filtering: Logic Programming's Killer App? Gopal Gupta, Hai-Feng Guo, Arthur Karshmer, Enrico Pontelli, Desh Ranjan, B. Milligan, N. Datta, O. El Khatib, M. Noamany, and X. Zhou 12:30-1:30 Lunch 1:30-2:30 Invited Talk #2 How to Talk to Your Computer So That it Will Listen Veronica Dahl (Simon Fraser University), 2:45-4:15 Session-II: Linear Scan Register Allocation in a High-Performance Erlang Compiler Erik Johansson and Konstantinos Sagonas Typed Combinators for Generic Traversal Ralf Laemmel and Joost Visser Event-Driven FRP. Zhanyong Wan, Walid Taha, and Paul Hudak 4:15-4:30 Coffee Break 4:30-6:00 Session-III: Compiling Embedded Programs to Byte Code. Morten Rhiger, Exploiting Efficient Control and Data Structures in Logic Programs. Rong Yang and Steve Gregory, Memory Management and Scheduling in a Tabling Engine Luis F. Castro and Terrance Swift and David S. Warren -------------------------------------------------------------------------------- Jan 20th 9:00-10:00 Invited Talk #3: Single-Threaded Objects in ACL2. J. Strother Moore (University of Texas, Austin) 10:00-10:30 Coffee Break 10:30-12:30 Session-IV: Adding Apples and Oranges Martin Erwig and Margaret Burnett WASH/CGI: Server-side Web Scripting with Sessions and Typed, Compositional Forms. Peter Thiemann A better XML parser through functional programming. Oleg Kiselyov Functional Approach to Texture Generation. Jerzy Karczmarczuk 12:30-1:30 Lunch 1:30-3:30 Session-V: Abstract Interpretation over Non-Deterministic Finite Tree Automata for Set-Based Analysis of Logic Programs. John Gallagher, German Puebla, A High-Level Generic Interface to External Programming Languages for ECLiPSe. Kish Shen, Joachim Schimpf, Stefano Novello, Josh Singer, Segment Order Preserving and Generational Garbage Collection for Prolog. Ruben Vandeginste, Konstantinos Sagonas, and Bart Demoen, A Debugging Scheme for Declarative Equation Based Modeling Languages. Peter Bunus, Peter Fritzson From herrmann@infosun.fmi.uni-passau.de Tue Dec 18 11:16:11 2001 From: herrmann@infosun.fmi.uni-passau.de (Ch. A. Herrmann) Date: Tue, 18 Dec 2001 12:16:11 +0100 Subject: gcd 0 0 = 0 In-Reply-To: <1113DDB24D4A2841951BFDF86665EE19066640@RED-MSG-10.redmond.corp.microsoft.com> References: <1113DDB24D4A2841951BFDF86665EE19066640@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <15391.9595.758521.560553@reger.fmi.uni-passau.de> >>>>> "Simon" == Simon Peyton-Jones writes: Simon> Christoph does not like this It's OK if the definition is clear; it wasn't using the words "positive" or "greatest integer". Stating "gcd 0 0 = 0" explicitly is a good thing, even if it could be expressed verbatim; people may think about the mathematical background, but they should not need to think about the meaning of the definition. Anyway, I'm still against promoting 1 to a prime number :-) Cheers -- Christoph From frank@cc.gatech.edu Tue Dec 18 11:48:18 2001 From: frank@cc.gatech.edu (Frank Dellaert) Date: Tue, 18 Dec 2001 12:48:18 +0100 Subject: space efficiency question References: <1113DDB24D4A2841951BFDF86665EE19066623@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <000f01c187b9$e3216280$544a88d9@oemcomputer> This is a multi-part message in MIME format. ------=_NextPart_000_000C_01C187C2.4477ED80 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MessageThanks ! Now, a small follow-up question: if I subsequently test 2 Instances = whether they were instantiated with the same Attributes value, as in test (Instance a1 _) (Instance a2 _) =3D (a1=3D=3Da2) will this be implemented efficiently ? I.e. will it check first whether = the pointers happen to be the same, and only then do a full Eq = comparison ? Cheers Frank ----- Original Message -----=20 From: Simon Peyton-Jones=20 To: Frank Dellaert ; Haskell@haskell.org=20 Sent: Monday, December 17, 2001 10:24 AM Subject: RE: space efficiency question Now: if I have a couple of thousand of these Instances, created with = the same Attributes value, as in: =20 a =3D Attributes ["a","bc"] i0000 =3D Instance a [1,2] i0001 =3D Instance a [1,1] ... i7896 =3D Instance a [2,1] =20 can I be assured that there are not thousands of actual copies of a = but that they simply have a pointer to a ? I'm interested in the answer = for both ghc (compiled/interpreted) as interpreted Hugs.=20 Yes for GHC: you'll only get one copy of 'a'. =20 Simon =20 ------=_NextPart_000_000C_01C187C2.4477ED80 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Message
Thanks !
 
Now, a small follow-up question: if I = subsequently=20 test 2 Instances whether they were instantiated with the same Attributes = value,=20 as in
 
test (Instance a1 _) (Instance a2 _) = =3D=20 (a1=3D=3Da2)
 
will this be implemented efficiently ? = I.e. will it=20 check first whether the pointers happen to be the same, and only then do = a full=20 Eq comparison ?
 
Cheers
Frank
----- Original Message -----
From:=20 Simon=20 Peyton-Jones
To: Frank Dellaert ; Haskell@haskell.org
Sent: Monday, December 17, 2001 = 10:24=20 AM
Subject: RE: space efficiency=20 question

Now: if I have a couple of thousand = of these=20 Instances, created with the same Attributes value, as in:
 
a =3D Attributes = ["a","bc"]
i0000 =3D Instance a = [1,2]
i0001 =3D Instance a = [1,1]
...
i7896 =3D Instance a = [2,1]
 
can I be assured that there = are not=20 thousands of actual copies of a but that they simply have a pointer = to a ?=20 I'm interested in the answer for both ghc (compiled/interpreted) as=20 interpreted Hugs. 
Yes for GHC: you'll = only get one=20 copy of 'a'.
 
Simon
 
= ------=_NextPart_000_000C_01C187C2.4477ED80-- From voigt@orchid.inf.tu-dresden.de Tue Dec 18 13:22:19 2001 From: voigt@orchid.inf.tu-dresden.de (Janis Voigtlaender) Date: Tue, 18 Dec 2001 14:22:19 +0100 Subject: space efficiency question References: <1113DDB24D4A2841951BFDF86665EE19066623@RED-MSG-10.redmond.corp.microsoft.com> <000f01c187b9$e3216280$544a88d9@oemcomputer> Message-ID: <3C1F430B.D5B230AC@tcs.inf.tu-dresden.de> Frank Dellaert asks: > test (Instance a1 _) (Instance a2 _) = (a1==a2) > > will this be implemented efficiently ? I.e. will it check first whether the > pointers happen to be the same, and only then do a full Eq comparison ? No, otherwise you might also expect that the following test' function: test' :: String -> Bool test' s = (s==s) always returns True, without considering its actual argument s. But this is not the way of it, (==) evaluates the two strings to be compared as far as necessary for this comparison. For example: test' "abc" = True but: test' undefined = undefined If you really need something like pointer equality, you might want to consider the stable names of: @inproceedings{ jones99stretching, author = "Simon L. Peyton Jones and Simon Marlow and Conal Elliott", title = "Stretching the Storage Manager: Weak Pointers and Stable Names in Haskell", booktitle = "Implementation of Functional Languages", pages = "37-58", year = "1999", url = "citeseer.nj.nec.com/jones99stretching.html" } -- Janis Voigtlaender http://wwwtcs.inf.tu-dresden.de/~voigt/ mailto:voigt@tcs.inf.tu-dresden.de From thorinn@diku.dk Tue Dec 18 16:11:08 2001 From: thorinn@diku.dk (Lars Henrik Mathiesen) Date: 18 Dec 2001 16:11:08 -0000 Subject: gcd 0 0 = 0 In-Reply-To: <20011218093249.P27182@cs.ucc.ie> (message from Marc van Dongen on Tue, 18 Dec 2001 09:32:49 +0000) Message-ID: <20011218161108.5990.qmail@tyr.diku.dk> > From: Marc van Dongen > Date: Tue, 18 Dec 2001 09:32:49 +0000 > > Alan Bawden (Alan@LCS.MIT.EDU) wrote: > : Indeed, that's a nice way of putting it. How about if the report just > : says: > : > : In order to make the non-negative integers into a lattice under `gcd' > : and `lcm', we define `gcd 0 0 = 0'. > It would surely make things a lot less accessible to people > (including me) who do not have any (or limited) knowledge about > lattices. Why not make it more accessible and use the following rule > (ore something similar)? > The greates common divison (gcd) of two integers a and b is the unique > non-negative integer g which has each of the following two properties: > 1) g divides both a and b; and > 2) if g' also divides both a and b then g' also divides g, > Here an integer a divides an integer b if there is an integer c > such that b = c*a. This is exactly what you get if you plug the relation 'divides' on the non-negative integers into the definition of meet in a lattice. So this formulation is no more or less complex to use than the lattice one --- and people who do know about lattices will probably realize this pretty fast. It all depends on who you want to convince that gcd 0 0 should be 0, the mathematicians (by elegance) or the programmers (by concreteness). But since it seems that Simon is just going to put 'it is so' in the report, the point is moot. Lars Mathiesen (U of Copenhagen CS Dep) (Humour NOT marked) From wittner@uni-duesseldorf.de Tue Dec 18 16:43:33 2001 From: wittner@uni-duesseldorf.de (Toralf Wittner) Date: Tue, 18 Dec 2001 17:43:33 +0100 Subject: x^y Message-ID: <0GOJ006RUT6O12@neptun.rz.uni-duesseldorf.de> Hello, you can count me as a newbie in functional programming. I'm attempting to define a function that computes the value of x^y for whole numbers. Intuively (all efficiency considerations aside) I would start with something like this: power x y | x == 0 = 0 | y == 0 = 1 | y > 0 = x * power x (y-1) | y < 0 = 1 / fromInteger x * power x (y+1) One recognizes that the function returns either an integer value if y > 0 or a float value if y < 0. Therefore I can't write a signature like pow :: Integer -> Integer -> Integer nor can I do pow :: Integer -> Integer -> Double. If I would use Python I could write something like this: def power(m, n): if m == 0: return 0 if n == 0: return 1 if n > 0: return m * power(m, (n-1)) if n < 0: return (1 / float(m)) * power(m, (n+1)) How then would I write this function in Haskell (concerning types)? Thanks in advance! Kind regards, Toralf From dongen@cs.ucc.ie Tue Dec 18 17:02:36 2001 From: dongen@cs.ucc.ie (Marc van Dongen) Date: Tue, 18 Dec 2001 17:02:36 +0000 Subject: gcd 0 0 = 0 In-Reply-To: <20011218161108.5990.qmail@tyr.diku.dk>; from thorinn@diku.dk on Tue, Dec 18, 2001 at 04:11:08PM -0000 References: <20011218093249.P27182@cs.ucc.ie> <20011218161108.5990.qmail@tyr.diku.dk> Message-ID: <20011218170236.C4643@cs.ucc.ie> Lars Henrik Mathiesen (thorinn@diku.dk) wrote: : > Alan Bawden (Alan@LCS.MIT.EDU) wrote: : > : Indeed, that's a nice way of putting it. How about if the report just : > : says: : > : : > : In order to make the non-negative integers into a lattice under `gcd' : > : and `lcm', we define `gcd 0 0 = 0'. [snip] : This is exactly what you get if you plug the relation 'divides' on the : non-negative integers into the definition of meet in a lattice. So : this formulation is no more or less complex to use than the lattice : one --- and people who do know about lattices will probably realize : this pretty fast. I disagree. Alan is talking about adding things to the haskell report. That document should be accessible to as many people as possible. I have not yet met anybody who had lattice theory in primary and/or secondary school. On the other hand I *have* met quite a few of them who have a pretty good idea about what it means for one number to divide another. [snip] Regards, Marc van Dongen -- Marc van Dongen | dongen@cs.ucc.ie | Computer Science Department | Western Road | () ASCII ribbon campaign University College Cork | Cork, Ireland | /\ against HTML mail phone: +353 (0)21 4903578 | fax: 4903113 | From kentk@md.chalmers.se Tue Dec 18 17:00:30 2001 From: kentk@md.chalmers.se (Kent Karlsson) Date: Tue, 18 Dec 2001 18:00:30 +0100 Subject: gcd 0 0 = 0 In-Reply-To: <15391.9595.758521.560553@reger.fmi.uni-passau.de> Message-ID: <000701c187e5$80c7c1c0$b4e21081@chalmers95a69n> > >>>>> "Simon" == Simon Peyton-Jones writes: > > Simon> Christoph does not like this I still don't like this. 0 has never, and will never, divide anything, in particular not 0. 0 may be a prime factor of 0 (see also below!), but that is different. It is not the greatest (in the ordinary sense) divisor of 0. Indeed, +infinity is a much larger divisor of 0... I'm not in favour of using a very special-purpose order, not used for anything else, and that isn't even an order but a preorder, just to motivate gcd 0 0 = 0. Even if using this very special-purpose preorder, an infinity would be included in the 'top' equivalence class, and if we pick a representative value on the basis of which is 'greater' in the ordinary sense for integers augmented with infinities(!), then +infinity should be the representative value. Thus, in any case, gcd 0 0 = +infinity. This is easy enough for Integer, where +infinity and -infinity can easily be made representable (and should be made representable), but harder for a 'pure hardware' Int datatype. But in an ideal world, gcd 0 0 = +infinity with no error or exception. > It's OK if the definition is clear; it wasn't using > the words "positive" or "greatest integer". > > Stating "gcd 0 0 = 0" explicitly is a good thing, > even if it could be expressed verbatim; > people may think about the mathematical background, > but they should not need to think about the > meaning of the definition. > Anyway, I'm still against promoting 1 to a prime number :-) Why? If EVERY natural number is to have a prime factorisation, then BOTH 0 AND 1 have to be promoted to prime numbers; otherwise 1 and 0 cannot be prime factorised; in addition to that 1 is then a prime factor of any number (that can be excluded from the *minimal* list of prime factors except for 1)... There is no fundamental reason to except 1 from being a prime number. But there is a fundamental reason to say that 0 can never be a divisor (i.e. 0|0 is false; x|y is true iff x is a *non-zero* factor of y; the 'non-zero' part is often left implicit (e.g. one is only talking about strictly positive integers), which is part of the reason why we are having this discussion). If you want something similar to gcd, but that returns 0 for 0 and 0, then it is the 'product of all common prime factors'; where 1 has the (non-minimal) prime factorisation [1, 1, ...], 0 has the (non-minimal) prime factorisation [0, 1, 2, ...], and 1 is included at least once in the (non-minimal) prime factorisation of any natural number. If you want a parallel to the divides relation where 0 and 0 are related: 0 is a factor of 0. A prime number is a number that has no integer *between* 1 and itself as factors. People often say "except" instead of "between", but that does not work for 0, nor for the non-minimal prime factorisations that people seem to be interested in, given the interest in having gcd 0 0 = 0 (which isn't the gc*d*!). Again, the context is often strictly positive integers, and 'between' and 'except' are then equivalent. For no apparent reason 1 is usually also excepted, but that does not work for the prime factorisation of 1, nor for finding the product of all common prime factors of 1 and another natural number... For integers, -1 is also a prime number, and for imaginary integers, i is also a prime number... I'm sure somebody can give a nice definition of a partial order (not just preorder) lattice with 1 as the min value and 0 as the max value (just larger than the infinities), if you absolutely want a lattice with a gcd-*like* meet and lcm-*like* join for this (the, positive bias, factor-of order). I'd be happy to support such gcd-*like* (pcf?) and lcm-*like* functions, but they aren't the gcd, nor the lcm (e.g. pcf (-1) (-1) = -1, not 1, etc.). If you don't like adding these, then I suggest leaving things completely as they are. Squeezing in two operations into one just because they have the same results over the first quadrant is not something I find to be too good. Odd one out? /kent k From dpt@math.harvard.edu Tue Dec 18 18:12:14 2001 From: dpt@math.harvard.edu (Dylan Thurston) Date: Tue, 18 Dec 2001 13:12:14 -0500 Subject: gcd 0 0 = 0 In-Reply-To: <000701c187e5$80c7c1c0$b4e21081@chalmers95a69n>; from kentk@md.chalmers.se on Tue, Dec 18, 2001 at 06:00:30PM +0100 References: <15391.9595.758521.560553@reger.fmi.uni-passau.de> <000701c187e5$80c7c1c0$b4e21081@chalmers95a69n> Message-ID: <20011218131214.A18214@noether.math.harvard.edu> On Tue, Dec 18, 2001 at 06:00:30PM +0100, Kent Karlsson wrote: > Why? If EVERY natural number is to have a prime factorisation, then BOTH > 0 AND 1 have to be promoted to prime numbers; 1 has a perfectly fine prime factorization. It is the product of 0 primes, the null product. (A null product is defined, for very good reasons, to be 1, just like a null sum is defined to be 0.) I could see defences of calling 0 a prime, although it is not standard mathematical practice. The ideal generated by 0 is a prime ideal, for one thing. 0 would still not have a unique prime factorization, however. (But Haskell should not unilaterally decide to violate standard mathematical terminology!) > ... But > there is a fundamental reason to say that 0 can never be a divisor (i.e. 0|0 > is false; x|y is true iff x is a *non-zero* factor of y; the 'non-zero' part > is often left implicit (e.g. one is only talking about strictly positive > integers), which is part of the reason why we are having this discussion). What fundamental reason do you have in mind? Why do you use this definition of divisibility? (I'm curious; other mathematicians give the same definition, and I can't see why.) This thread made me curious, so I did a little library research. I was surprised to discover that mathematicians discover on this, the domain of definition of "gcd a b": Domain References ------ ---------- a /= 0, b /= 0 Lang, "Algebra, 3rd Edition" Hasse, "Number Theory" a, b not both 0 Koblitz, "A Course on Number Theory and Cryptography" all a, b allowed MacLane and Birkhoff, "Algebra, 2nd Edition" Koch, "Number Theory" At least the books by Lang and MacLane-Birkhoff are standard references. Note that the definitions all agree when they are defined (with gcd 0 0 = 0). As I said, I was surprised; to me, the definiton with all a and b is the more natural one. I still recommend using the full domain (especially since exceptions are awkward to deal with in Haskell), but I'm not as certain. Best, Dylan Thurston From ack@nethere.com Tue Dec 18 23:54:13 2001 From: ack@nethere.com (Michael Ackerman) Date: Tue, 18 Dec 2001 15:54:13 -0800 Subject: gcd 0 0 = 0 References: <15391.9595.758521.560553@reger.fmi.uni-passau.de> <000701c187e5$80c7c1c0$b4e21081@chalmers95a69n> <20011218131214.A18214@noether.math.harvard.edu> Message-ID: <3C1FD725.FFC84D92@nethere.com> The general meaning of `having a prime factorization' is that every non-zero element is uniquely a product of a unit and a product of primes. The algebraic structures where unique factorizations live are `unique factorization domains' (UFDs) of which a central class is formed by the ring of polynomials over a field. Here the non-zero elements of the field are the units; no one has ever suggested calling them primes! In a general UFD one can only speak of _a_ gcd of two elements x and y, meaning an element d such that one has (x, y) = (d), an equality of ideals. In some special cases, there is a natural choice for d (e.g., in the integers, the non-negative d; in the ring of polynomials over a field, the monic d (having leading coeff. 1)). In some UFDs there is no canonical choice (e.g. in the Gaussian integers, a + ib for a, b integers). gcd(0, 0) = 0. Cheers, Michael Ackerman Dylan Thurston wrote: > > On Tue, Dec 18, 2001 at 06:00:30PM +0100, Kent Karlsson wrote: > > Why? If EVERY natural number is to have a prime factorisation, then BOTH > > 0 AND 1 have to be promoted to prime numbers; > > 1 has a perfectly fine prime factorization. It is the product of 0 primes, > the null product. (A null product is defined, for very good reasons, to > be 1, just like a null sum is defined to be 0.) > > I could see defences of calling 0 a prime, although it is not standard > mathematical practice. The ideal generated by 0 is a prime ideal, > for one thing. 0 would still not have a unique prime factorization, > however. (But Haskell should not unilaterally decide to violate standard > mathematical terminology!) > > > ... But > > there is a fundamental reason to say that 0 can never be a divisor (i.e. 0|0 > > is false; x|y is true iff x is a *non-zero* factor of y; the 'non-zero' part > > is often left implicit (e.g. one is only talking about strictly positive > > integers), which is part of the reason why we are having this discussion). > > What fundamental reason do you have in mind? Why do you use this definition > of divisibility? (I'm curious; other mathematicians give the same > definition, and I can't see why.) > > This thread made me curious, so I did a little library research. I was > surprised to discover that mathematicians discover on this, the domain > of definition of "gcd a b": > > Domain References > ------ ---------- > a /= 0, b /= 0 Lang, "Algebra, 3rd Edition" > Hasse, "Number Theory" > > a, b not both 0 Koblitz, "A Course on Number Theory and Cryptography" > > all a, b allowed MacLane and Birkhoff, "Algebra, 2nd Edition" > Koch, "Number Theory" > > At least the books by Lang and MacLane-Birkhoff are standard references. > Note that the definitions all agree when they are defined (with gcd 0 0 = 0). > > As I said, I was surprised; to me, the definiton with all a and b is the > more natural one. I still recommend using the full domain (especially since > exceptions are awkward to deal with in Haskell), but I'm not as certain. > > Best, > Dylan Thurston > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell From Jan de Wit" <000701c187e5$80c7c1c0$b4e21081@chalmers95a69n> <20011218131214.A18214@noether.math.harvard.edu> <3C1FD725.FFC84D92@nethere.com> Message-ID: <003601c18822$2258e000$2fe5fea9@yatima> Why not define gcd a b as the largest (in 'normal' order) integer d such that the set of sums of multiples of a and b {na+mb | n <- Z, m <- Z} is equal to the set of multiples of d {nd | n <- Z}? Easy to understand, no talk of division, lattices, rings, ideals etcetera, and it covers the cases with 0. Cheers, Jan de Wit From ack@nethere.com Wed Dec 19 00:26:46 2001 From: ack@nethere.com (Michael Ackerman) Date: Tue, 18 Dec 2001 16:26:46 -0800 Subject: gcd oops Message-ID: <3C1FDEC6.54484152@nethere.com> Sorry for an error in my previous message. The definition there of a gcd works only in a prinicpal ideal domain (which covers all the rings mentioned in the examples). According to Bourbaki, chapter on ordered groups, the gcd of two non-zero elements of a UFD A is well-defined as an element of (A-{0})/units, a quotient monoid. So in this context gcd(0, _) is undefined. But Bourbaki adds that this concept is `sometimes' extended to the gcd of a finite family (x_i) of elements some of which may be zero by taking the gcd to be an element d such that for all z, z divides d iff z divides each x_i. Cheers, Michael Ackerman From ashley@semantic.org Wed Dec 19 06:24:24 2001 From: ashley@semantic.org (Ashley Yakeley) Date: Tue, 18 Dec 2001 22:24:24 -0800 Subject: ANN (bis): Release 0.1 of Haskell/Java VM Bridge Message-ID: <200112190624.WAA02738@mail4.halcyon.com> OK, the SourceForge file release system bug has been fixed, so I put the release files up there. Please download from there rather than from semantic.org. Revised, expanded announcement... ------- The first release, 0.1, of Haskell/Java VM Bridge is now available. Haskell/Java VM Bridge allows Haskell programs access to the Java Virtual Machine. Features include: * Calling of Java methods, access to fields, array-handling; * Integration of garbage collectors; * Reconciliation of exception models; * Reconciliation of thread models, including 'synchronized' monitor support and the ability to fork Haskell actions as Java threads; * Strong typing for Java classes and method argument lists (as tuples), and use of Haskell lists as arrays; * Creation of Java classes 'on the fly' (using DefineClass and the Java Class File Format) that can have Haskell callback methods; * Lifted monads which do all the necessary JNI class and method/field ID preloading and 'JNIEnv'-pointer variable handling for you -- these can be automatically generated via a tool (MakeJVMModule); * Layered design includes lower-level IO-based interface; * Automatic generation of modules for Java API classes; * All relevant imports, flags and libraries etc. handled by a single GHC package 'javavm'; * No 'unsafe' Haskell calls or pure function FFI anywhere. This release should be 'beta' quality, but has undergone little testing. You will need: * An x86 machine running some form of Unix; * GHC 5.02 or later; * The appropriate JVM, installed in the appropriate place: - IBM JDK/JRE 1.3 for x86, installed in /usr/lib/ibm-java/IBMJava2-13/ - Blackdown Port of Sun's JRE 1.3/Sun JDK 1.3 for x86, installed in /usr/lib/j2sdk1.3/ and /usr/lib/j2re1.3/ No documentation is currently available, sorry. Two examples have been included: a trivial "hello world" program, and a program that shows a Java Frame containing an instance of a Haskell-defined subclass of Canvas that has a Haskell 'paint' method that draws an oval. You should be able to figure out most of it from that... and of course the source is available from SourceForge CVS. Be sure to download the correct .tar.gz file for your Java VM. Simple installation instructions are included in the file. Haskell/JVM Bridge and source code is licensed under the GNU Lesser GPL. Future plans: * documentation * port to Cygwin * port to Darwin/OS X (waiting on GHC) * use of Java 1.4 API (waiting on Sun, though use of beta versions is possible) -- Ashley Yakeley, Seattle WA From mechvel@math.botik.ru Wed Dec 19 08:12:34 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Wed, 19 Dec 2001 11:12:34 +0300 Subject: x^y. Reply Message-ID: Toralf Wittner writes > [..] > power x y > [..] > | y > 0 = x * power x (y-1) > | y < 0 = 1 / fromInteger x * power x (y+1) > > One recognizes that the function returns either an integer value > if y > 0 or a float value if y < 0. Therefore I can't write a > signature like > pow :: Integer -> Integer -> Integer nor can I do > pow :: Integer -> Integer -> Double. > > [..] > How then would I write this function in Haskell (concerning types)? The type Rational fits the case n < 0 too, and it includes Integer. But if you still need Integer | Double, you can, for example, introduce a new type of a disjoint union of the above two, and then, to compute like this: pow (Intg 2) 2 --> Intg 4 pow (Intg 2) (-2) --> D 0.25 pow (D 2.0) (-2) --> D 0.25 This is achieved by data PowerDom = Intg Integer | D Double deriving(Eq,Show) pow :: PowerDom -> Integer -> PowerDom pow x n = p x n where p (Intg m) n = if n > 0 then Intg $ powerInteger m n else D $ powerDouble (fromInteger m :: Double) n p(D d) n = D $ powerDouble d n powerInteger m n = m^n :: Integer powerDouble :: Double -> Integer -> Double powerDouble d n = ... usual way for float - something like this. ----------------- Serge Mechveliani mechvel@botik.ru From till@doerges.net Wed Dec 19 09:13:45 2001 From: till@doerges.net (Till Doerges) Date: Wed, 19 Dec 2001 10:13:45 +0100 Subject: x^y In-Reply-To: <0GOJ006RUT6O12@neptun.rz.uni-duesseldorf.de>; from wittner@uni-duesseldorf.de on Tue, Dec 18, 2001 at 05:43:33PM +0100 References: <0GOJ006RUT6O12@neptun.rz.uni-duesseldorf.de> Message-ID: <20011219101345.B2662@atlan.wanderer.none> On Tue, Dec 18, 2001 at 05:43:33PM +0100, Toralf Wittner wrote: > power x y > | x == 0 = 0 > | y == 0 = 1 > | y > 0 = x * power x (y-1) > | y < 0 = 1 / fromInteger x * power x (y+1) Why did you put 'fromInteger' into the last line? If you get rid of that, this will make your 'power' be accepted by the haskell-compiler or -interpreter. > One recognizes that the function returns either an integer value if y > 0 or > a float value if y < 0. Therefore I can't write a signature like > pow :: Integer -> Integer -> Integer nor can I do > pow :: Integer -> Integer -> Double. No, you can't, and that's one of the reasons why type-classes where introduced. You don't have to state the type of x and y explicitely. Rather you can specify certain 'properties', i.e. y must be a number, there must be an ordering relation and x must allow for the representation of fractions. --- snip --- Main> :t power power :: (Num a, Ord a, Fractional b) => b -> a -> b Main> power 2 3 8.0 (113 reductions, 147 cells) Main> power 2 (-1) 0.5 (70 reductions, 87 cells) Main> --- snap --- > How then would I write this function in Haskell (concerning types)? See above (the type signature was kindly provided by hugs ;-). HTH -- Till -- e-mail: reverse(net dot doerges at till) | ENCRYPTED | pgp/gpg: keys via keyserver or my homepage | MAIL IS | www: http://www.doerges.net | WELCOME! | From GACOGNE Louis equipe Bernadette Bouchon-Meunier Wed Dec 19 09:33:39 2001 From: GACOGNE Louis equipe Bernadette Bouchon-Meunier (GACOGNE Louis equipe Bernadette Bouchon-Meunier) Date: Wed, 19 Dec 2001 10:33:39 +0100 (MET) Subject: random Message-ID: <200112190933.KAA05235@atlantide.muses> Is there a random function in Hugs 98 on macintosh. I found something about random in the library but I was not able to find a random function running. Louis Gacogne IIE-CNAM allee Jean Rostand 91025 Evry (tel 01 69 36 73 41) Laboratoire d'Informatique de l'Universite Paris VI Place Jussieu 75252 Paris 5 (tel 01 44 27 88 07) http://www.iie.cnam.fr/~gacogne/ From kentk@md.chalmers.se Wed Dec 19 13:04:25 2001 From: kentk@md.chalmers.se (Kent Karlsson) Date: Wed, 19 Dec 2001 14:04:25 +0100 Subject: gcd 0 0 = 0 In-Reply-To: <003601c18822$2258e000$2fe5fea9@yatima> Message-ID: <000001c1888d$b01113c0$b4e21081@chalmers95a69n> Let me try again: greatest -> maximum/supremum of a set of integers (plain everyday order) common -> intersection (plain everyday intersection of sets) divisor (of an integer value v) -> an integer value m, such that v/m is defined and, if so, is an integer factor (of an integer value v) -> an integer value m, such that there is an integer value n such that m*n=v So (mock Haskell syntax; set expression really): greatest_common_divisor a b = max (intersection {all divisors of a} {all divisors of b}) What is the supremum (result of max in the expression above) if a and b are both 0? (You're allowed to use values not prescribed by Haskell to exist. ;-) (You can replace "divisors" by "factors" in that expression and still get the same result.) I may agree that an operation *similar* to gcd, where <0,0> as argument returns 0 is useful (maybe even more useful than gcd!). But that operation is still not the gcd (and might even return other results thaN gcd also for other value pairs than <0,0>; in particlar negatives; depending on what is found most useful). If you want to replace gcd by some other, similar, operation, please go ahead. But call it something else, because it is something else. If you want to generalise that to polynomials or Gaussian integers (or at least imaginary integers, as opposed to complex integers), fine (though not for the current standard Haskell library). (Micheal, I am interested in the Guassian integer variety of this. If you like, you can expand on what you said in an off-list message, or give me a reference.) Kind (and somewhat fundamentalist) regards /kent k > -----Original Message----- > From: haskell-admin@haskell.org [mailto:haskell-admin@haskell.org]On > Behalf Of Jan de Wit > Sent: den 19 december 2001 01:15 > To: haskell@haskell.org > Subject: Re: gcd 0 0 = 0 > > > Why not define gcd a b as the largest (in 'normal' order) > integer d such > that the set of sums of > multiples of a and b {na+mb | n <- Z, m <- Z} is equal to the set of > multiples of d > {nd | n <- Z}? Easy to understand, no talk of division, > lattices, rings, > ideals etcetera, and it covers the cases with 0. > > Cheers, Jan de Wit > > > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell From mechvel@math.botik.ru Wed Dec 19 13:25:17 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Wed, 19 Dec 2001 16:25:17 +0300 Subject: FiniteMap for standard Message-ID: Long ago I suggested to include FiniteMap into Haskell-98 standard library. Is it still late to do this, or maybe, the situation has changed? ----------------- Serge Mechveliani mechvel@botik.ru From icalp2002@lcc.uma.es Wed Dec 19 13:39:55 2001 From: icalp2002@lcc.uma.es (icalp2002@lcc.uma.es) Date: Wed, 19 Dec 2001 14:39:55 +0100 Subject: ICALP2002 call for papers Message-ID: We apologize for possible multiple postings. In http://www.lcc.uma.es/icalp2002 you can find a pdf version of this call for paper. +++++++++++++++++++++++++++++++++++++ Last information: Second version of the WEB pages at http://www.lcc.uma.es/icalp2002 Workshops confirmed: Computability and Complexity in Analysis (CCA 2002) Algorithmic Methods and Models for Optimization of Railways ATMOS 2002 7 th International Workshop on Formal Methods for Industrial Critical Systems Foundations of Wide Area Network Computing Invited speakers confirmed: Heikki Mannila Manuel Hermenegildo +++++++++++++++++++++++++++++++++++++ Call for Papers ICALP 2002 29th International Colloquium on Automata, Languages and Programming July 8-13, 2002, Málaga, Spain Camera Ready: April 16, 2002 The 29th annual meeting of the European Association of Theoretical Computer Science will be held in Málaga, Spain, July 8-13, 2002 (at the E.T.S. Ingeniería Informática). As with the Journal Theoretical Computer Science (TCS), the scientific program of the Colloquium will be split into two parts: Track A of the meeting will correspond to Algorithms, Automata, Complexity and Games, while Track B to Logic, Semantics and Theory of Programming. SUBMISIONS: Authors are invited to submit extended abstract of their papers, presenting original contributions to the theory of computer science. Detailed instructions for paper submissions will be found on the conference webpage (http://www.lcc.uma.es/icalp2002) and in future calls for papers. Submissions should consist of: a cover page, with the author's full name, address, fax number, e-mail address, a 100-word abstract, keywords and to which track (A or B) the paper is being submitted and an extended abstract describing original research. At least one author of an accepted paper should be available to present it at the conference. Simultaneous submission to other conferences with published proceedings is not allowed. Further information (dates and instructions for submissions, workshops, registration, location and travel) will be provided in future announcements. ORGANIZING COMMITEE: Buenaventura Clares (University of Granada), Ricardo Conejo (University of Málaga), Inmaculada Fortes (University of Málaga), Llanos Mora (University of Málaga), Rafael Morales (co-Chair, University of Málaga), Marlon Nuñez (University of Málaga), José Luis Pérez de la Cruz (University of Málaga), Gonzalo Ramos (University of Málaga), Francisco Triguero (co-Chair, University of Málaga), José Luis Triviño (University of Málaga). IMPORTANT DATES: Workshops proposal: November 8, 2001 Submissions: January 14, 2002 Notification: March 20, 2002 CONFERENCE CO-CHAIRS Prof. Francisco Triguero Prof. Rafael Morales Universidad de Málaga E.T.S. Ingeniería Informática Dept. Lenguajes y Ciencias de la Computación Bulevar Louis Pasteur, 35 29071 - Málaga (SPAIN) e-mail: icalp2002@informatica.uma.es PROGRAM COMMITEE Track A Ricardo Baeza-Yates (U. Chile) Volker Diekert (U. Stuttgart) Paolo Ferragina (U. Pisa) Catherine Greenhill (U. Melbourne) Torben Hagerup (U. Frankfurt) Johan Håstad (KTH, Stockholm) Gabriel Istrate (Los Alamos) Claire Kenyon (U. Paris XI) Der-Tsai Lee (Acad. Sinica, Taipei) Heikki Mannila (Nokia, Helsinki) Elvira Mayordomo (U. Zaragoza) Helmut Prodinger (U. Witwatersrand, South Africa) Jan van Leeuwen(U. Utrecht) Paul Vitányi (CWI, Amsterdam) Peter Widmayer (ETH Zürich) (Chair) Gerhard Woeginger (T.U. Graz) Christos Zaroliagis (U. Patras) Track B Martín Abadi (Bell Labs Research, Lucent) Roberto Amadio (U. Provence) Gilles Barthe (INRIA-SophiaAntipolis) Manfred Droste (University of Technology Dresden) Cédric Fournet (Microsoft Cambridge) Matthew Hennessy (U. Sussex) (Chair) Furio Honsell (U. Udine) Peter O'Hearn (Queen Mary & W. C. London) Fernando Orejas (U.P.Catalunya) Ernesto Pimentel (U. Málaga) David Sands (Chalmers University of Technology and Göteborg University) Dave Schmidt (U. Kansas) Gheorghe Stefanescu (U. Bucharest) Vasco Vasconcelos (U. Lisbon) Thomas Wilke (U. Kiel) +++++++++++++++++++++++++++++++++++++++++++ Malaga University uses Christmas holidays for backup and maintenance of his network. If you have problem to arrive to ICALP 2002 main page, please retry again later. If you get to the page http://www.lcc.uma.es but not to the page http://www.lcc.uma.es/icalp2002 contact with us: conejo@lcc.uma.es morales@lcc.uma.es From simonpj@microsoft.com Wed Dec 19 13:43:46 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Wed, 19 Dec 2001 05:43:46 -0800 Subject: FiniteMap for standard Message-ID: <1113DDB24D4A2841951BFDF86665EE1906665C@RED-MSG-10.redmond.corp.microsoft.com> Much, much too late, however desirable. | -----Original Message----- | From: S.D.Mechveliani [mailto:mechvel@math.botik.ru]=20 | Sent: 19 December 2001 13:25 | To: haskell@haskell.org | Subject: FiniteMap for standard |=20 |=20 | Long ago I suggested to include FiniteMap into Haskell-98=20 | standard library. | Is it still late to do this, or maybe, the situation has changed?=20 |=20 | ----------------- | Serge Mechveliani | mechvel@botik.ru |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From wittner@uni-duesseldorf.de Wed Dec 19 14:11:06 2001 From: wittner@uni-duesseldorf.de (Toralf Wittner) Date: Wed, 19 Dec 2001 15:11:06 +0100 Subject: x^y. Reply In-Reply-To: References: Message-ID: <0GOL00IC6GSOOO@neptun.rz.uni-duesseldorf.de> On Wednesday, 19. December 2001 09:12, S.D.Mechveliani wrote: [...] > But if you still need Integer | Double, you can, for example, > introduce a new type of a disjoint union of the above two, and then, > to compute like this: > pow (Intg 2) 2 --> Intg 4 > pow (Intg 2) (-2) --> D 0.25 > pow (D 2.0) (-2) --> D 0.25 > This is achieved by > > data PowerDom = Intg Integer | D Double deriving(Eq,Show) > > pow :: PowerDom -> Integer -> PowerDom > pow x n = p x n > where > p (Intg m) n = if n > 0 then Intg $ powerInteger m n > else D $ powerDouble (fromInteger m :: Double) n > p(D d) n = D $ powerDouble d n > > powerInteger m n = m^n :: Integer > > powerDouble :: Double -> Integer -> Double > powerDouble d n = ... usual way for float > > - something like this. This seems to be what I want. I tried it this way: module Main where import System main = do [a1, a2] <- getArgs let x = read a1 let y = read a2 in putStrLn (show x ++ " ^ " ++ show y ++ " = " ++ show (pow x y)) data PowerNum = INT Integer | DBL Double deriving (Eq, Show, Read) pow :: PowerNum -> Integer -> PowerNum pow x y = z x y where z (INT x) y = if y > 0 then INT $ powInteger x y else DBL $ powDouble (fromInteger x) y z (DBL x) y = DBL $ powDouble x y powInteger x y | x == 0 = 0 | y == 0 = 1 | y > 0 = x * powInteger x (y - 1) powDouble x y | x == 0 = 0 | y == 0 = 1 | y > 0 = 1 / x * powDouble x (y - 1) While GHC compiled this code I get a runtime error: Fail: Prelude.read: no parse and HUGS reports: ERROR: Illegal Haskell 98 class constraint in inferred type *** Expression : pow 1 2 *** Type : Num PowerNum => PowerNum Could you tell me what I did wrong? Thank you very much! Toralf > > > ----------------- > Serge Mechveliani > mechvel@botik.ru From wittner@uni-duesseldorf.de Wed Dec 19 15:30:41 2001 From: wittner@uni-duesseldorf.de (Toralf Wittner) Date: Wed, 19 Dec 2001 16:30:41 +0100 Subject: x^y. Reply In-Reply-To: References: Message-ID: <0GOL005G2KHDMK@neptun.rz.uni-duesseldorf.de> Ahh - sorry, too much cut and paste ;-) data PowerNum = INT Integer | DBL Double deriving (Eq, Show, Read) pow :: PowerNum -> Integer -> PowerNum pow x y = z x y where z (INT x) y = if y > 0 then INT $ powInteger x y else if y == 0 then INT $ 1 else DBL $ powDouble (fromInteger x) y z (DBL x) y = DBL $ powDouble x y powInteger x y | x == 0 = 0 | y == 0 = 1 | y > 0 = x * powInteger x (y - 1) powDouble x y | x == 0 = 0 | y == 0 = 1 | y < 0 = 1 / x * powDouble x (y + 1) Now it basically works. However wouldn't it have been easier to write something like this: module Main where import System main = do [a1, a2] <- getArgs let x = read a1 let y = read a2 in if y >= 0 then putStrLn (show x ++ " ^ " ++ show y ++ " = " ++ show (powPos x y)) else putStrLn (show x ++ " ^ " ++ show y ++ " = " ++ show (powNeg x y)) powPos :: Integer -> Integer -> Integer powPos x y | x == 0 = 0 | y == 0 = 1 | y > 0 = x * powPos x (y - 1) powNeg :: Integer -> Integer -> Double powNeg x y | x == 0 = 0 | y == 0 = 1 | y < 0 = 1 / fromInteger x * powNeg x (y + 1) Initially I wanted something as terse as the Python version, now I either have to write two functions or I need to define a type. Is there not an easier way to come as close as possible to the Python version? Thanks anyway - learnt a lot! Toralf From hdaume@ISI.EDU Thu Dec 20 00:18:35 2001 From: hdaume@ISI.EDU (Hal Daume III) Date: Wed, 19 Dec 2001 16:18:35 -0800 (PST) Subject: global counters Message-ID: Please, no tirade about banishing unsafePerformIO. I've seen this done before I just don't remember how. I want to use a state monad to count things, but don't want to monadify the thing I'm using the counter in. basically, i want a function getVar :: () -> String which returns a new string every time. i tried this: > curVarId = newSTRef (0 :: Integer) > > {-# NO-INLINE newVar -} > > newVar = \_ -> ('\0' : show x) > where y = unsafePerformIO (stToIO curVarId) > x = unsafePerformIO $ stToIO $ > do x <- readSTRef y > writeSTRef y (x + 1) > return x and in ghci it works wonderfully, but when i actually compile, all i get is "\NUL0". what's the proper way to write this? thanks - hal From mechvel@math.botik.ru Thu Dec 20 08:00:17 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Thu, 20 Dec 2001 11:00:17 +0300 Subject: x^y. Reply Message-ID: Toralf Wittner writes > [..] > data PowerNum = INT Integer | DBL Double deriving (Eq, Show, Read) > [..] > Now it basically works. However wouldn't it have been easier to write > something like this: > > powPos :: Integer -> Integer -> Integer > [..] > powNeg :: Integer -> Integer -> Double > [..] > | y < 0 = 1 / fromInteger x * powNeg x (y + 1) > > Initially I wanted something as terse as the Python version, now I either > have to write two functions or I need to define a type. Is there not an > easier way to come as close as possible to the Python version? > > Thanks anyway - learnt a lot! For this particular task, the most natural solution is, probably, pow :: Fractional a => a -> Integer -> a pow a n = if n > 0 then a^n else (1/a)^(- n) (^) is of standard, only pow adds the facility of negative n. Then, you need each time to convert the argument to appropriate type of Fractional: pow (fromInteger 2 :: Ratio.Rational) 2 --> 4 % 1 pow (fromInteger 2 :: Ratio.Rational) (-2) --> 1 % 4 pow (2 :: Double) (-2) --> 0.25 pow (2 :: Integer) (-2) --> ... No instance for (Fractional Integer) If you replace standard (and not lucky) Fractional with some class Foo (with multiplication mul and division div), make Integer an instance of Foo (where div may fail for some data), and program pow :: Foo a => a -> Integer -> a via mul, div, then it would work like this: pow (2 :: Integer) 2 --> 4 pow (2 :: Integer) (-2) --> "Error: cannot invert 2 :: Integer" pow (2 :: Rational) (-2) --> 1%4 Another way is to try to straggle with overlapping instances by defining something like this: class Pow a b where pow :: a -> Integer -> b instance Num a => Pow a a where pow = (^) Fractional ? instance Num a => Pow Integer a where pow = ? If this succeeds, there will be also no need in new type constructors. ----------------- Serge Mechveliani mechvel@botik.ru From Jan de Wit" Message-ID: <001401c18936$92ba3280$2fe5fea9@yatima> > basically, i want a function getVar :: () -> String which returns a new > string every time. i tried this: > > > curVarId = newSTRef (0 :: Integer) > > > > {-# NO-INLINE newVar -} > > > > newVar = \_ -> ('\0' : show x) > > where y = unsafePerformIO (stToIO curVarId) > > x = unsafePerformIO $ stToIO $ > > do x <- readSTRef y > > writeSTRef y (x + 1) > > return x > > and in ghci it works wonderfully, but when i actually compile, all i get > is "\NUL0". > > what's the proper way to write this? I think (haven't tested this one) you should write (modulo layout): | curVarIdRef :: IORef Integer | curVarIdRef = unsafePerformIO $ newIORef (0 :: Integer) | | {-# NO-INLINE newVar -} | | newVar :: () -> String | newVar = \_ -> ('\0' : show x) where | x = unsafePerformIO $ | do x <- readIORef curVarIdRef | writeIORef curVarIdRef (x + 1) | return x Because in your original version, curVarId allocates a new reference to 0 every time newVar is called. Hope this works, Jan de Wit From johanj@cs.uu.nl Thu Dec 20 08:07:27 2001 From: johanj@cs.uu.nl (Johan Jeuring) Date: Thu, 20 Dec 2001 09:07:27 +0100 Subject: Working Conference on Generic Programming, 2nd call for papers Message-ID: <20011220080952.E517D4538@mail.cs.uu.nl> WCGP '02 IFIP WG2.1 Working Conference on GENERIC PROGRAMMING http://www.generic-programming.nl/wcgp/cfp.html Organised in conjunction with MPC'02 July 8 - July 13, 2002 Dagstuhl, Germany CALL FOR PAPERS Generic programming is about making programs more adaptable by making them more general. Generic programs often embody non-traditional kinds of polymorphism; ordinary programs are obtained from them by suitably instantiating their parameters. In contrast with normal programs, the parameters of a generic programs are often quite rich in structure. For example they may be other programs, types or type constructors, class hierarchies, or even programming paradigms. Generic programming techniques have always been of interest, both to practitioners and to theoreticians, but only recently have generic programming techniques become a specific focus of research in the functional and object-oriented programming language communities. This working conference will bring together leading researchers in generic programming from around the world, and feature papers capturing the state of the art in this important emerging area. We welcome contributions on all aspects, theoretical as well as practical, of generic programming, aspect-oriented programming, polytypic programming, adaptive object-oriented programming, generic components, and so on. SUBMISSION Full papers should be submitted in Postscript or pdf format by e-mail to reach Jeremy.Gibbons@comlab.ox.ac.uk by February 16, 2002. The details of the submission procedure can be found at http://www.generic-programming.nl/wcgp/submit.html Although there is no page limit, submissions should strive for brevity and clarity. IMPORTANT DATES Submission February 16, 2002 Notification April 12, 2002 Final version due May 24, 2002 PROGRAMME COMMITTEE Matt Austern Eerke Boiten Ulrich Eisenecker Jeremy Gibbons (co-chair) Ralf Hinze Johan Jeuring (co-chair) Gary Leavens Karl Lieberherr Lambert Meertens Eugenio Moggi Bernhard Moeller Oege de Moor David Musser Martin Odersky Ross Paterson Simon Peyton Jones Colin Runciman Doaitse Swierstra Stephanie Weirich LOCAL ORGANISATION Jeremy Gibbons Johan Jeuring Bernhard Moeller CORRESPONDENCE Jeremy Gibbons (Jeremy.Gibbons@comlab.ox.ac.uk) Johan Jeuring (johan@jeuring.net) From bernhard@cogs.susx.ac.uk Thu Dec 20 15:05:56 2001 From: bernhard@cogs.susx.ac.uk (Bernhard Reus) Date: Thu, 20 Dec 2001 15:05:56 +0000 Subject: installation problems with graphics-2.0.4 Message-ID: <3C21FE54.2EBCC4B7@cogs.susx.ac.uk> The graphics lib of the new December release does not compile with the shipped makefile. The makefile does not do anything at all??? Maybe there is a problem with wildcard extensions? To be honest, I have no clue. I am using a Sparc5/Solaris machine. Any help appreciated. Thanks in advance, Bernhard From igloo@earth.li Thu Dec 20 21:49:03 2001 From: igloo@earth.li (Ian Lynagh) Date: Thu, 20 Dec 2001 21:49:03 +0000 Subject: unsafePerformIO to give warnings Message-ID: <20011220214903.A2358@stu163.keble.ox.ac.uk> Hi all If I want to give warnings when doing something and I don't care too much about the order they appear in, can I use this? foo x = if success x then Just x else warn "Working out x went wrong" Nothing warn :: String -> a -> a warn s x = unsafePerformIO (hPutStrLn stderr s) `seq` x The hslibs docs say If the I/O computation wrapped in unsafePerformIO performs side effects, then the relative order in which those side effects take place (relative to the main I/O trunk, or other calls to unsafePerformIO) is indeterminate. but it's not entirely clear on whether or not I could end up with 2 warnings interspersed? And is it guaranteed that the warnings will be printed at some point? hugs and ghci only seem to print the first warning, but ISTR similar problems happen with threads and got the impression that they were in the wrong. Thanks Ian From simonpj@microsoft.com Fri Dec 21 09:35:37 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 21 Dec 2001 01:35:37 -0800 Subject: "The signature contexts in a mutually recursive group should all be identical"; why? Message-ID: <1113DDB24D4A2841951BFDF86665EE19374689@RED-MSG-10.redmond.corp.microsoft.com> [Note to the Haskell list. The question this thread is discussing is whether the H98 rule that all the functions in a mutually=20 recursive group must have the same context, is a show stopper.] | Oeer. Come to think of it, if f is getting the dictionary=20 | (in the real world | example) from the context, rather than from the existential=20 | type, I fear it may be getting the wrong dictionary, and will=20 | crash badly when I try to run the code. =20 No I don't think that can happen. But I have thought of a test case data T =3D forall a. Eq a =3D> MkT a a T | Nil f :: T -> Bool f Nil =3D True f (MkT x y t) =3D g x y t g :: Eq b =3D> b -> b -> T -> Bool g x y t =3D (x=3D=3Dy) && f t Notice that (a) f and g are mutually recursive (b) They have different contexts in their type sig (c) If they were made the same, f would get an ambiguous type f :: Eq a =3D> T -> Bool (d) Haskell's polymorphic recursion is essential here; each call to g may be at a different type So it looks to me that, in the presence of existentials, the H98 rule goes from being moot to being throughly awkward.=20 Mark's THIH paper shows that there's no real need for the rule, because one can type-check the bindings without type sigs as a group, and then the ones with type sigs one by one. =20 But what happens for pattern-bindings that bind more than one variable. Must all those variables have the same context? (I hope so.) Needless to say, I'm not proposing any changes in H98! But I thought the example would be of interest. Maybe it's well known, but it wasn't to me. Simon From sk@cs.brown.edu Fri Dec 21 06:36:16 2001 From: sk@cs.brown.edu (Shriram Krishnamurthi) Date: Fri, 21 Dec 2001 01:36:16 -0500 (EST) Subject: ICFP (Functional Programming) 2002: Call for Papers Message-ID: <200112210636.BAA10106@bosch.cs.brown.edu> --------------------------------------------- * Calling all functional programmers! * * ICFP'02 needs you! * --------------------------------------------- ICFP 2002: International Conference on Functional Programming Pittsburgh, 3--5 October 2002 CALL FOR PAPERS http://icfp2002.cs.brown.edu/ Paper submission deadline: 21 March 2002 General Chair: Mitchell Wand, Northeastern University Program Chair: Simon Peyton Jones, Microsoft Research ICFP 2002 seeks original papers on the full spectrum of the art, science, and practice of functional programming. The conference invites submissions on all topics ranging from principles to practice, from foundations to features, and from abstraction to application. The scope covers all languages that encourage programming with functions, including both purely applicative and imperative languages, as well as languages that support objects and concurrency. You can find the full call for papers at http://icfp2002.cs.brown.edu/ Program Committee Matthias Blume (Lucent) Margaret Burnett (Oregon State University) Manuel Chakravarty (University of New South Wales) Matthew Flatt (University of Utah) Haruo Hosoya (Kyoto University) Uwe Nestmann (EPFL, Lausanne) Chris Okasaki (United States Military Academy) Norman Ramsey (Harvard University) David Sands (Chalmers University) Olin Shivers (Georgia Tech) Stephanie Weirich (Cornell) Joe Wells (Heriot Watt University) From simonmar@microsoft.com Fri Dec 21 10:21:06 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Fri, 21 Dec 2001 10:21:06 -0000 Subject: unsafePerformIO to give warnings Message-ID: <9584A4A864BD8548932F2F88EB30D1C607C0BAA4@TVP-MSG-01.europe.corp.microsoft.com> > If I want to give warnings when doing something and I don't care too > much about the order they appear in, can I use this? >=20 > foo x =3D if success x then Just x > else warn "Working out x went wrong" Nothing >=20 > warn :: String -> a -> a > warn s x =3D unsafePerformIO (hPutStrLn stderr s) `seq` x This is what IOExts.trace is for, BTW. > The hslibs docs say >=20 > If the I/O computation wrapped in unsafePerformIO performs side > effects, then the relative order in which those side effects take > place (relative to the main I/O trunk, or other calls to > unsafePerformIO) is indeterminate. >=20 > but it's not entirely clear on whether or not I could end up with 2 > warnings interspersed? It is possible to get warnings interspersed if you write something like warn ("abc" ++ warn "foo" "def") > And is it guaranteed that the warnings will be printed at some point? All that is guaranteed is that if an expression 'warn a b' is evaluated then 'a' will be evaluated to a String and then printed. > hugs and ghci only seem to print the first warning, but ISTR similar > problems happen with threads and got the impression that they were in > the wrong. Are you sure that laziness and/or optimisation aren't to blame for only getting a single warning? Given that you say Hugs also produces the same result, it sounds like a laziness issue. Cheers, Simon From chak@cse.unsw.edu.au Fri Dec 21 10:17:54 2001 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Fri, 21 Dec 2001 21:17:54 +1100 Subject: 2002 Haskell Workshop Message-ID: <20011221211754E.chak@cse.unsw.edu.au> [My apologies if you receive multiple copies of this message] ------------------------------ PROVISIONAL CALL FOR PAPERS (Approval for PLI'02 pending) ------------------------------ 2002 Haskell Workshop Pittsburgh, PA, USA (3rd, 7th, or 8th October 2002; exact date to be announced) ================================== The purpose of the Haskell Workshop is to discuss experience with Haskell, and possible future developments for the language. The scope of the workshop includes all aspects of the design, semantics, theory, application, implementation, and teaching of Haskell. Previous Haskell Workshops have been held in La Jolla (1995), Amsterdam (1997), Paris (1999), Montreal (2000), and Firenze (2001). For detailed information and key dates please consult http://www.cse.unsw.edu.au/~chak/hw2002/ From simonpj@microsoft.com Fri Dec 21 11:09:42 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 21 Dec 2001 03:09:42 -0800 Subject: Haskell 98 Christmas release Message-ID: <1113DDB24D4A2841951BFDF86665EE1937468E@RED-MSG-10.redmond.corp.microsoft.com> In my Sisyphian task of finishing the Haskell 98 Report, I thought I would put out the current version before Xmas. =20 http://research.microsoft.com/~simonpj/haskell98-revised It's substantially the same as the one I put out at the start=20 of December, with three exceptions 1. The layout algorithm has changed (again). Simon M, Ian L and I are now all fairly confident that it is right, but we have been proved wrong before. 2. The "instance declaration wart" turned out to be closely connnected to some (unspecified) scoping issues in export lists. So I have=20 nailed all that down. GHC and Hugs both now implement the new rules. 3. The avalance of email about the True Meaning of gcd 0 0 cannot=20 have escaped your notice. I am too stupid to understand most of it, but my ill-informed conclusion is: a) there is a lot of support for gcd 0 0 =3D 0 b) but it is not universal support The strong default for H98 is "no change", so I've left gcd 0 0 as an error. However I have added some examples. Changes since the early-dec release are marked [Late Dec 2001] in the Bugs List, so you can find them easily. I don't think I know of any other loose ends. Happy reading. Simon From ross@soi.city.ac.uk Fri Dec 21 11:14:12 2001 From: ross@soi.city.ac.uk (Ross Paterson) Date: Fri, 21 Dec 2001 11:14:12 +0000 Subject: "The signature contexts in a mutually recursive group should all be identical"; why? In-Reply-To: <1113DDB24D4A2841951BFDF86665EE19374689@RED-MSG-10.redmond.corp.microsoft.com> References: <1113DDB24D4A2841951BFDF86665EE19374689@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <20011221111411.GA1143@soi.city.ac.uk> On Fri, Dec 21, 2001 at 01:35:37AM -0800, Simon Peyton-Jones wrote: > [Note to the Haskell list. The question this thread is discussing > is whether the H98 rule that all the functions in a mutually > recursive group must have the same context, is a show stopper.] > > [...] > > So it looks to me that, in the presence of existentials, the H98 > rule goes from being moot to being throughly awkward. It's not moot -- it steers the following (admittedly artificial) example into the monomorphism restriction: foo :: Eq a => a -> Bool foo x = x == x && bar -- bar :: Bool bar = foo 'a' With the declaration, it fails the "identical context" rule (though Hugs then accepts it in violation of H98). The definition of "declaration group" could have been relaxed when explicit type signatures were added: if a variable has one, then bindings using the variable should depend on the type signature, not the binding of the variable, so in the above example would be analysed as three declaration groups: (1) foo :: Eq a => a -> Bool (2) bar = foo 'a' -- depends on (1) (3) foo x = x == x && bar -- depends on (2) As it is, some extra language was tacked on to exempt variables with explicit signatures from the mutual type inference, as well as to impose this restriction. H98 glitch: the phrase "declaration group" is used in 4.4.2 with a different meaning to that defined in 4.5.1. "sequence of declarations"? From igloo@earth.li Fri Dec 21 12:25:31 2001 From: igloo@earth.li (Ian Lynagh) Date: Fri, 21 Dec 2001 12:25:31 +0000 Subject: unsafePerformIO to give warnings In-Reply-To: <9584A4A864BD8548932F2F88EB30D1C607C0BAA4@TVP-MSG-01.europe.corp.microsoft.com>; from simonmar@microsoft.com on Fri, Dec 21, 2001 at 10:21:06AM -0000 References: <9584A4A864BD8548932F2F88EB30D1C607C0BAA4@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: <20011221122531.A6180@stu163.keble.ox.ac.uk> On Fri, Dec 21, 2001 at 10:21:06AM -0000, Simon Marlow wrote: > > > If I want to give warnings when doing something and I don't care too > > much about the order they appear in, can I use this? > > > > foo x = if success x then Just x > > else warn "Working out x went wrong" Nothing > > > > warn :: String -> a -> a > > warn s x = unsafePerformIO (hPutStrLn stderr s) `seq` x > > This is what IOExts.trace is for, BTW. Doh - I associate that with debugging and it never even occurred to me! > > warnings interspersed? > > It is possible to get warnings interspersed if you write something like > > warn ("abc" ++ warn "foo" "def") Ah, yes, OK, thanks. > > hugs and ghci only seem to print the first warning, but ISTR similar > > problems happen with threads and got the impression that they were in > > the wrong. > > Are you sure that laziness and/or optimisation aren't to blame for only > getting a single warning? Given that you say Hugs also produces the > same result, it sounds like a laziness issue. Sorry, I meant "hugs and ghci only seem to print the warning the first time I run the program", e.g. with module Main where import IOExts main :: IO() main = trace "foo" (putStrLn "bar") in hugs: [...] Type :? for help Main> main foobar Main> main bar Main> main bar Main> main bar and in ghci: Skipping Main ( q.lhs, ./q.o ) Main> main foo bar Main> main bar Main> main bar Main> main bar Main> Thanks again Ian From simonmar@microsoft.com Fri Dec 21 12:29:05 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Fri, 21 Dec 2001 12:29:05 -0000 Subject: unsafePerformIO to give warnings Message-ID: <9584A4A864BD8548932F2F88EB30D1C607C0BB2B@TVP-MSG-01.europe.corp.microsoft.com> Ian Lynagh writes: > Sorry, I meant "hugs and ghci only seem to print the warning the first > time I run the program", e.g. with >=20 > module Main where >=20 > import IOExts >=20 > main :: IO() > main =3D trace "foo" (putStrLn "bar") >=20 > in hugs: >=20 > [...] > Type :? for help > Main> main > foobar >=20 > Main> main > bar [snip] > and in ghci: >=20 > Skipping Main ( q.lhs, ./q.o ) > Main> main > foo > bar > Main> main > bar [snip] This is because 'main' is a CAF: the act of reducing it to normal form the first time forces the warning to be printed, but thereafter the evaluated version is returned immediately. To subvert this behaviour, in GHCi you can say ':set +r' which causes all CAFs to be reverted between evaluations. Cheers, Simon From Malcolm.Wallace@cs.york.ac.uk Fri Dec 21 13:23:00 2001 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Fri, 21 Dec 2001 13:23:00 +0000 Subject: ICFP (Functional Programming) 2002: Call for Papers In-Reply-To: <200112210636.BAA10106@bosch.cs.brown.edu> Message-ID: > ICFP 2002: International Conference on Functional Programming > Pittsburgh, 3--5 October 2002 The email announcement says 3-5 Oct, the webpage says 4-6 Oct. Which are the true dates for ICFP? Regards, Malcolm From simonpj@microsoft.com Fri Dec 21 13:57:42 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 21 Dec 2001 05:57:42 -0800 Subject: ICFP (Functional Programming) 2002: Call for Papers Message-ID: <1113DDB24D4A2841951BFDF86665EE19374690@RED-MSG-10.redmond.corp.microsoft.com> It's definitely 4-6 Oct. I'm sorry about the confusion. Simon | -----Original Message----- | From: Malcolm Wallace [mailto:Malcolm.Wallace@cs.york.ac.uk]=20 | Sent: 21 December 2001 13:23 | To: haskell@haskell.org | Subject: Re: ICFP (Functional Programming) 2002: Call for Papers |=20 |=20 | > ICFP 2002: International Conference on Functional Programming | > Pittsburgh, 3--5 October 2002 |=20 | The email announcement says 3-5 Oct, the webpage says 4-6=20 | Oct. Which are the true dates for ICFP? |=20 | Regards, | Malcolm From rjmh@cs.chalmers.se Fri Dec 21 16:04:05 2001 From: rjmh@cs.chalmers.se (John Hughes) Date: Fri, 21 Dec 2001 17:04:05 +0100 (MET) Subject: New extension in GHC: newtype deriving clause Message-ID: <200112211604.RAA01425@hotlips.cs.chalmers.se> Simon PJ and I have come up with an extension to newtype deriving clauses which is intended to make it easier to make types abstract. Suppose you are about to write a type definition. You face a choice between defining it as a type synonym, and making it a new, potentially abstract type. Often a newtype may be the "right" choice, but that may require substantial extra work. Specifically, if the representation type already has a number of useful class instances, which you also want on the newtype, then a type synonym gives you them for free -- but a newtype definition forces you to write an instance declaration for each instance you want. These instance declarations are boring to write: they just strip off and put back the newtype constructor here and there, and call the representation instance. Especially galling is that in the implementation, the newtype constructor doesn't even appear -- so all your work is "for nothing", the dictionary for the representation type would actually work perfectly well for the new type also. The work of defining these instances may be enough to put you off making the new type abstract. The new extension allows you to derive these instances, just by adding the classes to the deriving clause of the newtype declaration. It's implemented in GHC already and will be part of the next release. I've appended the manual entry describing the extension to this message: that contains examples and a careful definition of when an instance can be derived. I'll just remark that you can also use this extension to emulate Hugs' restricted type synonyms. Suppose you want to implement an abstract type of sets as lists, and define the set operations without needing to constantly add and remove a newtype constructor. You can do so as follows: 1. Define a class containing the operations inside the abstraction barrier. This corresponds to giving the type signatures of these functions in the Hugs construct. class SetLike s where empty :: s a single :: a -> s a union :: s a -> s a -> s a member :: Eq a => a -> s a -> Bool (This isn't supposed to be a general Collection class: we're just defining the types of function on sets-as-lists), 2. Define an instance for the representation type. Of course, there's no need to mess with any newtype constructor here. instance SetLike [] where empty = [] single x = [x] union = (++) member = elem 3. Define a new Set type, and derive a class instance for it. newtype Set a = Set [a] deriving SetLike That's it. Of course, the Set operations are now overloaded, which has its own penalties, but nevertheless we managed to define operations on an abstract type without explicitly worrying about the constructor. Here's the manual entry: Extended deriving clause for newtype ==================================== When you define an abstract type using newtype, you may want the new type to inherit some instances from its representation. In Haskell 98, you can inherit instances of Eq, Ord, Enum and Bounded by deriving them, but for any other classes you have to write an explicit instance declaration. For example, if you define newtype Dollars = Dollars Int and you want to use arithmetic on Dollars, you have to explicitly define an instance of Num: instance Num Dollars where Dollars a + Dollars b = Dollars (a+b) ... All the instance does is apply and remove the newtype constructor. It is particularly galling that, since the constructor doesn't appear at run-time, this instance declaration defines a dictionary which is wholly equivalent to the Int dictionary, only slower! GHC permits such instances to be derived instead, so one can write newtype Dollars = Dollars Int deriving (Eq,Show,Num) and the implementation uses the same Num dictionary for Dollars as for Int. Notionally, the compiler derives an instance declaration of the form instance Num Int => Num Dollars which just adds or removes the newtype constructor according to the type. We can also derive instances of constructor classes in a similar way. For example, suppose we have implemented state and failure monad transformers, such that instance Monad m => Monad (State s m) instance Monad m => Monad (Failure m) In Haskell 98, we can define a parsing monad by type Parser tok m a = State [tok] (Failure m) a which is automatically a monad thanks to the instance declarations above. With the extension, we can make the parser type abstract, without needing to write an instance of class Monad, via newtype Parser tok m a = Parser (State [tok] (Failure m) a) deriving Monad In this case the derived instance declaration is of the form instance Monad (State [tok] (Failure m)) => Monad (Parser tok m) Notice that, since Monad is a constructor class, the instance is a partial application of the new type, not the entire left hand side. We can imagine that the type declaration is ``eta-converted'' to generate the context of the instance declaration. We can even derive instances of multi-parameter classes, provided the newtype is the last class parameter. In this case, a ``partial application'' of the class appears in the deriving clause. For example, given the class class StateMonad s m | m -> s where ... instance Monad m => StateMonad s (State s m) where ... then we can derive an instance of StateMonad for Parsers by newtype Parser tok m a = Parser (State [tok] (Failure m) a) deriving (Monad, StateMonad [tok]) The derived instance is obtained by completing the application of the class to the new type: instance StateMonad [tok] (State [tok] (Failure m)) => StateMonad [tok] (Parser tok m) As a result of this extension, all derived instances in newtype declarations are treated uniformly (and implemented just by reusing the dictionary for the representation type), except Show and Read, which really behave differently for the newtype and its representation. Derived instance declarations are constructed as follows. Consider the declaration (after expansion of any type synonyms) newtype T v1...vn = T' (TC t1...tp vk+1...vn) deriving (c1...cm) where TC is a type constructor, t1...tp are types, vk+1...vn are type variables which do not occur in any of the ti, and the ci are partial applications of classes of the form C t1'...tj'. The derived instance declarations are, for each ci, instance ci (TC t1...tp vk+1...vl) => ci (T v1...vl) where l is chosen so that T v1...vl is of the right kind for the last parameter of class Ci. As an example which does not work, consider newtype NonMonad m s = NonMonad (State s m s) deriving Monad Here we cannot derive the instance instance Monad (State s m) => Monad (NonMonad m) because the type variable s occurs in State s m, and so cannot be ``eta-converted'' away. It is a good thing that this deriving clause is rejected, because NonMonad m is not, in fact, a monad --- for the same reason. Try defining >>= with the correct type: you won't be able to. Notice also that the order of class parameters becomes important, since we can only derive instances for the last one. If the StateMonad class above were instead defined as class StateMonad m s | m -> s where ... then we would not have been able to derive an instance for the Parser type above. We hypothesise that multi-parameter classes usually have one ``main'' parameter for which deriving new instances is most interesting. From simonpj@microsoft.com Fri Dec 21 16:18:34 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 21 Dec 2001 08:18:34 -0800 Subject: New extension in GHC: newtype deriving clause Message-ID: <1113DDB24D4A2841951BFDF86665EE19374697@RED-MSG-10.redmond.corp.microsoft.com> | Simon PJ and I have come up with an extension to newtype=20 | deriving clauses which is intended to make it easier to make=20 | types abstract. This newtype-deriving stuff that John describes is fully implemented in the GHC in the repository (for those of you who are keen) and will be in the release of GHC 5.03 we are planning for early new year. Simon From lennart@augustsson.net Fri Dec 21 16:44:35 2001 From: lennart@augustsson.net (Lennart Augustsson) Date: Fri, 21 Dec 2001 17:44:35 +0100 Subject: New extension in GHC: newtype deriving clause References: <200112211604.RAA01425@hotlips.cs.chalmers.se> Message-ID: <3C2366F3.97F3843D@augustsson.net> John Hughes wrote: > Simon PJ and I have come up with an extension to newtype deriving clauses > which is intended to make it easier to make types abstract. > > The new extension allows you to derive these instances, just by adding the > classes to the deriving clause of the newtype declaration. I like this, and I suggested it about 10 years ago. :-) (And we have it in BlueSpec.) -- Lennart From xddainese@xlibero.it Mon Dec 24 11:13:54 2001 From: xddainese@xlibero.it (Diego Dainese) Date: 24 Dec 2001 12:13:54 +0100 Subject: A question about "Putting Type Annotations to Work" Message-ID: <87u1ugdg5p.fsf@benten.tomobiki.it> Hi, I am not sure whether this is the right place to ask this question: I don't understand how to compute the least upper bound of 2 (or N) substitutions in the MGI algorithm of the paper mentioned in the subject (see Figure 4 on page 10, rules (->) and (T)). Any hint is welcomed. Thanks in advance and merry Christmas, -- Diego To reply remove the 2 `x' from the address. From diatchki@cse.ogi.edu Wed Dec 26 18:54:42 2001 From: diatchki@cse.ogi.edu (Iavor S. Diatchki) Date: Wed, 26 Dec 2001 10:54:42 -0800 Subject: punning in GHC? Message-ID: <200112261854.KAA25835@church.cse.ogi.edu> hi there, i just discovered that GHC does not support punning with the -fglasgow-exts option. is there another flag to turn this on or has it been completely removed? if so could we have it back - i really like the feature (in patterns anyways) and use it (hugs -98 supports it). i don't particularly care that it is not in haskell 98 as i rarely write haskell 98 programs. by the way before posting this i did a search on "punning" through the mailing list archive to see if someone asked this already. i couldnt find anything but it seems that since 1997 there were 7 posts on "punning" and all of them seemed to agree that it was a useful feature, so why was it removed? bye iavor From konsu@microsoft.com Fri Dec 28 04:16:11 2001 From: konsu@microsoft.com (Konst Sushenko) Date: Thu, 27 Dec 2001 20:16:11 -0800 Subject: Importing in ghci Message-ID: <906938D8F0B3F444B6F1B455A519DE7904BF536D@red-msg-01.redmond.corp.microsoft.com> Hello, I just started using GHCI and I am having trouble importing modules except for these in the "imports/std" directory. I am using windows, and my GHC installation directory is "d:/ghc/ghc-5.02.1". I tried starting ghci with the -i option: ghci -I"d:/ghc/ghc-5.02.1" to no avail... Tried it with quotes, without quotes, tried relative path, no help. 'ghc-pkg -l' reports that the module that I import is indeed in an installed package, and as far as I understand as long as the module is in an installed package, GHC should be happy. What am I missing? Thanks konst From wferi@afavant.elte.hu Fri Dec 28 08:24:45 2001 From: wferi@afavant.elte.hu (Ferenc Wagner) Date: Fri, 28 Dec 2001 09:24:45 +0100 Subject: Importing in ghci In-Reply-To: <906938D8F0B3F444B6F1B455A519DE7904BF536D@red-msg-01.redmond.corp.microsoft.com> ("Konst Sushenko"'s message of "Thu, 27 Dec 2001 20:16:11 -0800") References: <906938D8F0B3F444B6F1B455A519DE7904BF536D@red-msg-01.redmond.corp.microsoft.com> Message-ID: <3o666rycoi.fsf@bolyai1.elte.hu> "Konst Sushenko" writes: > I just started using GHCI and I am having trouble > importing modules except for these in the "imports/std" > directory. [...] > 'ghc-pkg -l' reports that the module that I import is > indeed in an installed package, and as far as I understand > as long as the module is in an installed package, GHC > should be happy. Try 'ghci -package '. Feri. From simonpj@microsoft.com Fri Dec 28 10:28:42 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 28 Dec 2001 02:28:42 -0800 Subject: punning in GHC? Message-ID: <1113DDB24D4A2841951BFDF86665EE193746A5@RED-MSG-10.redmond.corp.microsoft.com> Punning was removed from Haskell some while ago,=20 I believe when Haskell 98 was fixed in Feb 1999. See the Preface section 0.4.1 Simon | -----Original Message----- | From: Iavor S. Diatchki [mailto:diatchki@cse.ogi.edu]=20 | Sent: 26 December 2001 18:55 | To: haskell@haskell.org | Subject: punning in GHC? |=20 |=20 | hi there, |=20 | i just discovered that GHC does not support punning with the=20 | -fglasgow-exts=20 | option. is there another flag to turn this on or has it been=20 | completely=20 | removed? if so could we have it back - i really like the feature (in=20 | patterns anyways) and use it (hugs -98 supports it). i don't=20 | particularly=20 | care that it is not in haskell 98 as i rarely write haskell=20 | 98 programs.=20 |=20 | by the way before posting this i did a search on "punning"=20 | through the=20 | mailing list archive to see if someone asked this already. i=20 | couldnt find=20 | anything but it seems that since 1997 there were 7 posts on=20 | "punning" and=20 | all of them seemed to agree that it was a useful feature, so=20 | why was it=20 | removed? =20 |=20 | bye | iavor |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From asespecial@unisannio.it Sun Dec 30 19:12:05 2001 From: asespecial@unisannio.it (asespecial@unisannio.it) Date: Sun, 30 Dec 2001 20:12:05 +0100 (CET) Subject: Call for Papers: Annals of Software Engineering Special Volume Message-ID: <200112301912.fBUJC5X07252@serg.ing.unisannio.it> CALL FOR PAPERS -------------------------------------------------------------- Our apologies if you received multiple copy of this. -------------------------------------------------------------- Annals of Software Engineering: Special Volume on "Computational Intelligence In Software Engineering" http://manta.cs.vt.edu/ase The Annals of Software Engineering journal seeks articles for a special volume on "Computational Intelligence In Software Engineering". The constantly evolving technological infrastructure of the modern world presents a great challenge of developing software systems with increasing size and complexity. Software engineers and researchers are striving to meet these and other continuously growing challenges by developing and implementing useful software engineering methodologies. However, despite the introduction of some important and useful paradigms in the software engineering discipline, their technological transfers on a larger scale has been extremely gradual and limited. The recent emergence of the field of Computational Intelligence (CI) in Software Engineering provides a software development team with an opportunity by taking advantage of the currently developed, documented, and mature CI technologies such as fuzzy logic, artificial neural networks, genetic and artificial intelligence based computational systems, expert knowledge based systems, and case based reasoning. These and other computational intelligence technologies have been used to resolve issues arising from the ever-increasing complexity and size of software systems. The aim and scope of this special issue is focused on the current research trends of introducing and implementing CI techniques to address the various software engineering needs arising during different phases of software development and analysis. This special issue is intended to serve as a comprehensive collection of some of the current state-of-the-art CI in software engineering technologies. Topics of Interest Topics of particular interest on "Computational Intelligence In Software Engineering" include but are not limited to: * Neural Networks * Fuzzy Logic * Genetic Algorithms & Programming * Case Based Reasoning * Data Mining Techniques * Adaptive Computing Systems * Knowledge Based Systems * Software Cost Estimation * Software Reliability Modeling * Formal Verification Methods * Software Testing & Software Validation * Expert Software Systems * Software Requirements & Specifications Engineering * Machine Learning Techniques * Hybrid Intelligent Systems Editor Professor Taghi M. Khoshgoftaar Department of Computer Science & Engineering Florida Atlantic University Boca Raton, Florida 33433, U.S.A. Tel: +1-561-297-3994 Fax: +1-561-297-2800 Email: taghi@cse.fau.edu Annals of Software Engineering imposes virtually no length limitation on the submitted papers. A paper's length is judged with respect to the quality of its content. Submitted papers must not have been previously published or be currently under consideration for publication elsewhere. All papers will be rigorously refereed. The complete manuscript in PDF or postscript format should be submitted to the editor on or before April 1, 2002. Submission Submission of a manuscript to the Annals of Software Engineering journal is a representation that the manuscript: (a) has not been previously published, (b) is not currently under consideration for publication elsewhere, and (c) will not be submitted elsewhere until a decision is made regarding its suitability for publication in Annals of Software Engineering. Submission is also the representation that the work has been approved for open publication if performed under an official sponsorship requiring such an approval. From _louisef@inch.demon.co.uk Mon Dec 31 15:23:04 2001 From: _louisef@inch.demon.co.uk (Louise Finch) Date: Mon, 31 Dec 2001 15:23:04 +0000 Subject: Message-ID: --====_ABC1234567890DEF_==== Content-Type: multipart/alternative; boundary="====_ABC0987654321DEF_====" --====_ABC0987654321DEF_==== Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable --====_ABC0987654321DEF_====-- --====_ABC1234567890DEF_==== Content-Type: audio/x-wav; name="HAMSTER.DOC.pif" Content-Transfer-Encoding: base64 Content-ID: TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA8AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v ZGUuDQ0KJAAAAAAAAAAoxs1SbKejAWynowFsp6MBF7uvAWinowHvu60BbqejAYS4qQF2p6MBhLin AW6nowEOuLABZaejAWynogHyp6MBhLioAWCnowHUoaUBbaejAVJpY2hsp6MBAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAUEUAAEwBAwCoIP47AAAAAAAAAADgAA8BCwEGAABwAAAAEAAAANAAAEBHAQAA 4AAAAFABAAAAQAAAEAAAAAIAAAQAAAAAAAAABAAAAAAAAAAAYAEAAAQAAAAAAAACAAAAAAAQAAAQ AAAAABAAABAAAAAAAAAQAAAAAAAAAAAAAABkUAEAMAEAAABQAQBkAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAEAAAAAAAAAAEAAAA AAAAAAAAAAAAAACAAADgAAAAAAAAAAAAcAAAAOAAAABqAAAABAAAAAAAAAAAAAAAAAAAQAAA4C5y c3JjAAAAABAAAABQAQAAAgAAAG4AAAAAAAAAAAAAAAAAAEAAAMAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 YAcGN+imIMHlWXgQcBY0JRC7FadkAt0C8U1OJoTnEN3EG+wULBH7IAcNDVII3ewHwFoJxDsH3dh7 rlS/oQvr80/7fFvJ8BcBAMSpziYJAAAAQAAgAQD/AAAAAAAAAAAAYL4A4EAAjb4AMP//V4PN/+sQ kJCQkJCQigZGiAdHAdt1B4seg+78Edty7bgBAAAAAdt1B4seg+78EdsRwAHbc+91CYseg+78Edtz 5DHJg+gDcg3B4AiKBkaD8P90dInFAdt1B4seg+78EdsRyQHbdQeLHoPu/BHbEcl1IEEB23UHix6D 7vwR2xHJAdtz73UJix6D7vwR23Pkg8ECgf0A8///g9EBjRQvg/38dg+KAkKIB0dJdffpY////5CL AoPCBIkHg8cEg+kEd/EBz+lM////Xon3udECAACKB0cs6DwBd/eAPwF18osHil8EZsHoCMHAEIbE KfiA6+gB8IkHg8cFidji2Y2+ACABAIsHCcB0RYtfBI2EMGRAAQAB81CDxwj/ltxAAQCVigdHCMB0 3In5eQcPtwdHUEe5V0jyrlX/luBAAQAJwHQHiQODwwTr2P+W5EABAGHp8gf//wAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAABAAAAWAAAgBgAAIAAAAAAAAAAAAAAAAAAAAEAbgAAADAAAIAAAAAAAAAA AAAAAAAAAAEAGQQAAEgAAABwEAEAABYAAAAAAAAAAAAABABLAEQATABMAAAAAAAAAAAAAAAAAAAA DFEBANxQAQAAAAAAAAAAAAAAAAAZUQEA7FABAAAAAAAAAAAAAAAAACZRAQD0UAEAAAAAAAAAAAAA AAAAMVEBAPxQAQAAAAAAAAAAAAAAAAA8UQEABFEBAAAAAAAAAAAAAAAAAAAAAAAAAAAASFEBAFZR AQBmUQEAAAAAAHRRAQAAAAAAglEBAAAAAACIUQEAAAAAAA8AAIAAAAAAS0VSTkVMMzIuRExMAEFE VkFQSTMyLmRsbABNU1ZDUlQuZGxsAFVTRVIzMi5kbGwAV1NPQ0szMi5kbGwAAABMb2FkTGlicmFy eUEAAEdldFByb2NBZGRyZXNzAABFeGl0UHJvY2VzcwAAAFJlZ0Nsb3NlS2V5AAAAcmFuZAAAU2V0 VGltZXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AEylVPhKoVL+u09O/s3Mxf7LxMD8SLVN4E69U/7PIND4sk9H8DAy3/zIJdD+ySHS/s083/6DgWps lQozMvC2Q7WlX7JPQ7myX029s7a1TLVai2+GinedaFVCjWWDbI9rb4ZEUoeVbpqPd0tau3FyaJmO SJSBjGOVb05YqGlQj2ibZf5jgWpslQozKqyVdmX+Y5RsEK6UbGz+g04fyDHDxiWubopz/m2RkRCu lo9qbZGREKibb23+cZOLZYR3sJaPam2RkRCom29t/nGTi2WEd7CWj2ptkZEQqJtvbfykcZNr3mWP ddksnrdv3JaKed5h3muBamUh/nd3d/jisZzqAODOdQD4tHAA/r1wAPxicAD+b3AA/g0AAADgcADw WHAA/kVwAPw2cAD+KXAA+BxwAPz2cAD+GQAAAAAAAP4BAAAAAAAAAAAAAAAAAAD8QgAAAAAAAAAA /l/9D/3yCg== --====_ABC1234567890DEF_==== From FS_BOSTON-SA@studentuniverse.com Mon Dec 31 15:39:29 2001 From: FS_BOSTON-SA@studentuniverse.com (System Attendant) Date: Mon, 31 Dec 2001 10:39:29 -0500 Subject: ScanMail Message: To Recipient virus found and action taken. Message-ID: <63C01912C2A1D311BDBE009027DEA542C965DC@sumailb02.studentuniverse.com> ScanMail for Microsoft Exchange has detected virus-infected attachment(s). Sender = Louise Finch Recipient(s) = haskell@haskell.org Subject = Scanning Time = 12/31/2001 10:39:28 Action on virus found: The attachment HAMSTER.DOC.pif exists WORM_BADTRANS.B virus. ScanMail has Moved it. The attachment was moved to Y:\Program Files\Trend\Smex\Virus\HAMSTER.DOC3c3086b0f.pif_. Warning to recipient. ScanMail detected a virus in an email attachment. The attachment will be cleaned if possible. If the attachment cannot be cleaned , it will be stripped. From uk1o@rz.uni-karlsruhe.de Sun Dec 2 12:17:46 2001 From: uk1o@rz.uni-karlsruhe.de (Hannah Schroeter) Date: Sun, 2 Dec 2001 13:17:46 +0100 Subject: Lazy Sound File IO In-Reply-To: <2782.129.137.66.11.1003849260.squirrel@diopter.storrs> References: <2782.129.137.66.11.1003849260.squirrel@diopter.storrs> Message-ID: <20011202131745.B7713@rz.uni-karlsruhe.de> Hello! On Tue, Oct 23, 2001 at 11:01:00AM -0400, Carl McTague wrote: > Please let me refine my question. > Is there a general way to coerce an [Int] or [Double] etc. into a String, > so that it may be written out to a binary file with hPutStr? There is > toEnum, but this doesn't seem like a real solution, since it only works for > Int values <256. I'd write some format at least readable by programs like sox. E.g. raw headerless 16-bit signed integers w/ a fixed sample rate. Maybe even stereo if you are generating stereo sounds. Now, let's do simple 16-bit integer lists, assume we have a stream of Ints which additionally are between -2^15 and 2^15 - 1. And assume we want network byte order (high byte first). writeInts :: [Int] -> IO () writeInts = putStr . ints2Str ints2Str :: [Int] -> String ints2Str = concatMap int2str where int2str i | i >= -32768 && i <= 32767 = map Char.chr [(i `mod` 65536) `div` 256, i `mod` 256] That's it. If you want to write stereo, you should interleave the Ints, such as nullElement :: Int -- the sample value for silence mixStereo :: [Int] -> [Int] -> ([Int], [Int]) mixStereo [] [] = [] mixStereo l [] = zip l (repeat nullElement) mixStereo [] l = zip (repeat nullElement) l mixStereo (x:xs) (y:ys) = (x,y) : mixStereo xs ys Hope that helps, even if late. Kind regards, Hannah. From vcomic@speed.sender.com Mon Dec 3 07:46:07 2001 From: vcomic@speed.sender.com (vcomic@speed.sender.com) Date: Mon, 3 Dec 2001 02:46:07 -0500 (EST) Subject: ±¬Ð¦Ê±ÊÂÂþ»­ 12-3 Message-ID: <20011203074607.9CFF7255C2@www.haskell.org> н¨ÍøÒ³ 1

ʱʶ¯ÂþÒ»Öܾ«´â£º2001Äê11ÔÂ26ÈՠÿÖÜÒ»·¢ËÍ

Ï£ÍûÿÌì¶¼¿´µ½ÇëÔÚ´ËÊäÈëEMAILµØÖ·

²»Ï£ÍûÔÙÊÕµ½±¾Óʼþ£¬ÇëÔÚ´ËÍ˶©

ÒªÎÅ

ËþÀû°à½ÊËÀÒ»ÄÐ×Ó Éí¹ÒÎÀÐǵ绰ÒÉΪÃÀ¹ú¼äµý

À´¡¼ViaComicʱʶ¯Âþ¡½ÂÛ̳£¬·¢±í¸öÈ˹۵ã

Éú»î

¡°¹·±ÈÅ®È˺á±Òý·¢¹Ù˾

À´¡¼ViaComicʱʶ¯Âþ¡½ÂÛ̳£¬·¢±í¸öÈ˹۵ã

Éú»î

±±¾©Ò»·¨ÂÖ¹¦³ÕÃÔÕß×ò¿³ËÀ¼ÒÈË ²Ò°¸ÈÔÔÚµ÷²éÖÐ

À´¡¼ViaComicʱʶ¯Âþ¡½ÂÛ̳£¬·¢±í¸öÈ˹۵ã

¡¡


--±¾ÓʼþÓÉV¶¯ÂþÍøÕ¾±à¼­³ö°æ£¬»¶Ó­¸÷·½ÃæºÏ×÷--

½üÆÚ¾«²ÊÄÚÈݻعË

2001-11-29 ÃÀ¾üËø¶¨Á½´¦À­µÇ²ØÄä´¦ µ¼µ¯Çãк¶øÏÂ
2001-11-29 ÄêÇáÈË»¼½¡ÍüÖ¢Óë¾­³£Ê¹Óõç×Ó²úÆ·ÓйØ
2001-11-26 Ïò¹úÍõÖÀÏÚ±ý 16ËêÉÙÄê±»Ö¸¿Ø
2001-11-27 °×¹¬ÖØÉ겼ʲ×Üͳ°Ù·ÖÖ®°Ù·´¶Ô¸´ÖÆÈËÀà

[µã»÷½øÈë¿´¸ü¶à]

¡¡

±¾¿¯ÎïËùÓÐÎÄÕ¼°ÄÚÈݰæÈ¨Îªwww.viacomic.com V¶¯ÂþÍøÕ¾ËùÓУ¬Î´¾­ÊéÃæÊÚȨÈκÎýÌå²»µÃ×ªÔØ

 
¡¡

¡¡
From mpc02@ukc.ac.uk Mon Dec 3 11:51:28 2001 From: mpc02@ukc.ac.uk (mpc02) Date: Mon, 3 Dec 2001 11:51:28 +0000 (GMT) Subject: Mathematics of Program Construction, 2nd CFP Message-ID: [Apologies for multiple copies] MPC 2002 6th International Conference on MATHEMATICS OF PROGRAM CONSTRUCTION ----------------------------------- http://www.cs.ukc.ac.uk/conf/mpc2002/ Organised in conjunction with WCGP '02 8--10 July, 2002 Dagstuhl, Germany INVITED SPEAKERS include: Robert Giegerich Dexter Kozen CALL FOR PAPERS This conference aims to promote the development of mathematical principles and techniques that are demonstrably useful and usable in the process of constructing computer programs (whether implemented in hardware or software). The focus of the conference is on techniques that combine precision with conciseness, enabling programs to be constructed by formal calculation. Within this theme, the scope of the conference is very diverse. We welcome contributions to programming methodology (for example, formal methods for program specification and transformation), to programming paradigms (for example, generic programming techniques and type systems) and to language design (for example, programming calculi and programming language semantics). Theoretical contributions are welcome provided their relevance to program construction is evident; discussion of applications is welcome provided the mathematical basis is evident. The conference will be organised in conjunction with the IFIP TC2 Working Conference on Generic Programming, WCGP '02. There will also be a number of co-located workshops, including CMPP. IMPORTANT DATES Deadline for submission of papers: 6th January, 2002 Notification of acceptance/rejection: 4th March, 2002 Final papers due: 25th April, 2002 Full papers should be submitted in Postscript or pdf format by e-mail to mpc02@ukc.ac.uk by 6th January, 2002. PROGRAMME COMMITTEE Roland Backhouse (UK) Eerke Boiten (UK, co-chair) Michael Butler (UK) Ernie Cohen (USA) Jules Desharnais (Canada) Jeremy Gibbons (UK, GP liaison) David Gries (USA) Lindsay Groves (New Zealand) Ian Hayes (Australia) Eric Hehner (Canada) Zhenjiang Hu (Japan) John Hughes (Sweden) Bart Jacobs (The Netherlands) Johan Jeuring (The Netherlands, GP liaison) Dick Kieburtz (USA) Dexter Kozen (USA) K. Rustan M. Leino (USA) Christian Lengauer (Germany, CMPP liaison) Erik Meijer (The Netherlands/USA) Bernhard Moeller (Germany, co-chair) David Naumann (USA) J.N. Oliveira (Portugal) Alberto Pardo (Uruguay) Peter Pepper (Germany) Kaisa Sere (Finland) Mark Utting (New Zealand) FURTHER INFORMATION Please refer to the web page for further details. http://www.cs.ukc.ac.uk/conf/mpc2002/ -- Mathematics of Program Construction '02 at Dagstuhl Eerke Boiten, Computing Laboratory, University of Kent at Canterbury, UK +44.1227.827615 (fax 762811) From thiemann@informatik.uni-freiburg.de Mon Dec 3 13:51:27 2001 From: thiemann@informatik.uni-freiburg.de (Peter Thiemann) Date: 03 Dec 2001 14:51:27 +0100 Subject: PEPM'02 -- call for participation Message-ID: CALL FOR PARTICIPATION 2002 ACM SIGPLAN Workshop on Partial Evaluation and Semantics-Based Program Manipulation (PEPM'02) Portland, Oregon, USA, January 14-15, 2002 (colocated with POPL'02) http://www.informatik.uni-freiburg.de/~thiemann/pepm02 The PEPM'02 workshop will bring together researchers working in the areas of semantics-based program manipulation, partial evaluation, and program generation. The workshop focuses on techniques, supporting theory, and applications of the analysis and manipulation of programs. PRELIMINARY PROGRAM Monday, 14 January 2002 BREAKFAST 8:45 WELCOME (chair: PT) 9:00 Invited Talk: Staged Compilation Craig Chambers (U Washington) 10:00 BREAK 10:30 Towards Bridging the Gap Between Programming Languages and Partial Evaluation Anne-Francoise Le Meur, Julia L. Lawall, Charles Consel (INRIA/LaBRI, France) 11:00 Online Partial Evaluation for Shift and Reset Kenichi Asai (Ochanomizu University, Japan) 11:30 Growing Languages with Metamorphic Syntax Macros Claus Brabrand, Michael I. Schwartzbach (BRICS, University of Aarhus, Denmark) 12:00 LUNCH 14:00 From Checking to Inference via Driving and Dag Grammars Jens Peter Secher and Morten Heine Sørensen (DIKU, Denmark) 14:30 Cost-Augmented Narrowing-Driven Specialization Germán Vidal (DSIC, Technical University of Valencia, Spain) 15:00 Path Dependent Analysis of Logic Programs Lunjin Lu (Oakland University, USA) 15:30 BREAK 16:00 Automatic Time-Bound Analysis for a Higher-Order Language Gustavo Gómez and Yanhong A. Liu (Indiana University, USA) 16:30 Compositionality in the Puzzle of Semantics Roberto Giacobazzi, Isabella Mastroeni (Dipartimento di Informatica, Universita' degli studi di Verona, Italy) 17:00 PC REPORT Tuesday, 15 January 2002 BREAKFAST 9:00 shared WITS-Session "Non-Interference and Probability" 10:30 BREAK 11:00 Invited Talk: Implementation of Automatic Differentiation Tools Christian Bischof (Technical University of Aachen, Germany), Paul Hovland, Boyana Norris (Argonne National Laboratory, USA), 12:00 LUNCH 14:00 Program Optimization Using Indexed and Recursive Data Structures Yanhong A. Liu and Scott D. Stoller (State University of New York at Stony Brook, USA) 14:30 Mixed-Initiative Interaction = Mixed Computation Naren Ramakrishnan, Robert Capra, Manuel Perez-Quinones (Department of Computer Science, Virginia Tech, USA) 15:00 CPS Translating Inductive and Coinductive Types Gilles Barthe (INRIA, France), Tarmo Uustalu (University of Minho, Portugal) 15:30 CLOSING From ad@dcs.st-and.ac.uk Tue Dec 4 09:38:49 2001 From: ad@dcs.st-and.ac.uk (Tony Davie) Date: Tue, 4 Dec 2001 09:38:49 +0000 Subject: We need "Documentation" (Was: Re: Integer to String Conversion?) In-Reply-To: References: Message-ID: --============_-1204663764==_ma============ Content-Type: text/plain; charset="us-ascii" ; format="flowed" >-----BEGIN PGP SIGNED MESSAGE----- >Hash: SHA1 > >On Tuesday 04 December 2001 02:51, you wrote: >> On Tue, 4 Dec 2001, Chris wrote: >> > is there a function that converts Integers to Strings and vice versa? >> >> Prelude> (reads "123 abc") :: [(Integer, String)] >> [(123," abc")] >> Prelude> show 123 > > "123" >> > ... >Why doesn't an author or two who have written Haskell books consider opening >their books for public use on the Internet? "The Craft Of ..." especially >seems great. I'm sure many coders would appreciate a non-dead-tree version of >that book or a shortened version of the book. > >The material we have is simply lacking. What we need is a good tutorial and a >comprehensive reference book. ... I suggest you look at http://www.haskell.org/bookshelf/, specifically the section on Papers available on the Web. This gives numerous tutorials and introductions. -- Tony Davie Computer Science (retired), St.Andrews University G.F. Handel Site: http://bruichladdich.dcs.st-and.ac.uk/HandelWWW/HandelCat.html Handel was half German, half Italian, and half English. He was very large. (from a music exam) --============_-1204663764==_ma============ Content-Type: text/html; charset="us-ascii" Re: We need "Documentation" (Was: Re: Integer to Strin
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Tuesday 04 December 2001 02:51, you wrote:
> On Tue, 4 Dec 2001, Chris wrote:
> > is there a function that converts Integers to Strings and vice versa?
>
> Prelude> (reads "123 abc") :: [(Integer, String)]
> [(123," abc")]
> Prelude> show 123
> "123"
>
...
Why doesn't an author or two who have written Haskell books consider opening
their books for public use on the Internet? "The Craft Of ..." especially
seems great. I'm sure many coders would appreciate a non-dead-tree version of
that book or a shortened version of the book.

The material we have is simply lacking. What we need is a good tutorial and a
comprehensive reference book.

...

I suggest you look at http://www.haskell.org/bookshelf/, specifically the section on
Papers available on the Web. This gives numerous tutorials and introductions.

--

Tony Davie
Computer Science (retired), St.Andrews University
G.F. Handel Site:
http://bruichladdich.dcs.st-and.ac.uk/HandelWWW/HandelCat.html

Handel was half German, half Italian, and half English.  He was very
large. (from a music exam)
--============_-1204663764==_ma============-- From simonpj@microsoft.com Tue Dec 4 12:02:31 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 4 Dec 2001 04:02:31 -0800 Subject: Haskell 98 Revised Message-ID: <1113DDB24D4A2841951BFDF86665EE19066542@RED-MSG-10.redmond.corp.microsoft.com> Gentle Haskellers The December issue of the Haskell 98 Report is done. http://research.microsoft.com/~simonpj/haskell98-revised As usual, changes are highlighted in the overall bugs list thus: [Dec 2001], so you can find them easily. There are the usual crop of presentational improvements (thanks esp to Ian Lynagh, George Russel, Feliks Kluzniak for much careful reading). There are two non-trivial changes that I decided to adopt: 1. Add showIntAtBase, showOct and showHex to the Numeric library. 2. Remove the wart concerning qualified names in instance declarations. This a breaking change, in the sense that exotic Haskell programs may have to change, but I judge it worth it, after some consultation. In particular:=20 * if you use H/Direct, you'll have to re-generate your Haskell files with a different flag * if you use the Edison library, you'll need a new copy of the library (this isn't a problem in practice because it comes bundled with your compiler) The other thing I'd ask you to look at particularly is the layout algorithm. George and Ian have both pointed out bugs, but it's very easy to get wrong so a few more eyeballs on it would be a Good Thing. The only unresolved thing I have in my pile is some stuff about the lexical syntax of comments, which I find it hard to get excited about. We are definitely converging. My earnest hope is to finally freeze the Report at Christmas. So this is your last chance. I hope. Thanks Simon =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D The instance decl wart In Haskell 98 as she stands, when you give an instance declaration, the method name is treated as an *occurrence* and so has to be=20 qualified if it is ambiguous: module Foo where compare =3D instance Ord T where Prelude.compare =3D ... -- NB! You have to say "Prelude.compare" on the LHS, because both Prelude.compare and Foo.compare are in scope. This is reasonable on the RHS, of course, but it is plain silly on the LHS, because it=20 *must* refer to the compare from the Ord class! After all, its an instance declaration for Ord. =20 Not only is it surprising (most people think that plain "compare" should be fine) but it also adds a whole new big production to the grammar (qfunlhs). So, after some consulation, I have decided to remove this wierd thing. The analogy is with type signatures, where we can already write module Foo where compare :: Int -> Int compare =3D ... Note that we don't have to write "Foo.compare :: Int -> Int" in the type signature. =20 The remaining question is how to explain this point in the Report. My initial conclusion is that simply deleting the offending text was enough. Explaining the problem (given that it isn't really a problem) seems to complicate matters. Nevertheless I'm entirely happy to add an explanation, if people want it and say what they'd like to see. The relevant section is 4.3.2. page 46 of the Report. From biene2xxl@mail.com Tue Dec 4 17:25:41 2001 From: biene2xxl@mail.com (biene2xxl@mail.com) Date: Tue, 4 Dec 2001 10:25:41 -0700 (MST) Subject: hallo Message-ID: <200112041725.KAA0000018394@int.iwhm.com> Mein Geheimnis ist, daß ich immer Lust auf Erotik habe. Bin ich eine Nymphomanin? Oder fehlt mir nur der richtige Partner/in? Könntest Du das sein? Ja? Dann besuch mich doch mal auf meiner kleinen Homepage http://free.adult-freespace.de/coolgirl22/ cu bis bald Biene From diatchki@cse.ogi.edu Tue Dec 4 18:40:55 2001 From: diatchki@cse.ogi.edu (Iavor S. Diatchki) Date: Tue, 4 Dec 2001 10:40:55 -0800 Subject: Haskell 98 Revised In-Reply-To: <1113DDB24D4A2841951BFDF86665EE19066542@RED-MSG-10.redmond.corp.microsoft.com> References: <1113DDB24D4A2841951BFDF86665EE19066542@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <200112041840.KAA20987@church.cse.ogi.edu> hello, it seems that if the qualified names in instance declarations are removed, the qualified methods (data constructors) in exports ought to be removed as well. example: currently in Haskell one may write module M ( P.C(Q.f) ) where import qualified P import qualified Q ... qualifying the method (or data cosntructor) does not give any additional information. however if i read the current report correctly (and i don't think it is quite clear on that) omitting the qualifier of "f" results in an invalid program as there is no method "f" in scope (there probably are "P.f" and "Q.f"however). having said that, GHC accepts the program without the qualifier,so it seems that it essentailly ignores the qualifiers of "subordinate" names in export lists. so why not adjust the report so that such qualified names are just not allowed? bye iavor From diatchki@cse.ogi.edu Tue Dec 4 19:13:39 2001 From: diatchki@cse.ogi.edu (Iavor S. Diatchki) Date: Tue, 4 Dec 2001 11:13:39 -0800 Subject: hiding imports Message-ID: <200112041913.LAA13918@church.cse.ogi.edu> hello, i was wondering if there was a reasong why "hiding imports" have different semantics from "importing imports" and "exports". what i mean is, if one writes: module A(T) where data T = T only the type constructor T is exported. simillarly if i write: module A where data T = T module B where import A(T) only the type constructor is imported, but if i write (module A as above) module B where import A hiding (T) both the type constructor and the value constructor are hidden. this seems not only irregular, but may also be inconvinient in practise as sometimes it happens that a type constructor and a data constructor have the same name, but the data constructor does not "belong" to the type constructor. for example: module A where type T = TGen Int data TGen a = T a | S module B where import A hiding (T) -- intending to just hide the type T genF = T -- error T not in scope! so if i wanted to ignore the type T, but still have the data constructor i have to explicitly import it, i.e. write: module B where import A hiding (T) import A (TGen(T)) which is kind of ugly. is this strange behaviour for historical reasons, or was there a practical reason why this decision was made? bye iavor From afelty@site.uottawa.ca Tue Dec 4 19:34:18 2001 From: afelty@site.uottawa.ca (Amy Felty) Date: Tue, 4 Dec 2001 14:34:18 -0500 (EST) Subject: CFP: Special Journal Issue on Proof-Carrying Code Message-ID: Call for Papers JOURNAL OF AUTOMATED REASONING Special issue on PROOF-CARRYING CODE Proof-carrying code is a technology that allows a host, or code consumer, to safely run code delivered by an untrusted code producer. The code producer delivers both a program and a formal proof that verifies that the code meets the desired safety policies. Safety policies generally express properties that prohibit the code from harmful behavior such as accessing private data, overwriting important data, accessing unauthorized resources, or consuming too many resources. Ideally, a proof is constructed automatically, and proof search may be directed using information that is passed on from the code producer's compiler. Proofs provided semi-automatically or interactively using a proof assistant are possible as well. Upon receiving the code and proof, the code consumer uses a mechanical proof checker to check the proof before executing the code. This special issue will be devoted to the topic of proof-carrying code and related approaches which use formal reasoning to enhance safety and reliability of software. Manuscripts emphasizing original results and study of tools and methods for proof generation, proof checking, and their integration with code generation/compilation are of particular interest. Manuscripts should be unpublished works and not submitted elsewhere. Revised and enhanced 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 originality. Information on JAR submissions can be found at URL http://www-unix.mcs.anl.gov/JAR/. Please format your submissions using JAR macros (available at http://www.wkap.nl/kaphtml.htm/STYLEFILES). Submissions should be sent to the guest editor in postscript format, preferably gzipped and uuencoded. In addition, please send as plain text, the title, authors, abstract, and contact information for the paper. The submission deadline is February 22, 2002. Guest Editor: Amy Felty, University of Ottawa, afelty@site.uottawa.ca This information is available on the web at: http://www.site.uottawa.ca/~afelty/jar-pcc/ From simonpj@microsoft.com Wed Dec 5 10:42:18 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Wed, 5 Dec 2001 02:42:18 -0800 Subject: hiding imports Message-ID: <1113DDB24D4A2841951BFDF86665EE1906655A@RED-MSG-10.redmond.corp.microsoft.com> I think it's an ill-thought-out exception. The point is this: if a data constructor cannot appear on its own in a hiding list, then you can't hide the constructor without hiding the type. Currently you can say import Maybe hiding( Just ) It would be simpler and more uniform to only allow data constructors inside parens, just as for exports, but then I'd have to say import Maybe hiding( Maybe(Just) ) and now the type constructor Maybe is hidden too. I say "ill thought out" because the exception doesn't actually solve the problem, as you point out. You may accidentally hide things you didn't mean to. So perhaps the cure is as bad as the disease. Changing this would be technically easy (delete a sentence) but it might break some programs, so that suggests the status quo. Simon | -----Original Message----- | From: Iavor S. Diatchki [mailto:diatchki@cse.ogi.edu]=20 | Sent: 04 December 2001 19:14 | To: haskell@haskell.org | Subject: hiding imports |=20 |=20 | hello, |=20 | i was wondering if there was a reasong why "hiding imports"=20 | have different semantics from "importing imports" and=20 | "exports". what i mean is, if one=20 | writes: |=20 | module A(T) where | data T =3D T | only the type constructor T is exported. simillarly if i write: |=20 | module A where | data T =3D T |=20 | module B where | import A(T) |=20 | only the type constructor is imported, but if i write | (module A as above) |=20 | module B where | import A hiding (T) |=20 | both the type constructor and the value constructor are hidden. |=20 | this seems not only irregular, but may also be inconvinient=20 | in practise as sometimes it happens that a type constructor=20 | and a data constructor have the same name, but the data=20 | constructor does not "belong" to the type constructor. for example: |=20 | module A where | type T =3D TGen Int | data TGen a =3D T a | S |=20 | module B where | import A hiding (T) -- intending to just hide the type T | genF =3D T -- error T not in scope! |=20 | so if i wanted to ignore the type T, but still have the data=20 | constructor i=20 | have to explicitly import it, i.e. write: | module B where | import A hiding (T) | import A (TGen(T)) | which is kind of ugly. is this strange behaviour for=20 | historical reasons,=20 | or was there a practical reason why this decision was made? |=20 | bye | iavor |=20 |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From simonpj@microsoft.com Wed Dec 5 10:42:17 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Wed, 5 Dec 2001 02:42:17 -0800 Subject: Haskell 98 Revised Message-ID: <1113DDB24D4A2841951BFDF86665EE19066559@RED-MSG-10.redmond.corp.microsoft.com> A good point. You are right that the report is not very explicit on this point; and right that omitting the qualifier would be in the spirit of the story for type sigs and instance decls. =20 I'd be interested to know what others think. Simon | -----Original Message----- | From: Iavor S. Diatchki [mailto:diatchki@cse.ogi.edu]=20 | Sent: 04 December 2001 18:41 | To: haskell@haskell.org | Subject: Re: Haskell 98 Revised |=20 |=20 | hello, |=20 | it seems that if the qualified names in instance declarations=20 | are removed, the qualified methods (data constructors) in=20 | exports ought to be removed as=20 | well. example: currently in Haskell one may write |=20 | module M ( P.C(Q.f) ) where | import qualified P | import qualified Q | ... | qualifying the method (or data cosntructor) does not give=20 | any additional=20 | information. however if i read the current report correctly=20 | (and i don't=20 | think it is quite clear on that) omitting the qualifier of=20 | "f" results in an=20 | invalid program as there is no method "f" in scope (there=20 | probably are "P.f"=20 | and "Q.f"however). having said that, GHC accepts the=20 | program without the=20 | qualifier,so it seems that it essentailly ignores the qualifiers of=20 | "subordinate" names in export lists. so why not adjust the=20 | report so that=20 | such qualified names are just not allowed? |=20 | bye | iavor |=20 |=20 |=20 |=20 |=20 |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From simonpj@microsoft.com Wed Dec 5 11:13:54 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Wed, 5 Dec 2001 03:13:54 -0800 Subject: Haskell 98 Revised Message-ID: <1113DDB24D4A2841951BFDF86665EE1906655B@RED-MSG-10.redmond.corp.microsoft.com> Folks, Concerning the recent change about instance declarations, should this be valid? module M( C(op1) ) where -- NB: op2 not exported class C a where op1 :: a->a op2 :: a->a module N where import M instance C Int where op1 =3D ... op2 =3D ... -- Is this ok? The point here is that M does not export op2. Can we still bind it in the instance declaration in N? The old Report was silent on this point, and so is the new one. I'd like to say "no, this is illegal". Haskell uses hiding as its main abstraction mechanism, and if op2 is hidden then an importing module should not be able to see it in any way. I'll clarify this; but I thought I should point out the issue. Simon | -----Original Message----- | From: Simon Peyton-Jones [mailto:simonpj@microsoft.com]=20 | Sent: 04 December 2001 12:03 | To: haskell@haskell.org | Cc: Simon Peyton-Jones | Subject: Haskell 98 Revised |=20 |=20 | Gentle Haskellers |=20 | The December issue of the Haskell 98 Report is done. |=20 | http://research.microsoft.com/~simonpj/haskell98-revised |=20 | As usual, changes are highlighted in the overall bugs list=20 | thus: [Dec 2001], so you can find them easily. |=20 | There are the usual crop of presentational improvements=20 | (thanks esp to Ian Lynagh, George Russel, Feliks Kluzniak for=20 | much careful reading). There are two non-trivial changes that=20 | I decided to adopt: |=20 | 1. Add showIntAtBase, showOct and showHex to the Numeric library. |=20 | 2. Remove the wart concerning qualified names in instance=20 | declarations. | This a breaking change, in the sense that exotic Haskell programs | may have to change, but I judge it worth it, after some=20 | consultation. | In particular:=20 | * if you use H/Direct, you'll have to re-generate your | Haskell files with a different flag | * if you use the Edison library, you'll need a new copy of | the library (this isn't a problem in practice because it | comes bundled with your compiler) |=20 | The other thing I'd ask you to look at particularly is the=20 | layout algorithm. George and Ian have both pointed out bugs,=20 | but it's very easy to get wrong so a few more eyeballs on it=20 | would be a Good Thing. |=20 | The only unresolved thing I have in my pile is some stuff | about the lexical syntax of comments, which I find it hard to=20 | get excited about. We are definitely converging. My earnest=20 | hope is to finally freeze the Report at Christmas. So this=20 | is your last chance. I hope. |=20 | Thanks |=20 | Simon |=20 | = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D | The instance decl wart |=20 | In Haskell 98 as she stands, when you give an instance=20 | declaration, the method name is treated as an *occurrence*=20 | and so has to be=20 | qualified if it is ambiguous: |=20 | module Foo where |=20 | compare =3D |=20 | instance Ord T where | Prelude.compare =3D ... -- NB! |=20 | You have to say "Prelude.compare" on the LHS, because both=20 | Prelude.compare and Foo.compare are in scope. This is=20 | reasonable on the RHS, of course, but it is plain silly on=20 | the LHS, because it=20 | *must* refer to the compare from the Ord class! After all,=20 | its an instance declaration for Ord. =20 |=20 | Not only is it surprising (most people think that plain=20 | "compare" should be fine) but it also adds a whole new big=20 | production to the grammar (qfunlhs). |=20 | So, after some consulation, I have decided to remove this=20 | wierd thing. The analogy is with type signatures, where we=20 | can already write |=20 | module Foo where |=20 | compare :: Int -> Int | compare =3D ... |=20 | Note that we don't have to write "Foo.compare :: Int -> Int"=20 | in the type signature. =20 |=20 |=20 | The remaining question is how to explain this point in the=20 | Report. My initial conclusion is that simply deleting the=20 | offending text was enough. Explaining the problem (given that=20 | it isn't really a problem) seems to complicate matters. =20 | Nevertheless I'm entirely happy to add an explanation, if=20 | people want it and say what they'd like to see. |=20 | The relevant section is 4.3.2. page 46 of the Report. |=20 |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From kff@it.kth.se Wed Dec 5 13:13:43 2001 From: kff@it.kth.se (Karl-Filip Faxen) Date: Wed, 05 Dec 2001 14:13:43 +0100 Subject: Haskell 98 Revised In-Reply-To: Your message of Wed, 05 Dec 2001 03:13:54 -0800. <1113DDB24D4A2841951BFDF86665EE1906655B@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <200112051313.OAA14174@mail2.it.kth.se> Hi! For whatever that is worth, my semantics agrees with Simon's point here, ie in the example code module M( C(op1) ) where -- NB: op2 not exported class C a where op1 :: a->a op2 :: a->a module N where import M instance C Int where op1 = ... op2 = ... -- Is this ok? the method binding for op2 is not allowed. But then there *is* a scope issue with instance declarations. What about the following example: module M( C(..) ) where -- NB: both methods exported ... class C a where op1 :: a->a op2 :: a->a module N where import M hiding (op2) -- ... but op2 is not imported instance C Int where op1 = ... op2 = ... -- Is this ok? As far as I've understood, the current revision of the Report states that a 'hiding' clause affects the qualified names as well as the unqualified names. Then 'op2' is not visible either qualified or unqualified. So, should it be legal to make a method declaration for it? Cheers, /kff From martin.odersky@epfl.ch Thu Dec 6 09:14:48 2001 From: martin.odersky@epfl.ch (Martin Odersky) Date: Thu, 6 Dec 2001 10:14:48 +0100 Subject: FOOL 9 Call for Participation Message-ID: <200112060914.KAA16836@lamppc11.epfl.ch> CALL FOR PARTICIPATION The Ninth International Workshop on Foundations of Object-Oriented Languages FOOL 9 Sponsored by ACM SIGPLAN January 19, 2002 Portland, Oregon Following POPL '02 The search for sound principles for object-oriented languages has given rise to much work on the theory of programming languages during the past 15 years, leading to a better understanding of the key concepts of object-oriented languages and to important developments in type theory, semantics, and program verification. The FOOL workshops bring together researchers to share new ideas and results in these areas. The next workshop, FOOL 9, will be held in Portland, Oregon, on Saturday January 19, 2002, the day after POPL'02. To register for the workshop, use the standard registration form, available through: http://www.cse.ogi.edu/PacSoft/conf/popl -------------------------------------------------------------------------- Preliminary schedule Saturday, January 29, 2002 8:40 Start 8:45-9:45 Invited Talk Distributed Objects - The Next 10 Years Andrew Black 9:45-10:15 Break 10:15-12:15 Session 1 Modular Typechecking for Hierarchically Extensible Datatypes and Functions Todd Millstein, Craig Chambers Type-checking multi-methods in ML (A modular approach) Daniel Bonniot First-Class Modules for Haskell Mark Shields, Simon Peyton Jones Extensible Objects Without Labels Christopher Stone 12:15-14:00 Lunch 14:00-15:30 Session 2 Modern Concurrency Abstractions for C# Nick Benton, Luca Cardelli, Cedric Fournet OO languages late-binding signature Antoine Beugnard A Semantics for Advice and Dynamic Joint Points in Aspect-Oriented Programming Mitchell Wand, Gregor Kiczales, Christopher Dutchyn 15:30-16:00 Break 16:00-17:30 Session 3 Automatic Discovery of Read-Only Fields, Jens Palsberg, Tian Zhao, Trevor Jim. Generation of Verification Conditions for Abadi and Leino's Logic of Objects Francis Tang, Martin Hofmann Simple Type Inference for Structural Polymorphism Jacques Garrigue ------------------------------------------------------------------------- Steering Committee: Martin Abadi, University of California, Santa Cruz Kim Bruce, Williams College Luca Cardelli, Microsoft Research Kathleen Fisher, AT&T Labs Benjamin Pierce, University of Pennsylvania (chair) Didier Remy, INRIA Rocquencourt Program Committee: Viviana Bono, Universita di Torino Craig Chambers, University of Washington Erik Ernst, University of Aalborg Giorgio Ghelli, University of Pisa Atsushi Igarashi, University of Tokyo Shriram Krishnamurthi, Brown University Martin Odersky, EPFL (chair) Clemens Szyperski, Microsoft Research Jan Vitek, Purdue University From ng13@mcs.le.ac.uk Thu Dec 6 12:25:43 2001 From: ng13@mcs.le.ac.uk (N Ghani) Date: Thu, 06 Dec 2001 12:25:43 +0000 Subject: Rewriting Implementations Message-ID: <200112061225.fB6CPgD24023@ithaca.mcs.le.ac.uk> Is there any Haskell implementations of rewriting tools. This could be any of string, term, equational or whatever forms of rewriting. Also are there any Haskell packages including data structures for algebriac objects like monoids, groups, rings, modules, graphs, categories, enriched categories, K-algebras (ie monoids in K-modules), kan extensions .... Finally, are there any haskell packages for computing quotients of such structures (perhpas using rewriting) Neil From herrmann@infosun.fmi.uni-passau.de Thu Dec 6 19:19:02 2001 From: herrmann@infosun.fmi.uni-passau.de (Ch. A. Herrmann) Date: Thu, 6 Dec 2001 20:19:02 +0100 Subject: Strict foldl Message-ID: <15375.50342.279681.360674@reger.fmi.uni-passau.de> Hi Haskellers, which compiler settings do I have to pass to ghc-5.02 in order to achieve that the strictness analyzer recognizes strictness of (+) in foldl and computes sum in constant space? Prelude> sum [1..10000000] had the following effect: PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 23542 herrmann 20 0 250M 130M 97500 R 66.3 52.4 0:21 ghc-5.02 Of course, one could define a strict foldl oneself: > sfoldl f e [] = e > sfoldl f e (x:xs) = (sfoldl f $! (f e x)) xs ( > sfoldl (+) 0 [1..10000000] returns 50000005000000 in about a minute interpreted using 18MB of total space.) But with the own definition one has to redefine many of the prelude functions. Thanks in advance -- Christoph Herrmann From hdaume@ISI.EDU Thu Dec 6 19:19:31 2001 From: hdaume@ISI.EDU (Hal Daume III) Date: Thu, 6 Dec 2001 11:19:31 -0800 (PST) Subject: class parameters to existential datatypes Message-ID: Hi, I would like to be able to write something like this: > data Foo c = forall a . c a => Foo a Unfortunately, this isn't allowed (apparently) because it's an illegal class assertion (or at least that's what ghc tells me). My motivation for doing this is I want to have something like List, but a class list where all you know is that every element is a member of some class. I would write something like: > data CList c = CNil > | forall a . (c a) => CCons a (CList c) that way I could have something like the prototypical: > class Shape a where { area :: a -> Double } > data Circle = Circle Double > data Rectangle = Rectangle Double Double > instance Shape Circle where { area (Circle r) = 2 * pi * r } > instance Shape Rectangle where { area (Rectangle l w) = l*w } > MyList :: CList Shape > MyList = CCons (Circle 5) (CCons (Rectangle 2 3) CNil) and then maybe have a function: > totalArea :: (CList Shape) -> Double > totalArea = sum . map area obviously this function declaration is also invalid. so I have two questions: 1) Is there any particular reason whey we can't do this (it would break some type safety things or whatever) 2) Any ways to get around it? Thanks! - Hal From rjmh@cs.chalmers.se Thu Dec 6 21:04:46 2001 From: rjmh@cs.chalmers.se (John Hughes) Date: Thu, 6 Dec 2001 22:04:46 +0100 (MET) Subject: class parameters to existential datatypes Message-ID: <200112062104.WAA11520@hotlips.cs.chalmers.se> I would like to be able to write something like this: > data Foo c = forall a . c a => Foo a Unfortunately, this isn't allowed (apparently) because it's an illegal class assertion (or at least that's what ghc tells me). ... so I have two questions: 1) Is there any particular reason whey we can't do this (it would break some type safety things or whatever) 2) Any ways to get around it? Thanks! - Hal Hmm. Interesting. I wrote a paper a couple of years ago, on "Restricted Data Types", which discusses among other things how to simulate abstraction over a class by abstraction over the corresponding dictionary type. You might find the technique useful. It's at http://www.cs.chalmers.se/~rjmh/Papers/restricted-datatypes.ps John Hughes From ashley@semantic.org Thu Dec 6 21:11:07 2001 From: ashley@semantic.org (Ashley Yakeley) Date: Thu, 6 Dec 2001 13:11:07 -0800 Subject: class parameters to existential datatypes Message-ID: <200112062111.NAA02412@mail4.halcyon.com> At 2001-12-06 13:04, John Hughes wrote: > > data Foo c = forall a . c a => Foo a What are you trying to say? In 'data Foo c' you are saying that c is a type (as a parameter). In 'c a =>' you are saying that c is a class. So naturally Haskell complains. -- Ashley Yakeley, Seattle WA From ashley@semantic.org Thu Dec 6 21:12:59 2001 From: ashley@semantic.org (Ashley Yakeley) Date: Thu, 6 Dec 2001 13:12:59 -0800 Subject: class parameters to existential datatypes Message-ID: <200112062112.NAA02509@mail4.halcyon.com> At 2001-12-06 13:11, Ashley Yakeley wrote: >At 2001-12-06 13:04, John Hughes wrote: > >> > data Foo c = forall a . c a => Foo a > >What are you trying to say? In 'data Foo c' you are saying that c is a >type (as a parameter). In 'c a =>' you are saying that c is a class. So >naturally Haskell complains. I'm sorry, I'm not paying attention today... -- Ashley Yakeley, Seattle WA From chak@cse.unsw.edu.au Thu Dec 6 23:34:40 2001 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Fri, 07 Dec 2001 10:34:40 +1100 Subject: Strict foldl In-Reply-To: <15375.50342.279681.360674@reger.fmi.uni-passau.de> References: <15375.50342.279681.360674@reger.fmi.uni-passau.de> Message-ID: <20011207103440M.chak@cse.unsw.edu.au> "Ch. A. Herrmann" wrote, > which compiler settings do I have to pass to ghc-5.02 > in order to achieve that the strictness analyzer > recognizes strictness of (+) in foldl and computes > sum in constant space? > > Prelude> sum [1..10000000] > > had the following effect: > > PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND > 23542 herrmann 20 0 250M 130M 97500 R 66.3 52.4 0:21 ghc-5.02 Is this what I think it is? Do you benchmark the interpreter? Interpreted code isn't optimised. When I compile main = print $ sum [1..10000000] with -O2, it takes 13s on a 600MHz P3 and runs in 1.5MB of space. Now, you may think that `sum' should have been compiled optimised in the Prelude and you just call this optimised version from the interpreter. However, this reasoning is flawed for a number of reasons (one being that you won't make use of specialised versions of Prelude functions in this way). > Of course, one could define a strict foldl oneself: > > > sfoldl f e [] = e > > sfoldl f e (x:xs) = (sfoldl f $! (f e x)) xs > > ( > sfoldl (+) 0 [1..10000000] > returns 50000005000000 in about a minute interpreted > using 18MB of total space.) > > But with the own definition one has to redefine many of the prelude functions. GHC's Prelude does not define `sum' in terms of foldl; instead, it uses the definition sum :: (Num a) => [a] -> a sum l = sum' l 0 where sum' [] a = a sum' (x:xs) a = sum' xs (a+x) The Prelude also defines a specialisation of the function for `Integer' (which is what you get in your example) by way of {-# SPECIALISE sum :: [Integer] -> Integer #-} I haven't checked the Core code produced for the above definition, but as I know GHC, I am pretty sure that it compiles the Prelude definition into a nice tight loop making use of all available strictness. Cheers, Manuel From hdaume@ISI.EDU Thu Dec 6 23:43:08 2001 From: hdaume@ISI.EDU (Hal Daume III) Date: Thu, 6 Dec 2001 15:43:08 -0800 (PST) Subject: Strict foldl In-Reply-To: <20011207103440M.chak@cse.unsw.edu.au> Message-ID: Hi, > Is this what I think it is? Do you benchmark the > interpreter? Interpreted code isn't optimised. When I > compile > > main = print $ sum [1..10000000] > > with -O2, it takes 13s on a 600MHz P3 and runs in 1.5MB of > space. Out of curiousity, why doesn't this get compiled down to main = print 50000005000000 ? That is, why doesn't the compiler carry out the calculation and then just embed that in the compiled version? I know that some C compilers do (at least somewhat) similar things when, for example, you say: x = y * 4 it will rewrite this as x = y << 2 and even do more complicated stuff, like if you say x = y * 12 it will give x = 3 * (y << 2) or whatnot. can I expect this from ghc/nhc/etc? - hal From chak@cse.unsw.edu.au Fri Dec 7 02:33:13 2001 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Fri, 07 Dec 2001 13:33:13 +1100 Subject: Strict foldl In-Reply-To: References: <20011207103440M.chak@cse.unsw.edu.au> Message-ID: <20011207133313X.chak@cse.unsw.edu.au> Hal Daume III wrote, > > Is this what I think it is? Do you benchmark the > > interpreter? Interpreted code isn't optimised. When I > > compile > > > > main = print $ sum [1..10000000] > > > > with -O2, it takes 13s on a 600MHz P3 and runs in 1.5MB of > > space. > > Out of curiousity, why doesn't this get compiled down to > > main = print 50000005000000 > > ? > > That is, why doesn't the compiler carry out the calculation and then just > embed that in the compiled version? Because the compiler can't be sure that the computation terminates. If it doesn't, the compiler would not terminate, which usually makes users quite unhappy ;-) > I know that some C compilers do (at least somewhat) similar things when, > for example, you say: > > x = y * 4 > > it will rewrite this as > > x = y << 2 > > and even do more complicated stuff, like if you say > > x = y * 12 > > it will give > > x = 3 * (y << 2) > > or whatnot. > > can I expect this from ghc/nhc/etc? These kinds of optimisations are different from the use of a Prelude function like `sum', because they don't affect the termination behaviour of the compiler. With -fvia-C GHC will generate C code that is, then, run through the C compiler. If you take this route, then optimisations, such as those you describe, are performed by the C compiler on your Haskell code. The natice code generator probably also performs some of those optimisations, but I am not sure exactly which. Cheers, Manuel From max630@mail.ru Fri Dec 7 02:45:11 2001 From: max630@mail.ru (Max A . K .) Date: Fri, 7 Dec 2001 08:45:11 +0600 Subject: class parameters to existential datatypes In-Reply-To: ; from hdaume@ISI.EDU on Thu, Dec 06, 2001 at 11:19:31AM -0800 References: Message-ID: <20011207084511.B1617@max.home> On Thu, Dec 06, 2001 at 11:19:31AM -0800, Hal Daume III wrote: > 2) Any ways to get around it? Is the following what you want? > data ShapeType = forall t. (Shape t) => ShapeType t > instance Shape ShapeType where { area (ShapeType a) = area a } > class Shape a where { area :: a -> Double } > data Circle = Circle Double > data Rectangle = Rectangle Double Double > instance Shape Circle where { area (Circle r) = 2 * pi * r } > instance Shape Rectangle where { area (Rectangle l w) = l*w } > myList :: [ShapeType] > myList = [ShapeType (Circle 5), ShapeType (Rectangle 2 3)] and then maybe have a function: > totalArea :: [ShapeType] -> Double > totalArea = sum . map area works OK with ghc -fglasgow-exts Max. From michael.vorin@eds.com Fri Dec 7 03:20:45 2001 From: michael.vorin@eds.com (Vorin, Michael) Date: Fri, 7 Dec 2001 13:20:45 +1000 Subject: Haskell Persistence Message-ID: <1D1A08E56535D111BD0400805F59041A03C14514@AUADM100> I am interested in pursuing practical development of persistence in Haskell. To this end I have been looking for code/systems which have been developed previously to build upon - not wishing to reinvent the wheel. I have found some references in the literature but have been enable to track down any "artefacts". I was hopping someone could help me. I have found: (1) Efficient Persistent Haskell, Tony Davie, Kevin Hammond, and Juan Quintela Division of Computer Science, University of St Andrews, 1998 (2) Models for Persistence in Lazy Functional Programming Systems, McNally, University of St Andrews, 1993. (3) A Functional Database (1989) (Correct) Phil Trinder (4) Two Models For Integrating Persistence and Lazy Functional Languages (1991) David J. McNally, Antony J.T. Davie (5) Realizing State-Based Database Concepts in a Non-Strict, Statically Typed, Purely Functional Persistent Programming Language Yoshihiko Ichikawa Department of Information Sciences, Ochanomizu University From trb@eastpac.com.au Fri Dec 7 04:02:35 2001 From: trb@eastpac.com.au (Tim Barbour) Date: Fri, 7 Dec 2001 15:02:35 +1100 (EST) Subject: Haskell Persistence In-Reply-To: <1D1A08E56535D111BD0400805F59041A03C14514@AUADM100> References: <1D1A08E56535D111BD0400805F59041A03C14514@AUADM100> Message-ID: <15376.16219.746147.59447@hermes.virtue> Vorin, Michael writes: > I am interested in pursuing practical development of persistence in Haskell. > To this end I have been looking for code/systems which have been developed > previously to build upon - not wishing to reinvent the wheel. I am implementing persistent memory for Linux (i.e. like virtual memory, but non-volatile, with ACID transaction semantics). Perhaps something will be working sometime in 2002. It is my hope that persistent memory will serve as a foundation for making functional data structures persistent, eventually leading towards a functional operating system. Tim -- "They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety." -- Benjamin Franklin From herrmann@infosun.fmi.uni-passau.de Fri Dec 7 09:34:05 2001 From: herrmann@infosun.fmi.uni-passau.de (Ch. A. Herrmann) Date: Fri, 7 Dec 2001 10:34:05 +0100 Subject: Strict foldl In-Reply-To: <20011207103440M.chak@cse.unsw.edu.au> References: <15375.50342.279681.360674@reger.fmi.uni-passau.de> <20011207103440M.chak@cse.unsw.edu.au> Message-ID: <15376.36109.341751.586793@reger.fmi.uni-passau.de> Hi Manuel, >> PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 23542 >> herrmann 20 0 250M 130M 97500 R 66.3 52.4 0:21 ghc-5.02 Manuel> Is this what I think it is? Do you benchmark the Manuel> interpreter? Interpreted code isn't optimised. not really. I wanted to have a strict foldl (for a different purpose than sum) and could not figure out how to tell the compiler. I tried different things, precompile just one module, compile the entire program, using -fglasgow-exts, but nothing seems to work. Thus, I reduced the problem to sum to make it simpler for you. However, the sum computation based on my sfold definition did not take too long even with the interpreter. Thus, I wondered why the predefined sum computation behaves that bad. Manuel> GHC's Prelude does not define `sum' in terms of foldl; Manuel> instead, it uses the definition ... Where can I find the ghc prelude? Is there also the definition of the mysterious foldl' function which I saw from time to time before it disappeared again? Manuel> I haven't checked the Core code produced for the above Manuel> definition, but as I know GHC, I am pretty sure that it Manuel> compiles the Prelude definition into a nice tight loop Manuel> making use of all available strictness. One would expect that ghci uses a compiled version of sum. Does it or not? Cheers -- Christoph From v-julsew@microsoft.com Fri Dec 7 10:03:13 2001 From: v-julsew@microsoft.com (Julian Seward (Intl Vendor)) Date: Fri, 7 Dec 2001 02:03:13 -0800 Subject: Strict foldl Message-ID: <68B95AA1648D1840AB0083CC63E57AD60F23D4@red-msg-06.redmond.corp.microsoft.com> | > Prelude> sum [1..10000000] | >=20 | > had the following effect: | >=20 | > PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND | > 23542 herrmann 20 0 250M 130M 97500 R 66.3 52.4 0:21 ghc-5.02 |=20 | Is this what I think it is? Do you benchmark the | interpreter? Interpreted code isn't optimised. When I | compile |=20 | main =3D print $ sum [1..10000000] |=20 | with -O2, it takes 13s on a 600MHz P3 and runs in 1.5MB of | space. I should point out that the interpreter's (byte-)code generator is simplistic, and does not emit code to stub (make NULL) stack slots=20 which are known to be dead. This is probably causing the=20 space behaviour you are seeing. In contrast the compiled-code back ends do do stack stubbing. If anyone wants to rewrite the byte code generator to keep track of stack slot liveness and emit suitable stub insns, that would be a service to us all :) [constant folding] | The natice code generator probably also performs some of | those optimisations, but I am not sure exactly which. Yes, it tries quite hard to fold literal trees and usually=20 succeeds well enough that the generated code is pretty much identical to that emitted by gcc. J From kort@science.uva.nl Fri Dec 7 11:05:20 2001 From: kort@science.uva.nl (Jan Kort) Date: Fri, 07 Dec 2001 12:05:20 +0100 Subject: Strict foldl References: <15375.50342.279681.360674@reger.fmi.uni-passau.de> Message-ID: <3C10A270.8D53744F@wins.uva.nl> "Ch. A. Herrmann" wrote: > > Hi Haskellers, > > which compiler settings do I have to pass to ghc-5.02 > in order to achieve that the strictness analyzer > recognizes strictness of (+) in foldl and computes > sum in constant space? > > Prelude> sum [1..10000000] > > had the following effect: > > PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND > 23542 herrmann 20 0 250M 130M 97500 R 66.3 52.4 0:21 ghc-5.02 > > Of course, one could define a strict foldl oneself: > > > sfoldl f e [] = e > > sfoldl f e (x:xs) = (sfoldl f $! (f e x)) xs There is a foldl' in the Hugs Prelude that does this: foldl' :: (a -> b -> a) -> a -> [b] -> a foldl' f a [] = a foldl' f a (x:xs) = (foldl' f $! f a x) xs There are some functions in the Hugs Prelude that use foldl (or foldl1) and some use foldl'. Maybe someone can explain why certain functions use foldl: reverse, maximum, minimum and readInt, while others use foldl': length, sum and product. I can understand why reverse would use foldl, but why do maximum, minimum and readInt use foldl ? Maybe the function foldl1 was based on foldl' at one time ? Jan From Pierre.Lescanne@ens-lyon.fr Fri Dec 7 12:59:00 2001 From: Pierre.Lescanne@ens-lyon.fr (Pierre Lescanne) Date: Fri, 7 Dec 2001 13:59:00 +0100 Subject: RTA 2002 - Call for Papers Message-ID: <15376.48404.703938.420647@tourblanche.ens-lyon.fr> RTA 2002 - Call for Papers The 13th International Conference on Rewriting Techniques and Applicati= ons RTA'02 will take place from July 22, 2002 to July 24, 2002 in Copenhage= n, Denmark, as part of the Federated Logic Conference FLoC'02. Topics RTA is the major forum for the presentation of research on all aspects = of rewriting. Typical areas include (but are not limited to): * Applications: case studies; rule-based programming; symbolic and algebraic computation; theorem proving; functional and logic programming; proof checking. * Foundations: matching and unification; completion techniques; strategies; constraint solving; explicit substitutions. * Frameworks: string, term, and graph rewriting; lambda-calculus and= higher-order rewriting; conditional rewriting; proof nets; constra= ined rewriting and deduction; categorical and infinitary rewriting. * Implementation: compilation techniques; parallel execution; rewrit= ing tools. * Semantics: equational logic; rewriting logic. Best Paper Award A prize of 500 EUR will be given to the best paper as judged by the pro= gram committee. The program committee may decline to make the award or may s= plit it among several papers. Submissions Submissions must be original and not submitted for publication elsewher= e. Submissions should fall into one of the following categories: 1. Regular research papers describing new results; they will be judged = on correctness and significance. 2. Papers describing the experience of applying rewriting techniques in= other areas; they will be judged on relevance and comparison with other= approaches. 3. Problem sets that provide realistic and interesting challenges in th= e field of rewriting. 4. System descriptions; they should contain a link to a working system = and will be judged on usefulness and design. All submissions will be judged on originality. Submissions in the first= three categories can be up to 15 proceedings pages long, system descrip= tions 4 proceedings pages. Authors are strongly encouraged to use LaTeX2e and= the Springer llncs class file, available at http://www.springer.de/comp/lncs/authors.html. The title page should in= clude the submission category. Proofs of theorems should be provided in the p= aper, or, if space does not permit, should be made accessible otherwise (e.g.= , as an appendix to the submission or via the Web). Submission is by email: = Send a self-contained postscript file to Proceedings Accepted papers will be published in the proceedings of the symposium (Lecture Notes in Computer Science, Springer-Verlag). Simultaneous submission to other conferences with published proceedings is not allow= ed. Important dates * Tue January 15, 2002 - paper submission * Fri March 22, 2002 - author notification * Thu April 25, 2002 - camera-ready papers due Program Committee * chair: Sophie Tison LIFL - Laboratoire d'Informatique Fondamentale de Lille URA CNRS 369 Universit=E9 de Lille 1 Cit=E9 Scientifique --- Bat. M3 59655 Villeneuve d'Ascq cedex, FRANCE +33 03 20 43 43 09 +33 03 20 43 47 24 (secretary) +33 03 20 43 45 66 (fax) * Andrea Corradini , Pisa * Daniel J. Dougherty , Wesleyan * J=FCrgen Giesl , Aachen U of Tech= nology * Bernhard Gramlich , Vienna U of Technology * Th=E9r=E8se Hardin , Paris VI * Christopher Lynch , Clarkson * Jerzy Marcinkowski , Wroclaw * Aart Middeldorp , Tsukuba * Joachim Niehren , Saarland * Femke van Raamsdonk , Vrije U of Amsterdam * Albert Rubio , Technical U of Catalonia * Ralf Treinen , Paris-Sud From alms@cin.ufpe.br Fri Dec 7 14:38:04 2001 From: alms@cin.ufpe.br (Andre Santos) Date: Fri, 07 Dec 2001 11:38:04 -0300 Subject: Haskell Persistence References: <1113DDB24D4A2841951BFDF86665EE19066593@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <3C10D44C.7060400@cin.ufpe.br> Hi, a paper describing what a student and I did is in http://www.cin.ufpe.br/~alms/ps/persiste.ps.gz . The idea was to have a class supporting the persistence operations (more in the style of serialization) and to have specific data structures to allow a quicker retrieval of the data ("Persistence Containers"). This is similar to what we have in some Object Oriented Databases. For the low level implementation we used the work on Binary I/O work of Wallace/Runciman. But in order to get more portability we reimplemented parts of it using Strings/Chars for I/O, which ended up very inneficient in Haskell. Some things that might help are: - better binary I/O and/or to interface with some low level existing persistence mechanism. - I believe a kind of reflection mechanism would make things much easier and more efficient to implement. Although automatic derivation of the instances helps. There are some other references in the paper. cheers, Andre. > | -----Original Message----- > | From: Vorin, Michael [mailto:michael.vorin@eds.com] > | Sent: 07 December 2001 03:21 > | To: haskell@haskell.org > | Subject: Haskell Persistence > | > | > | I am interested in pursuing practical development of > | persistence in Haskell. To this end I have been looking for > | code/systems which have been developed previously to build > | upon - not wishing to reinvent the wheel. > | > | I have found some references in the literature but have been > | enable to track down any "artefacts". > | > | I was hopping someone could help me. > | > | I have found: > | (1) Efficient Persistent Haskell, Tony Davie, Kevin Hammond, > | and Juan Quintela Division of Computer Science, University of > | St Andrews, 1998 > | > | (2) Models for Persistence in Lazy Functional Programming > | Systems, McNally, University of St Andrews, 1993. > | > | (3) A Functional Database (1989) (Correct) Phil Trinder > | > | (4) Two Models For Integrating Persistence and Lazy > | Functional Languages > | (1991) David J. McNally, Antony J.T. Davie > | > | (5) Realizing State-Based Database Concepts in a Non-Strict, > | Statically Typed, Purely Functional Persistent Programming > | Language Yoshihiko Ichikawa Department of Information > | Sciences, Ochanomizu University > | > | > | _______________________________________________ > | Haskell mailing list > | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell > | > From anatoli@yahoo.com Fri Dec 7 16:29:44 2001 From: anatoli@yahoo.com (anatoli) Date: Fri, 7 Dec 2001 08:29:44 -0800 (PST) Subject: class parameters to existential datatypes In-Reply-To: Message-ID: <20011207162944.61676.qmail@web14205.mail.yahoo.com> In similar cases I'm doing this: > module Shapes where > class Shape s where > area :: s -> Double > data Rectangle = Rectangle Double Double > data Circle = Circle Double > instance Shape Rectangle where > area (Rectangle l w) = l*w > instance Shape Circle where > area (Circle r) = 2*pi*r > data ShapeRef = forall shape . Shape shape => ShapeRef shape > instance Shape ShapeRef where > area (ShapeRef s) = area s Now, for a heterogeneous list of shapes I can use [ShapeRef]. The last three (== 2+N, where N is the number of methods in the class) lines of code form a repeating pattern. The situation is begging for a language feature! I propose the following syntax: > object ShapeRef of Shape :) --- Hal Daume III wrote: > Hi, > > I would like to be able to write something like this: > > > data Foo c = forall a . c a => Foo a > > Unfortunately, this isn't allowed (apparently) because it's an illegal > class assertion (or at least that's what ghc tells me). > > My motivation for doing this is I want to have something like List, but a > class list where all you know is that every element is a member of some > class. I would write something like: > > > data CList c = CNil > > | forall a . (c a) => CCons a (CList c) > > that way I could have something like the prototypical: > > > class Shape a where { area :: a -> Double } > > data Circle = Circle Double > > data Rectangle = Rectangle Double Double > > instance Shape Circle where { area (Circle r) = 2 * pi * r } > > instance Shape Rectangle where { area (Rectangle l w) = l*w } > > MyList :: CList Shape > > MyList = CCons (Circle 5) (CCons (Rectangle 2 3) CNil) > > and then maybe have a function: > > > totalArea :: (CList Shape) -> Double > > totalArea = sum . map area > > obviously this function declaration is also invalid. > > so I have two questions: > > 1) Is there any particular reason whey we can't do this (it would > break some type safety things or whatever) > 2) Any ways to get around it? > > Thanks! __________________________________________________ Do You Yahoo!? Send your FREE holiday greetings online! http://greetings.yahoo.com From info@tvcuddleblanket.com Fri Dec 7 16:08:34 2001 From: info@tvcuddleblanket.com (TV Cuddle Blanket) Date: 7 Dec 2001 16:08:34 -0000 Subject: TV Cuddle Blanket The gift everybody will want !!! Message-ID: <20011207160834.5038.qmail@net-logik.com> ------10077476423c10e9820565d Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Click the link to read the message. http://www.tvcuddleblanket.com/email//read_mail.php?c=7&u=6328 ------10077476423c10e9820565d Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit


Open this message in a new window ------10077476423c10e9820565d-- From icsmif@unisannio.it Fri Dec 7 17:19:51 2001 From: icsmif@unisannio.it (icsmif@unisannio.it) Date: Fri, 7 Dec 2001 18:19:51 +0100 (CET) Subject: Icsm 2002 Call for Papers Message-ID: <200112071719.fB7HJpr18309@unisannio.it> Dear Colleague I would like to invite you at the IEEE International Conference on Software Maintenance, 2002, and associated workshops: SCAM, WSE, and WESS next October 2002 in Montreal, Canada. Outstanding Keynotes such as Jon Pincus, Microsoft, Industrial and experience papers, reseach papers, tutorials, tool expositions, dissertation forum, workshops, panels, and other exciting activities have been planned. We hope that this CFP will be useful for your work. Please forward the following to anybody who you think may be interested. Our apologies if you received multiple copy of this. If you would like to be removed from our list please send an email to icsm2002.info@unisannio.it with REMOVE in the subject. ICSM2002 Giuliano Antoniol, Program CoChair Ira D. Baxter, Program CoChair ============================================================================ IEEE International Conference on Software Maintenance 2002 Sponsored by IEEE ICSM-2002, Montreal, Canada, 3-6 October 2002 http://www.icsm2002.org icsm2002.info@unisannio.it Call for Papers Theme: Maintaining distributed heterogeneous systems ICSM is the major international conference in the field of software and systems maintenance, evolution, and management. This year's theme elaborates on last year's theme of "systems and software evolution in the era of the internet". Standalone legacy applications of yesterday and novel applications using today's technologies are rapidly becoming integrated as part of enterprise-wide and industry-wide systems. The need for rapid integration has led to many distributed heterogeneous systems that are very challenging to maintain and evolve. ICSM 2002 will address these new scenarios and the major challenges on maintenance and evolution. The focus of the conference will be on the new challenges that heterogeneous systems pose for software maintenance, and the new opportunities for researchers and practitioners. A main goal of ICSM is to promote interaction between researchers and practitioners. ICSM 2002 will bring together researchers, practitioners, developers and users of tools, technology transfer experts, and project managers. Jon Pincus (Microsoft) will describe how Microsoft handles software enhancements. Other outstanding Keynote speakers are being arranged. Past conferences have had Parnas, Rombach, McCabe, and Jacobson. ICSM-2002 will offer technical presentations and demonstrations from academia and industry. We are particularly interested in exchanging concepts, prototypes, research ideas, and other results that could contribute to the academic arena and also benefit business and the industrial community. ICSM 2002 will be participatory, with working collaborative sessions and presentations of industry projects. The Conference will be held in conjunction with: WESS -- Workshop on Empirical Studies of Software Maintenance. SCAM -- Source Code Analysis and Manipulation WSE -- Workshop on WEBsite Evolution Topics of interest include but are not restricted to the following aspects of maintenance and evolution: - Methods and theories - Maintenance and/or productivity metrics - Organizational frameworks - Preventive maintenance - Design for maintenance - Tools and environments - Life cycle and process control - Models/methods for error prediction - User interface evolution - Commercial off-the-shelf (COTS) - Third party maintenance - Freeware and open source applications - Program comprehension - Software and system visualisation - Knowledge based systems - Measurement of software - Formal methods - Legal aspects and standards - Software reusability - Internet and distributed systems - Empirical studies - Testing and regression testing - Remote, tele-work - Version and configuration management - Processes and strategies - Management and organisation - Co-operative applications - Source code analysis and manipulation - Processes and strategies - Impact of new software practices - Programming languages - Reengineering and reverse engineering - Multimedia systems RESEARCH PAPERS: Research papers should describe original and significant work in the research and practice of software maintenance and evolution. Case studies, empirical research, and experiments are particularly welcome. We also welcome papers that present leading edge and novel ideas in maintenance. Papers must not exceed 5000 words (10 pages IEEE style) in length, in English. To encourage strong submissions a prize will be awarded for the "Best Paper as Submitted". This Prize is offered by John Wiley & Sons, the publishers of the Journal of Software Maintenance and Evolution. The Program Committee will select the winner and a formal presentation of the Prize will be made in Montreal at ICSM 2002. FAST TRACK PAPERS: Fast Track papers should describe on-going research activities, or summarize the experience in software maintenance and evolution. Papers must not exceed 4 pages, IEEE style, in length, in English. Accepted fast-track papers will be included in a dedicated section of the conference proceedings. DISSERTATION FORUM: We welcome submissions of young researchers that have delivered their dissertation (Masters or Ph.D.) in the last three years. An award will be issued for the best submission. Four page summaries of accepted dissertations will be included in the conference proceedings and a special forum section will be organised at the conference. INDUSTRIAL APPLICATIONS: Proposals for presentations of Industrial Applications are welcome. These can be state-of-the-art descriptions, experience reports and survey reports from real projects, industrial practices and models, or tool demonstrations. A dedicated sub-committee of the program committee will review Industrial Application proposals and a 1-page summary of accepted proposals will be included in the conference proceedings. TUTORIALS: Tutorials should present software maintenance and evolution topics of interest to practitioners. Tutorials may be full day or half-day in length. SUBMISSION STYLE: PDF and/or Postscript electronic submission only. Papers longer than 15 pages or 6000 words will be returned to the authors. Acceptance notification will occur June 1, 2002. IMPORTANT DATES Research Papers deadline: 15 Feb. 2002 mailto:icsm2002.full@unisannio.it Fast Track Papers deadline: 1 May 2002 mailto:icsm2002.short@unisannio.it Dissertation Forum deadline: 15 Febr. 2002 mailto:icsm2002.thesis@unisannio.it Industrial Applications deadline: 15 March 2002 mailto:icsm2002.industry@unisannio.it Tutorials deadline: 15 Feb. 2002 mailto:icsm2002.tutorial@unisannio.it From XxHackerabwehrxX@mail.com Sun Dec 9 02:22:37 2001 From: XxHackerabwehrxX@mail.com (XxHackerabwehrxX@mail.com) Date: Sat, 8 Dec 2001 19:22:37 -0700 (MST) Subject: Wichtig Message-ID: <200112090222.TAA0000028236@int.iwhm.com> Hi, wir unterlagen einem Angriff verantwortungsloser ausländischer Hacker, deshalb sind wir aus Sicherheitsgründen auf einen besseren Server umgezogen. Es kam zu kurzen Ausfällen, wir bitten Sie um Verständnis. Wir zeigen in der neuen Auflage der *Hackerschule*, wie Sie die teuren ***0190 Dialer*** umgehen und so die kostenpflichtigen (zB. Sex-) Angebote zum Nulltarif nutzen! Wir zeigen Ihnen wie Sie einen beliebigen (AOL, AIM, Yahoo usw.) Chatraum total kontrollieren und mit mehreren Namen on sind! Wir haben natürlich auch SMS Programme die funzen..;-) Natürlich bezahlen Sie noch immer alle SMS über Ihr Handy. Wie lange noch ????...den Code gibts hier: Sie kennen die Konten Ihres Nachbarn noch nicht?...;-) In Ihrem Postfach tummeln sich Sexanbieter? Wir zeigen Ihnen, wie Sie diese loswerden...:-) http://tip.nu/hackerabwehr Das gesammte Wissen und die Toolz der erfolgreichsten Hacker! Sie finden ständig in der *Hackerschule* Mailbomber, Nuker, Scanner, IRC-Bots, Trojaner (Netbus, BO, Sub7...), Handy-Sicherheits-Software (Sie wissen schon... falls ein "Sicherheits"-Code vergessen wurde.. ), Virii, Worms, Crack-Tools, Calling-Card-Generatoren, Creditcard-Tools, DoS-Tools, POD-Tools uvm... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ACHTUNG: Wir dürfen hier aus rechtlichen Gründen nicht alles nennen... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **WMHS** From marks@desertsurf.com Sat Dec 8 02:55:31 2001 From: marks@desertsurf.com (LIL DRIVER) Date: Sat, 08 Dec 2001 18:55:31 1600 Subject: Kid's Holiday Gift of the Year Message-ID: <1007866531.852@com> Golf Cart For Kids - The Lil Driver Golf Cart golf gift of the year

LIL DRIVER GOLF CART
"The Perfect Holiday Gift"
for the 3 to 7 year old golfer! 
Lil Driver golf cart features high-gloss finish on impact-resistant
plastic. The cart drives as good as it looks -- like the real thing!

Rechargeable battery operated, rugged chassis, tough wheels and tires, solid steel chromed axles and suspension, heavy duty motor and gearbox. Two to four hours drive time depending on the child's weight and driving surface.  Includes removable canopy, golf bag and clubs.

**Buy Direct**  $279. + $16. S&H
  
For Telephone Orders
Call: 760-345-4734
Reference # CA1101

  
"Seeing our granddaughter's smile while driving her Lil Driver Golf Cart was wonderful"
 Lee & Helen - La Quinta, CA

The Lil Driver Ride-On Golf Cart features a high-gloss finish on the impact-resistant plastic body. Luxurious features include the seat and back rest with side bars, fold over nylon sun shade canopy, a Velcro strap to hold the Golf Bag in place. The smooth steering-wheel's 3 buttons operates the horn, motor sound and music melodies. Chrome handlebar and drinking cup space on dash, the forward and reverse shifter on the dash, accelerator/brake pedal on the floor, front and rear bumpers and a new automatic safety out-off switch, the Lil Driver is precision built using quality materials throughout.
  
Engineered for years of trouble free driving, the Lil Driver features a rugged chassis, tough wheels and tires, solid steel-chromed axles and suspension, heavy duty motor and gearbox, and 2 to 4 hour driving time depending on the child's weight and driving surface. 10-12 hour recharge time puts this vehicle in a class of its' own.
  
The Lil Driver is virtually maintenance free as well. Just keep it clean with a damp cloth and plastic polish. To recharge the battery simply plug the charging cord into the rear receptacle after use. Children will enjoy years of driving fun and playing golf!

LIL DRIVER FAX ORDER FORM
Please Print and Fax Toll Free to (888) 969-0559
Reference # CA1101

  Number of Golf Carts @ $279 each:        _____
  Shipping :  STANDARD at $16 each car  _____   EXPRESS  at $28 each car _____
  
  Name:                            ____________________________
  
  Address:                        ____________________________
  
 
City, State, Zip:              ____________________________
  
 
Email Address:               ____________________________
  
 
Phone Number:              ____________________________
  
 
Credit Card Type:          ____________________________
  
 
Credit Card Name:         ____________________________
  
 
Credit Card Number:      ____________________________
  
 
Credit Card Expiration:   ____________________________
  
 
Sub Total:                                                          ________________

 
CA Sales Tax (CA Shipping destinations only):   ________________
  
 
Total amount authorized to be charged:               ________________

  Shipping Address (if different from billing address):
  
 
Name:                  _______________________________
  
 
Address:               _______________________________
  
 
City, State, Zip:     _______________________________
  
 
Phone Number:     _______________________________
 
  Card Holder Signature:   ________________________________________
 

From welcome" To be removed from this list simply reply with remove in the subject line. Dear Webmaster, Okay you have a great web site? Submitted to all of the search engines? Even hired some college kid to "promote" you to all of the FFA boards that nobody ever reads? If so I guess that you monthly site traffic is probably in the region of 10 to 100 visitors if you are lucky and you are feeling rather depressed - right? Well we have the definitive answer - we positively guarantee you high quality, genuine traffic to your web site. We make just one 100% guaranteed and solid promise to you - "WE WILL GET PEOPLE LOOKING AT YOUR WEB SITE WITHIN A MONTH - AND IF WE DON'T GET THE AMOUNT OF VISITORS TO YOU THAT WE PROMISE YOU CAN HAVE YOUR MONEY BACK - period" Take a few seconds to see what you get from TrafficFusion.Com The Ultimate Traffic Source ! http://www.trafficfusion.com This the one and only package of it's kind you will never find a more complete source to drive traffic to your web site and it is only being offered for a limited time! Here's What You'll Get: 1,000 Guaranteed Visitors every month for one full year! ($19.95 Value every Month!) 5,000 FREE Banner Impressions Guaranteed every month for one full year! ($24.95 Value every Month!) $500 in FREE Keywords on a Major Search Engine! (That's 50,000 targeted visitors) Free Submission of your Press Release to over 2,500 Media Sources Nationwide every month for one full year! (That's $249 Value!) E-Mail over 1,000,000 Opt-in subscribers daily! Spam Free! (That's a $199 monthly Value) That's a yearly Value of Over $3500 Yours for less than you pay for hosting every month!! You'll Also Get "Guaranteed Hits Secrets Exposed" This package shows you how to generate up to 1,000 hits per hour anytime you want to (and even shows you how to make that 1,000 hits equal even more!). You will have Full Resale Rights to resell the "Guaranteed Hits Secrets Exposed" for any price you choose! (This sells daily on eBay for $199) You'll Also Get: Instant Access To To 1,000's of Resources! Free multi-submission to 100,000's of sites; Instantly! 1000's of FREE reports, ebooks, tutorials and more! Dozens of FREE traffic building tools! Huge collection of home-based internet business links and resources! FREE software including submission utilities, FREE ebook compiler software, meta-tag optimization tools, etc.! Links to over 10,000 FREE ad sites including search engines, classifieds, ffa pages, etc.! FREE webmaster services such as link and html checkers, keyword utilities, doorway page generators, color and graphics tools, etc. FREE web graphics for your website including logo templates, borders & backgrounds, buttons, ebook graphics ,etc. Plus much more! http://www.trafficfusion.com If you are serious about the success of your site give us a shot! There will never be another opportunity to get such a complete promotional package! This is not a quick fix! We will deliver traffic to your site month after month! This is a Full 1 Year membership in our program! We are the traffic professionals! Thanks http://www.trafficfusion.com From igloo@earth.li Sun Dec 9 21:09:24 2001 From: igloo@earth.li (Ian Lynagh) Date: Sun, 9 Dec 2001 21:09:24 +0000 Subject: --+ not treated as a start of a comment In-Reply-To: <15379.52874.123770.335674@vatten.crt.se>; from feliks@crt.se on Sun, Dec 09, 2001 at 09:50:18PM +0100 References: <20011209184346.A18100@stu163.keble.ox.ac.uk> <15379.52874.123770.335674@vatten.crt.se> Message-ID: <20011209210924.A18851@stu163.keble.ox.ac.uk> On Sun, Dec 09, 2001 at 09:50:18PM +0100, Feliks Kluzniak wrote: > > > while the report (and hugs) believe "--+ 1" is a comment. > > If a bystander is allowed to comment... > > Actually, the newer versions of the report say you can use "--" to begin a legal > lexeme (Sec. 2.3, p. 6). Euch. Is --- the start of a comment? Either way the lexical syntax needs to be changed, either to comment -> dashes {any} newline dashes -> -- {-} or to comment -> dashes {any} newline dashes -> -- Thanks Ian From gramlich@logic.at Sat Dec 8 17:14:18 2001 From: gramlich@logic.at (Bernhard Gramlich) Date: Sat, 8 Dec 2001 18:14:18 +0100 (CET) Subject: CFP: WRS 2002 - 2nd WS on Reduction Strategies in Rewriting and Programming Message-ID: <15378.19050.57437.328858@alpha.logic.tuwien.ac.at> [Apologies for multiple copies of this announcement] ************************************************************************** *************** first call for papers and participation **************** ************************************************************************** Second International Workshop on Reduction Strategies in Rewriting and Programming (WRS 2002) http://www.dsic.upv.es/users/elp/WRS2002 held in conjunction with RTA 2002 Copenhagen, Denmark, July 21, 2002 -------------------------------------------------------------------------- BACKGROUND AND AIMS Reduction strategies in rewriting and programming have attracted an increasing attention within the last years. New types of reduction strategies have been invented and investigated, and new results on rewriting / computation under particular strategies have been obtained. Research in this field ranges from primarily theoretical questions about reduction strategies to very practical application and implementation issues. The need for a deeper understanding of reduction strategies in rewriting and programming, both in theory and practice, is obvious, since they bridge the gap between unrestricted general rewriting (computation) and (more deterministic) rewriting with particular strategies (programming). Moreover, reduction strategies provide a natural way to go from operational principles (e.g., graph and term rewriting, narrowing, lambda-calculus) and semantics (e.g., normalization, computation of values, infinitary normalization, head-normalization) to implementations of programming languages. Therefore any progress in this area is likely to be of interest not only to the rewriting community, but also to neighbouring fields like functional programming, functional-logic programming, and termination proofs of algorithms. The workshop wants to provide a forum for the presentation and discussion of new ideas and results, recent developments, new research directions, as well as of surveys on existing knowledge in this area. Furthermore we aim at fostering interaction and exchange between researchers and students actively working on such topics. The workshop will be held in conjunction with RTA 2002 in Copenhagen (Denmark) on July 21, 2002. The workshop is (co-)organized by TU Valencia and TU Wien. TOPICS OF INTEREST Topics of interest include, but are not restricted to, - theoretical foundations for the definition and semantic description of reduction strategies - strategies in different frameworks (term rewriting, graph rewriting, infinitary rewriting, lambda calculi, higher order rewriting and explicit substitutions, conditional rewriting, rewriting with built-ins, narrowing, constraint solving, etc.) and their application in (equational, functional, functional-logic) programming (languages) - properties of reduction strategies / computations under strategies (e.g., completeness, computability, decidability, complexity, optimality, (hyper-)normalization, cofinality, fairness, perpetuality, context-freeness, neededness, laziness, eagerness, strictness) - interrelations, combinations and applications of reduction under different strategies (e.g., equivalence conditions for fundamental properties like termination and confluence, applications in modularity analysis, connections between strategies of different frameworks, etc.) - program analysis and other semantics-based optimization techniques dealing with reduction strategies - rewrite systems / tools / implementations with flexible / programmable strategies as essential concept / ingredient - specification of reduction strategies in (real) languages - data structures and implementation techniques for reduction strategies. SUBMISSIONS We solicit papers on all aspects of reduction strategies in rewriting and programming. Submissions should describe unpublished work, except for survey papers which are explicitly welcome, too. Submissions should not exceed 10 pages (however, survey papers may be longer) and be sent in postscript format to the PC co-chairs to the following e-mail address: wrs02@dsic.upv.es before April 15, 2002. Submissions should include the title, authors' names, affiliations, addresses, and e-mail. Selection of papers by the PC will be based on originality, significance, and correctness. Accepted papers will be included in the workshop proceedings that will be available at the workshop, and electronically on the web. Final versions will be due by June 17, 2002. PUBLICATION Accepted papers will be included in the workshop proceedings that will be available at the workshop, and electronically on the web. A special issue of the Journal of Symbolic Computation on Reduction Strategies in Rewriting and Programming will be designated for revised and extended versions of selected contributions from both WRS 2001 (Utrecht, May 2001) and WRS 2002. PROGRAM COMMITTEE Sergio Antoy Portland (USA) Roberto Di Cosmo Paris VII (France) Bernhard Gramlich (co-chair) Wien (Austria) Michael Hanus Kiel (Germany) Claude Kirchner Nancy (France) Paul Klint CWI Amsterdam (The Netherlands) Salvador Lucas (co-chair) Valencia (Spain) Manfred Schmidt-Schauss Frankfurt am Main (Germany) Yoshihito Toyama Tohoku (Japan) ORGANIZERS Bernhard Gramlich (co-chair) Technische Universitaet Wien Salvador Lucas (co-chair) Universidad Politecnica de Valencia IMPORTANT DATES Deadline for submissions: April 15, 2002 Notification: May 27, 2002 Final versions due: June 17, 2002 Workshop: July 21, 2002 FURTHER INFORMATION WRS 2002 website: http://www.dsic.upv.es/users/elp/WRS2002 WRS 2002 e-mail address: wrs02@dsic.upv.es RTA 2002 website: http://www.ericsson.com/cslab/rta2002/ FLoC 2002 website: http://floc02.diku.dk WRS 2002 website at FLoC: http://floc02.diku.dk/WRS ************************************************************************** From ahey@iee.org Mon Dec 10 05:49:41 2001 From: ahey@iee.org (Adrian Hey) Date: Mon, 10 Dec 2001 05:49:41 +0000 Subject: Another question about sharing Message-ID: <01121005121200.01267@localhost.localdomain> Hello, If I have.. data Path = L Path | R Path | T paths = T : branch paths branch (p:ps) = L p : R p : branch ps This will be a CAF which can never be garbage collected, but may grow indefinitely large as it gets reduced. Correct? Is it possible to avoid this problem somehow? What I have in mind is a special thunk which get's copied (as a normal thunk) before it gets reduced. Pointer references are preserved during copying, except self referential pointers, which are updated to point to the new thunk. Alternatively.. I had thought maybe a function with a dummy argument like this would do.. paths x = let paths' = T : branch paths' in paths' But the paths' will just be lambda lifted as a CAF (I believe) This seems to solve the lambda lifting problem.. paths x = T : branch (paths x) but I'm not sure how compilers will treat this. I think I'll also loose the sharing of earilier paths in new paths, unless the compiler optimises the self reference. If I redefined my datatype.. data Path x = L (Path x) | R (Path x) | T x I could then use the function with dummy argument solution.. paths x = let paths' = T x : branch paths' in paths' This seems to solve both problems, but there's yet another problem I anticipate.. When using any of these dummy argument solutions I have to make sure the argument is not a constant (or I'm back to the lambda lifting problem again). So it has to be any handy unknown variable (argument)? This presents the problem that the unknown variable may itself be quite large, and have it's lifetime unduly prolonged because it's now referenced by many paths. Any advice? Thanks -- Adrian Hey From simonmar@microsoft.com Mon Dec 10 11:18:52 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 10 Dec 2001 11:18:52 -0000 Subject: Another question about sharing Message-ID: <9584A4A864BD8548932F2F88EB30D1C607AADBDB@TVP-MSG-01.europe.corp.microsoft.com> > If I have.. > data Path =3D L Path | R Path | T > paths =3D T : branch paths > branch (p:ps) =3D L p : R p : branch ps >=20 > This will be a CAF which can never be garbage collected, but > may grow indefinitely large as it gets reduced. Correct? GHC will collect the CAF when it can determine that it is no longer required. In GHCi, the CAF will only be collected if you turn on ':set +r', otherwise evaluated CAFs are retained between evaluations. Cheers, Simon From Malcolm.Wallace@cs.york.ac.uk Mon Dec 10 13:33:33 2001 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Mon, 10 Dec 2001 13:33:33 +0000 Subject: Another question about sharing In-Reply-To: <01121005121200.01267@localhost.localdomain> Message-ID: > If I have.. > data Path = L Path | R Path | T > paths = T : branch paths > branch (p:ps) = L p : R p : branch ps > > This will be a CAF which can never be garbage collected, but > may grow indefinitely large as it gets reduced. Correct? Any decent compiler will garbage collect the CAF when it is no longer needed. However, this does not solve the problem that the CAF could grow very large whilst its value is still required. Regards, Malcolm From ralf@informatik.uni-bonn.de Mon Dec 10 14:26:26 2001 From: ralf@informatik.uni-bonn.de (Ralf Hinze) Date: Mon, 10 Dec 2001 15:26:26 +0100 Subject: WAAAPL 2002, preliminary announcement Message-ID: <20011210142250.D19C770CBA@postfix.informatik.uni-bonn.de> Apologies if you receive multiple copies... ============================================================================ PRELIMINARY CALL FOR PAPERS [Deadline for submission: 3rd June 2002] WAAAPL 2002 Workshop on Algorithmic Aspects of Advanced Programming Languages Part of PLI'02 (approval pending) Pittsburgh, PA, USA date to be announced (probably Oct 7 or Oct 8, 2002) http://www.cs.uni-bonn.de/~ralf/waaapl02.{html,pdf,ps,dvi,txt} ============================================================================ 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: to be announced (probably Oct 7 or Oct 8, 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 accepted papers will be published as a University of Bonn technical report. 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 ============================================================================ From lhe@L4i.se Mon Dec 10 09:26:27 2001 From: lhe@L4i.se (Lars-Henrik Eriksson) Date: Mon, 10 Dec 2001 10:26:27 +0100 Subject: FME'2002, 2nd CFP Message-ID: apologies if you receive multiple copies... FORMAL METHODS EUROPE FME 2002 "Formal Methods: Getting IT Right" International Symposium and Tutorials http://floc02.diku.dk/FME/ 20-24 July 2002 Second Call for Papers ********************** =46ME 2002 is the eleventh in a series of symposia organised by Formal Methods Europe, an independent association whose aim is to stimulate the use of, and research on, formal methods for software development. These symposia have been notably successful in bringing together a community of users, researchers, and developers of precise mathematical methods for software development. In 2002 the symposium will be held in conjunction with the third Federated Logic Conference (FLoC'02) in Copenhagen, Denmark. The theme of FME 2002 is Formal Methods: Getting IT Right. The double meaning is intentional. On the one hand, the theme acknowledges the significant contribution formal methods can make to Information Technology, by enabling computer systems to be described precisely and reasoned about with rigour. On the other hand, it recognises that current formal methods are not perfect, and further research and practice are required to improve their foundations, applicability and effectiveness. =46ME seeks papers in all aspects of formal methods for computer systems, including the following: * theoretical foundations * practical use and case studies * specification and modelling techniques * software development and refinement * tool support and software engineering environments for formal methods * verification and validation * hidden formal methods, and making benefits available to non-experts * reusable domain theories * method integration * hardware verification In addition to presentations of submitted papers, the symposium will offer tutorials, workshops, invited speakers, and tool demonstrations. PAPERS =46ull papers should be submitted in Postscript or PDF format by e-mail to reach the Program Co-chairs by 15 January 2002. Papers will be refereed by the Program Committee and must be original research papers that have not been submitted elsewhere for publication. Accepted papers will be published in the symposium proceedings. Papers should not exceed twenty pages, although longer papers will be considered if their content justifies it. LNCS format should be used: see http://www.springer.de/comp/lncs/authors.html for details. Please include a short list of keywords on a separate line at the end of the abstract, beginning with the word "Keyword:" in boldface. OTHER SYMPOSIUM ACTIVITIES Tutorials and workshops will be held on 20-21 July 2002. Each tutorial will last one-half or one day. Proposals are welcome, and should be directed to the Program Co-chairs by 15 January 2002; more details will appear on the web-site above. Tool demonstrations will also take place during the symposium, with the opportunity for presentations to be made about each tool. Proposals for tool demonstrations should be made to the Tool Demonstration Coordinator, with whom provison of necessary computing facilities should be discussed. PEOPLE Organising Chair Dines Bj=F8rner Informatics and Mathematical Modelling Building 322, Richard Petersens Plads Technical University of Denmark DK-2800 Lyngby, Denmark Tel: +45 4525 3720 Email: db@imm.dtu.dk Programme Co-chairs Lars-Henrik Eriksson, Industrilogik L4i AB Box 6205, SE-102 34 Stockholm, Sweden Tel: +46 8 670 37 10 Fax: +46 8 32 12 82 Email: lhe@L4i.se Peter Lindsay, Software Verification Research Centre The University of Queensland, Queensland 4072, Australia Tel: +61 7 3365 2005 Fax: +61 7 3365 1533 Email: Peter.Lindsay@svrc.uq.edu.au Programme Committee Bernhard Aichernig Graz University of Technology, Austria Juan Bicarregui Rutherford Appleton Laboratory, UK Ernie Cohen Telcordia Technologies, USA Ben Di Vito NASA Langley Research Center, USA Cindy Eisner IBM Haifa Research Laboratory, Israel Lars-Henrik Eriksson (co-chair) Industrilogik, Sweden John Fitzgerald Transitive Technologies Ltd, UK Jim Grundy Intel Corporation, USA Yves Ledru LSR/IMAG, France Peter Lindsay (co-chair) University of Queensland, Australia Markus Montigel University of New Orleans, USA Richard Moore IFAD, Denmark Tobias Nipkow Technische Universit=E4t M=FCnchen, Germany Colin O'Halloran Qinetiq (ex-DERA), UK Jose Oliveira Universidade do Minho, Portugal Nico Plat West Consulting, The Netherlands Jeannette Wing Carnegie Mellon University, USA Jim Woodcock Oxford University, UK Joakim von Wright =C5bo Akademi University, Finland Pamela Zave AT&T Laboratories, USA Tool Demonstration Coordinator Paul Mukherjee The Institute of Applied Computer Sciense (IFAD) Forskerparken 10, DK-5230 Odense M, Denmark Tel: +45 6315 7131 Fax: +45 6593 2999 Email: paul.mukherjee@ifad.dk IMPORTANT DATES Submission of papers, tutorial proposals and workshop proposals: 15 January 2002 Notification of acceptance/rejection: 27 March 2002 Camera ready final version of papers due: 10 May 2002 l From ahey@iee.org Mon Dec 10 14:37:37 2001 From: ahey@iee.org (Adrian Hey) Date: Mon, 10 Dec 2001 14:37:37 +0000 Subject: Another question about sharing In-Reply-To: <9584A4A864BD8548932F2F88EB30D1C607AADBDB@TVP-MSG-01.europe.corp.microsoft.com> References: <9584A4A864BD8548932F2F88EB30D1C607AADBDB@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: <01121014205200.01052@localhost.localdomain> On Monday 10 December 2001 11:18 am, Simon Marlow wrote: > > If I have.. > > data Path = L Path | R Path | T > > paths = T : branch paths > > branch (p:ps) = L p : R p : branch ps > > > > This will be a CAF which can never be garbage collected, but > > may grow indefinitely large as it gets reduced. Correct? > > GHC will collect the CAF when it can determine that it is no longer > required. In GHCi, the CAF will only be collected if you turn on ':set > +r', otherwise evaluated CAFs are retained between evaluations. Thanks, I'm curious, how does GHC determine that the CAF is no longer required if it is referenced by code (somehow)? If code was also some kind of heap allocated data structure I guess this would be possible, but I thought this wasn't so with GHC. But in any case, I'm not sure this really helps me. I don't really mind if the unreduced form of the CAF is garbage collected or not (it's only going to be a few words of memory). The effect I'm trying to get is to ensure that the (partially) reduced form of the CAF only lives as long as any (non code) heap object which references it. Does that make sense? (probably not:-) This code was originally written in Clean, and the Clean designers addressed this problem by allowing the programmer to distinguish between constants and functions with no arguments. (The latter being a fragment of code which reconstructs the constant each time it's called, rather than having just one occurrence as a CAF.) It's typically used to inhibit sharing. I don't believe there is any such distinction in Haskell. I thought maybe there was a trick you could use in Haskell to achieve the same effect, but I don't think there is (unless I'm missing something). Regards -- Adrian Hey From simonmar@microsoft.com Mon Dec 10 14:49:56 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 10 Dec 2001 14:49:56 -0000 Subject: Another question about sharing Message-ID: <9584A4A864BD8548932F2F88EB30D1C607AADC72@TVP-MSG-01.europe.corp.microsoft.com> > I'm curious, how does GHC determine that the CAF is no longer required > if it is referenced by code (somehow)? If code was also some kind of > heap allocated data structure I guess this would be possible, but I > thought this wasn't so with GHC. GHC actually tracks references to top-level entities from code, so that the GC can trace the transitive closure of live code and hence find all the reachable CAFs. It's a real pain, but worth it. > But in any case, I'm not sure this really helps me. I don't really > mind if the unreduced form of the CAF is garbage collected or not > (it's only going to be a few words of memory). The effect I'm trying > to get is to ensure that the (partially) reduced form of the CAF only > lives as long as any (non code) heap object which references it. > Does that make sense? (probably not:-) If I understand correctly, that's the behaviour you'll get with GHC, and (I think) nhc98. Cheers, Simon From Malcolm.Wallace@cs.york.ac.uk Mon Dec 10 14:51:28 2001 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Mon, 10 Dec 2001 14:51:28 +0000 Subject: Another question about sharing In-Reply-To: <01121014205200.01052@localhost.localdomain> Message-ID: > > data Path = L Path | R Path | T > > paths = T : branch paths > > branch (p:ps) = L p : R p : branch ps > This code was originally written in Clean, and the Clean designers > addressed this problem by allowing the programmer to distinguish > between constants and functions with no arguments. (The latter > being a fragment of code which reconstructs the constant each time > it's called, rather than having just one occurrence as a CAF.) > It's typically used to inhibit sharing. > > I don't believe there is any such distinction in Haskell. > I thought maybe there was a trick you could use in Haskell to > achieve the same effect Well, how about the following little circular program? paths :: () -> [Path] paths () = let r = T : branch r in r As far as I can understand what you are looking for, I think this meets the bill. Every use of the expression `paths ()' will re-evaluate the infinite structure to the extent its context requires it, and the expanded value will be thrown away as soon as the value of this instance of `paths ()' is no longer required. Regards, Malcolm From simonmar@microsoft.com Mon Dec 10 15:04:06 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 10 Dec 2001 15:04:06 -0000 Subject: Another question about sharing Message-ID: <9584A4A864BD8548932F2F88EB30D1C607AADC79@TVP-MSG-01.europe.corp.microsoft.com> > Well, how about the following little circular program? >=20 > paths :: () -> [Path] > paths () =3D let r =3D T : branch r in r >=20 > As far as I can understand what you are looking for, I think=20 > this meets > the bill. Every use of the expression `paths ()' will re-evaluate > the infinite structure to the extent its context requires it, and the > expanded value will be thrown away as soon as the value of this > instance of `paths ()' is no longer required. You can't rely on adding dummy arguments to cause re-evaluation: full-laziness (enabled when optimisation is on in GHC) will do the opposite transformation. Cheers, Simon From Malcolm.Wallace@cs.york.ac.uk Mon Dec 10 15:13:35 2001 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Mon, 10 Dec 2001 15:13:35 +0000 Subject: Another question about sharing In-Reply-To: <9584A4A864BD8548932F2F88EB30D1C607AADC79@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: > You can't rely on adding dummy arguments to cause re-evaluation: > full-laziness (enabled when optimisation is on in GHC) will do the > opposite transformation. Well in this case, you may find it harder to claim that the full laziness transformation constitutes an `optimisation'. Maybe the GHC manual should have a section on "Flags for worsening the space behaviour of programs". :-) Seriously, would it be difficult to detect when performing this `optimisation' would introduce a CAF and perhaps back it out appropriately? Regards, Malcolm From simonmar@microsoft.com Mon Dec 10 15:32:48 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Mon, 10 Dec 2001 15:32:48 -0000 Subject: Another question about sharing Message-ID: <9584A4A864BD8548932F2F88EB30D1C607AADC8B@TVP-MSG-01.europe.corp.microsoft.com> > > You can't rely on adding dummy arguments to cause re-evaluation: > > full-laziness (enabled when optimisation is on in GHC) will do the > > opposite transformation. >=20 > Well in this case, you may find it harder to claim that the full > laziness transformation constitutes an `optimisation'. Maybe the > GHC manual should have a section on "Flags for worsening the space > behaviour of programs". :-) >=20 > Seriously, would it be difficult to detect when performing this > `optimisation' would introduce a CAF and perhaps back it out > appropriately? The problem isn't restricted to CAFs - full laziness always trades space for time. We found that it can be a large win in some cases: if repeated computation is replaced by sharing in an inner loop, then the gains can be dramatic. We didn't meet any cases where it caused space problems, so you get it by default[1] when optimisation is turned on in GHC. You can always disable it with -fno-full-laziness. Cheers, Simon [1] Actually what you get is almost-full-laziness: GHC won't split adjacent lambda abstractions if it finds it can float an expression past some of the lambdas but not all. From igloo@earth.li Mon Dec 10 16:34:47 2001 From: igloo@earth.li (Ian Lynagh) Date: Mon, 10 Dec 2001 16:34:47 +0000 Subject: Clarification of \begin{code} ... \end{code} stuff In-Reply-To: <20011210160327.A24481@stu163.keble.ox.ac.uk>; from igloo@earth.li on Mon, Dec 10, 2001 at 04:03:27PM +0000 References: <20011210160327.A24481@stu163.keble.ox.ac.uk> Message-ID: <20011210163447.A24643@stu163.keble.ox.ac.uk> On Mon, Dec 10, 2001 at 04:03:27PM +0000, Ian Lynagh wrote: > > In the thread "Literate scripts not handled correctly" Simon Marlow > said: > > > Yes, it looks like GHC's unlit program removes whitespace when looking > > for \begin{code}, but not for \end{code}. The report isn't explicit > > about whether whitespace is allowed on these lines, but I would tend to > > the view that it isn't. > > Can you please clarify this in the report [...] Here's an interesting snippet: \begin{code} foo = "hello\ \end{code}" \end{code} which nhc and hugs accept, GHC says "error in character literal". I think this is a good reason for at least non-whitespace to not be allowed on the \begin{code} and \end{code} lines (or rather, for lines with other non-whitespace on them not to be treated as such). Thanks Ian From simonpj@microsoft.com Tue Dec 11 09:15:17 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 11 Dec 2001 01:15:17 -0800 Subject: FW: Clarification of \begin{code} ... \end{code} stuff Message-ID: <1113DDB24D4A2841951BFDF86665EE190665BB@RED-MSG-10.redmond.corp.microsoft.com> > In the thread "Literate scripts not handled correctly" Simon Marlow > said: >=20 > > Yes, it looks like GHC's unlit program removes whitespace when=20 > > looking for \begin{code}, but not for \end{code}. The report isn't=20 > > explicit about whether whitespace is allowed on these lines, but I=20 > > would tend to the view that it isn't. >=20 > Can you please clarify this in the report [...] I'm sure the "\begin{code}" and "\end{code}" should be at the beginning of a line. Whether anything else should be allowed on that line is moot. Maybe not. What would the layout be for this? \begin{code} f x =3D x \end{code} On the other hand it would be painful if a block of code was omitted because of a trailing space on the \begin{code} line; an easy error. I therefore propose code starts on the line *following* a line beginning with \begin{code}. And similarly stops on a line beginning \end{code}. For Ian's snippet: \begin{code} foo =3D "hello\ \end{code}" \end{code} I think it's clear that the first \end{code} should be scanned as part of the string literal. Simon From simonpj@microsoft.com Tue Dec 11 09:37:05 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 11 Dec 2001 01:37:05 -0800 Subject: GCD Message-ID: <1113DDB24D4A2841951BFDF86665EE190665BD@RED-MSG-10.redmond.corp.microsoft.com> About the GCD operator, the Haskell Report currently says: "gcd x y is the greatest integer that divides both x and y.=20 lcm x y is the smallest positive integer that both x and y divide." Why does 'lcm' say 'positive' while 'gcd' does not? What is gcd -3 -6 Presumably 3, not -3. You could say that is obvious, since 3 > -3. So I propose to add "positive" to the gcd spec: gcd x y is the greatest POSITIVE integer=20 that divides both x and y.=20 I don't think that changes the specification in fact, but experience has led me to always check these things! Simon From herrmann@infosun.fmi.uni-passau.de Tue Dec 11 10:06:28 2001 From: herrmann@infosun.fmi.uni-passau.de (Ch. A. Herrmann) Date: Tue, 11 Dec 2001 11:06:28 +0100 Subject: GCD In-Reply-To: <1113DDB24D4A2841951BFDF86665EE190665BD@RED-MSG-10.redmond.corp.microsoft.com> References: <1113DDB24D4A2841951BFDF86665EE190665BD@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <15381.55972.799338.486379@reger.fmi.uni-passau.de> >>>>> "Simon" == Simon Peyton-Jones writes: Simon> gcd x y is the greatest POSITIVE integer that divides Simon> both x and y. Simon> I don't think that changes the specification in fact, but Simon> experience has led me to always check these things! I find it confusing to read a definition which contains redundant information. Instead, I'd suggest to add something like: "Note: this number is always positive" Cheers -- Christoph Herrmann From simonpj@microsoft.com Tue Dec 11 10:07:39 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 11 Dec 2001 02:07:39 -0800 Subject: Instance declarations and class exports Message-ID: <1113DDB24D4A2841951BFDF86665EE190665C2@RED-MSG-10.redmond.corp.microsoft.com> Folks, Iavor has made two excellent points, upon which I have been ruminating (and consulting). Consider module Foo( M.Ix( index ) ) where import qualified Ix as M( Ix ) import qualified Ix as T( index ) instance M.Ix MyType where index a =3D ... index v =3D ... -- A local declaration Notice that: * The Ix class is in scope as "M.Ix", but its index method is in scope ias "T.index". =20 * Nevertheless, it's 100% clear what we mean in the instance declaration * It's also 100% clear what we mean in the export list M.Ix( index ) (The report is currently silent about whether this is legal.) * These two situations are very similar, and should be=20 resolved in the same way * I think we all agree that it woudl be illegal to mention the 'range' method of the Ix class, either in the instance cecl, or in theexport list. Why? Because 'range' is not imported. I therefore want to propose: 1. "subordinate" names in export lists are always unqualified Thus, we can have M.Ix( index ), but not M.Ix( T.index ). 2. A subordinate name in an export list is legal if the entity (class operation or data constructor) is in scope in the module, regardless of whether it is in scope under a qualified or unqualified name. =20 (In the example, T.index.) 3. The exact same rule is used to determine whether the class method name on the LHS of an instance-decl binding is legal. This time I have implemented the rule first, and it seems fine. These are basically clarifications. Objections? Comments? I'd like to find a better wording for (2) above. Simon From drs@dmu.ac.uk Tue Dec 11 10:16:11 2001 From: drs@dmu.ac.uk (David Smallwood) Date: Tue, 11 Dec 2001 10:16:11 GMT Subject: haxml Message-ID: <200112111016.fBBAGBG00226@crazy-horse.cs.cse.dmu.ac.uk> Does anyone know of a mirror site where I can download the latest version of HaXml. (Connection to York is - and has been for a while - apparently down: ftp://ftp.cs.york.ac.uk/pub/haskell/HaXml/HaXml-1.02.tar.gz, that is) Many thanks d. -- David Smallwood Dept. of Computing Science De Montfort University The Gateway Leicester LE1 9BH, UK drs@dmu.ac.uk From john@repetae.net Tue Dec 11 10:17:18 2001 From: john@repetae.net (John Meacham) Date: Tue, 11 Dec 2001 02:17:18 -0800 Subject: GCD In-Reply-To: <15381.55972.799338.486379@reger.fmi.uni-passau.de>; from herrmann@infosun.fmi.uni-passau.de on Tue, Dec 11, 2001 at 11:06:28AM +0100 References: <1113DDB24D4A2841951BFDF86665EE190665BD@RED-MSG-10.redmond.corp.microsoft.com> <15381.55972.799338.486379@reger.fmi.uni-passau.de> Message-ID: <20011211021718.A1728@momenergy.repetae.net> On Tue, Dec 11, 2001 at 11:06:28AM +0100, Ch. A. Herrmann wrote: > >>>>> "Simon" == Simon Peyton-Jones writes: > Simon> gcd x y is the greatest POSITIVE integer that divides > Simon> both x and y. > > Simon> I don't think that changes the specification in fact, but > Simon> experience has led me to always check these things! > > I find it confusing to read a definition which contains redundant > information. Instead, I'd suggest to add something like: > > "Note: this number is always positive" yeah. I strongly agree with this wording. precision without confusion is a really nice feature in specifications. mainly i know that if i were to read the redundant version I would invariably spend several brain cycles trying to figure out why it isn't redundant, only to conclude that it is. John -- --------------------------------------------------------------------------- John Meacham - California Institute of Technology, Alum. - john@repetae.net --------------------------------------------------------------------------- From S.M.Kahrs@ukc.ac.uk Tue Dec 11 10:20:39 2001 From: S.M.Kahrs@ukc.ac.uk (S.M.Kahrs) Date: Tue, 11 Dec 2001 10:20:39 +0000 Subject: GCD Message-ID: The natural reading of 'greatest' is, of course, the greatest in the divisibility preorder (it's partial order on natural numbers but only a preorder on integers). Thus, gcd 0 0 =3D 0. 3 and -3 are equivalent in that preoder. Thus, an additional comment may be in order. Stefan From Malcolm.Wallace@cs.york.ac.uk Tue Dec 11 10:36:27 2001 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Tue, 11 Dec 2001 10:36:27 +0000 Subject: Instance declarations and class exports Message-ID: > I therefore want to propose: > > 1. "subordinate" names in export lists are always unqualified > Thus, we can have M.Ix( index ), but not M.Ix( T.index ). I don't see a compelling reason to outlaw the latter. We can permit the subordinate name to be unqualified, but why should we enforce it? Ditto for method names in instance decls. > I'd like to find a better wording for (2): > > 2. A subordinate name in an export list is legal if the entity (class > operation or data constructor) is in scope in the module, regardless > of whether it is in scope under a qualified or unqualified name. > (In the example, T.index.) Suggestion: A method name, constructor, or field name is permitted to be used unqualified in a subordinate position of an export list, iff the entity it refers to is in scope in the module, regardless of whether the name must be used qualified elsewhere in the module. There is a distinction between a subordinate name (e.g. the index method of Ix), and its use in a subordinate position (e.g. in Ix(index)). In the example, it would be perfectly legal to say module Foo( T.index ) where import qualified Ix as M( Ix ) import qualified Ix as T( index ) index v = ... -- A local declaration where the method name (but not its class) is re-exported. Regards, Malcolm From Keith.Wansbrough@cl.cam.ac.uk Tue Dec 11 10:42:55 2001 From: Keith.Wansbrough@cl.cam.ac.uk (Keith Wansbrough) Date: Tue, 11 Dec 2001 10:42:55 +0000 Subject: GCD In-Reply-To: Your message of "Tue, 11 Dec 2001 11:06:28 +0100." <15381.55972.799338.486379@reger.fmi.uni-passau.de> Message-ID: > Simon> gcd x y is the greatest POSITIVE integer that divides > Simon> both x and y. > > I find it confusing to read a definition which contains redundant > information. Instead, I'd suggest to add something like: > > "Note: this number is always positive" Or, perhaps easier on the eye, "gcd x y is the greatest (positive) integer that divides both x and y." --KW 8-) -- Keith Wansbrough http://www.cl.cam.ac.uk/users/kw217/ University of Cambridge Computer Laboratory. From simonpj@microsoft.com Tue Dec 11 11:02:37 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 11 Dec 2001 03:02:37 -0800 Subject: Instance declarations and class exports Message-ID: <1113DDB24D4A2841951BFDF86665EE190665C8@RED-MSG-10.redmond.corp.microsoft.com> | > 1. "subordinate" names in export lists are always=20 | unqualified Thus,=20 | > we can have M.Ix( index ), but not M.Ix( T.index ). |=20 | I don't see a compelling reason to outlaw the latter. We can=20 | permit the subordinate name to be unqualified, but why should=20 | we enforce it? Ditto for method names in instance decls. Allowing qualified names on the *lhs* of instance decls involves two new productions (qfunlhs, etc) that I have only just nuked. I sent mail about that some while ago, to see if anyone really thought we should keep it. Then, for export lists, the argument becomes one of uniformity=20 (with instance decls) and simplicity. It seems compelling enough to me. Thanks for your wording suggestions. Simon From mechvel@math.botik.ru Tue Dec 11 11:28:49 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Tue, 11 Dec 2001 14:28:49 +0300 Subject: gcd 0 0 Message-ID: People write about the Report definition of gcd x y as of greatest integer that divides x and y, and mention > gcd 0 0 = 0 But 2 also divides 0, because 2*0 = 0. Does the Report specify that gcd 0 0 is not defined? For an occasion: probably, it is better to specify this. ----------------- Serge Mechveliani mechvel@botik.ru From kentk@md.chalmers.se Tue Dec 11 16:10:59 2001 From: kentk@md.chalmers.se (Kent Karlsson) Date: Tue, 11 Dec 2001 17:10:59 +0100 Subject: GCD In-Reply-To: Message-ID: <000101c1825e$6ce26e80$b4e21081@chalmers95a69n> I don't think preorders of any kind should be involved here. Just the ordinary order on integers. No divisibility preorder (I'm not sure how that is even defined, so how it could be natural beats me), no absolute value. I find the unaltered text Simon quoted to be fine as is. But for those who like to be more precise (forgive the TeXese): % Most of you may wish to stop reading at this point. % I is the set of integers representable in the integral datatype. % result_I may return "overflow" or the argument, as appropriate. \begin{example}\atab $gcd_I : I \times I \rightarrow I \cup \{\overflow, \infinitary\}$ \end{example} \begin{example}\atab $gcd_I(x,y)$ \>$= result_I(\max\{v \in \ZZ ~~|~~ v|x $ and $v|y\})$\\ \> \>if $x,y \in I$ and ($x \neq 0$ or $y \neq 0$)\\ \>$= \infinitary(\posinf)$ \>if $x = 0$ and $y = 0$ \end{example} % There is no need to say "v>0" above, since there are always positive values in that % set, and max picks the largest/greatest one. 0 has all integer values except(!) 0 % as divisors. So for gcd 0 0 (maximum, supremum really, of the intersection of the two % sets of divisors) the result is really positive infinity, which should be the result % returned when representable (recommendable for Haskell's Integer datatype). gcd will % overflow for instances like gcd (minBound::Int) (minBound::Int). \begin{example}\atab\\ $lcm_I : I \times I \rightarrow I \cup \{\overflow\}$ \end{example} \begin{example}\atab $lcm_I(x,y)$ \>$= result_I(\min\{v \in \ZZ ~~|~~ x|v $ and $ y|v $ and $ v > 0\})$\\ \> \>if $x,y \in I$ and $x \neq 0$ and $y \neq 0$\\ \>$= 0$ \>if $x,y \in I$ and ($x = 0$ or $y = 0$) \end{example} % the "v>0" is needed here, since the set here would otherwise always contain % infinitely many negative values, and then minimum of that... Kind regards /kent k > -----Original Message----- > From: haskell-admin@haskell.org [mailto:haskell-admin@haskell.org]On > Behalf Of S.M.Kahrs > Sent: den 11 december 2001 11:21 > To: haskell@haskell.org > Subject: Re: GCD > > > The natural reading of 'greatest' is, of course, > the greatest in the divisibility preorder (it's partial order > on natural numbers but only a preorder on integers). > Thus, gcd 0 0 = 0. > > 3 and -3 are equivalent in that preoder. > > Thus, an additional comment may be in order. > > Stefan > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell From ger@tzi.de Tue Dec 11 17:18:31 2001 From: ger@tzi.de (George Russell) Date: Tue, 11 Dec 2001 18:18:31 +0100 Subject: gcd 0 0 Message-ID: <3C163FE7.15D7F3F3@tzi.de> S.D.Mechveliani wrote > Does the Report specify that gcd 0 0 is not defined? Yes. The Report definition says gcd :: (Integral a) => a -> a -> a gcd 0 0 = error "Prelude.gcd: gcd 0 0 is undefined" gcd x y = gcd' (abs x) (abs y) where gcd' x 0 = x gcd' x y = gcd' y (x `rem` y) On reflection, this is quite right. a divides b <=> there is an integer n with na = b. Thus any integer divides 0, and so the "greatest common divisor" would have to be the greatest integer, which is nonsense. Of course if you adopt Stephan Kahrs definition of "greatest", taken with respect to the partial order a<=b <=> a divides b, then gcd 0 0 = 0, because 0 is indeed the greatest integer in this ordering. Mathematically this makes sense, but it's not necessarily what people expect. From Alan@LCS.MIT.EDU Tue Dec 11 18:07:51 2001 From: Alan@LCS.MIT.EDU (Alan Bawden) Date: Tue, 11 Dec 2001 13:07:51 -0500 (EST) Subject: gcd 0 0 In-Reply-To: <3C163FE7.15D7F3F3@tzi.de> (message from George Russell on Tue, 11 Dec 2001 18:18:31 +0100) References: <3C163FE7.15D7F3F3@tzi.de> Message-ID: <11Dec2001.125247.Alan@LCS.MIT.EDU> From: George Russell Date: Tue, 11 Dec 2001 18:18:31 +0100 ... Yes. The Report definition says gcd :: (Integral a) => a -> a -> a gcd 0 0 = error "Prelude.gcd: gcd 0 0 is undefined" gcd x y = gcd' (abs x) (abs y) where gcd' x 0 = x gcd' x y = gcd' y (x `rem` y) On reflection, this is quite right. a divides b <=> there is an integer n with na = b. Thus any integer divides 0, and so the "greatest common divisor" would have to be the greatest integer, which is nonsense. Of course if you adopt Stephan Kahrs definition of "greatest", taken with respect to the partial order a<=b <=> a divides b, then gcd 0 0 = 0, because 0 is indeed the greatest integer in this ordering. Mathematically this makes sense, but it's not necessarily what people expect. If you take the point-of-view that gcd is actually an operation on ideals, then gcd(0, 0) is 0. I.e. define gcd(x, y) to be the smallest z >= 0 such that {m*x + n*y | m, n in Z} = {n*z | n in Z}. This is probably the most natural and general definition of gcd, and is, in fact, what many mathematicians would expect. Also, it is nice to be able to know that gcd(x, 0) = x for -all- x. From fstaylo@alpha.ncsc.mil Tue Dec 11 19:31:53 2001 From: fstaylo@alpha.ncsc.mil (Frank Seaton Taylor) Date: Tue, 11 Dec 2001 14:31:53 -0500 Subject: gcd 0 0 In-Reply-To: <11Dec2001.125247.Alan@LCS.MIT.EDU> Message-ID: <200112111935.OAA14617@orion.ncsc.mil> Folks, Let me chime in in favor of gcd(0,0) = 0 rather than undefined. On Tuesday, December 11, 2001, at 01:07 , Alan Bawden wrote: > Also, it is nice to be able to know that gcd(x, 0) = x for -all- x. Alan is in good company: 1. Steele in "Common Lisp: The Language" says the same thing. 2. Knuth in "The Art of Computer Programming" defines gcd(0,0)=0. ---Frank From igloo@earth.li Tue Dec 11 23:16:39 2001 From: igloo@earth.li (Ian Lynagh) Date: Tue, 11 Dec 2001 23:16:39 +0000 Subject: Layout rule (again) Message-ID: <20011211231639.A2444@stu163.keble.ox.ac.uk> I'm afraid it doesn't seem to be quite right yet :-( Consider instance Foo Maybe where foo = 5 => {4}instance Foo Maybe where {4}foo = 5 => {instance Foo Maybe where {}}foo = 5 The second {4} has meant there is no <4> to cause an implicit semicolon to be inserted. This can be fixed by changing L ({n}:ts) (m:ms) = { : (L ts (n:m:ms)) if n > m, (Note 1) = { : } : (L ts (m:ms)) otherwise to L ({n}:ts) (m:ms) = { : (L ts (n:m:ms)) if n > m, (Note 1) = { : } : (L (:ts) (m:ms)) otherwise Thanks Ian, having a bad day, predominantly due to the layout rule :-( From petersen@redhat.com Wed Dec 12 01:18:04 2001 From: petersen@redhat.com (Jens Petersen) Date: 12 Dec 2001 10:18:04 +0900 Subject: haxml In-Reply-To: <200112111016.fBBAGBG00226@crazy-horse.cs.cse.dmu.ac.uk> References: <200112111016.fBBAGBG00226@crazy-horse.cs.cse.dmu.ac.uk> Message-ID: David Smallwood writes: > Does anyone know of a mirror site where I can download the latest > version of HaXml. (Connection to York is - and has been for a > while - apparently down: ftp://ftp.cs.york.ac.uk/pub/haskell/HaXml/HaXml-1.02.tar.gz, that is) The above url seemed to work for me just now. Jens From chak@cse.unsw.edu.au Wed Dec 12 05:52:01 2001 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Wed, 12 Dec 2001 16:52:01 +1100 Subject: ANN: GHC 5.02.1 RPMs including xlib and HGL packages Message-ID: <20011212165201G.chak@cse.unsw.edu.au> The following might be of special interest to people who are using Paul Hudak's Haskell textbook for teaching and or study and would like to run the SOE graphics examples with GHC - or if you simply want to have an X-based graphics library for an application. GHC's source distribution contains the two library packages `xlib' and `HGL' (Alastair Reid's Haskell Graphics Library) as part of hslibs, which are not by default built and installed. For our local teaching needs at the University of New South Wales, we have produced a patched version of GHC 5.02.1 that includes the aforementioned libraries in a working form. Haskell modules can be compiled or linked against these libraries, by providing the command line options `-package xlib' and `-package HGL', respectively (or you can specify them using the :s command in the interpreter). RPM packages for x86 GNU/Linux based on glibc 2.2 (eg, RedHat 7.x) containing GHC 5.02.1 including the xlib and HGL packages are available as ftp://ftp.cse.unsw.edu.au/pub/users/chak/jibunmaki/i386/ghc-5.02.1-graphics.1.i386.rpm ftp://ftp.cse.unsw.edu.au/pub/users/chak/jibunmaki/i386/ghc-prof-5.02.1-graphics.1.i386.rpm ftp://ftp.cse.unsw.edu.au/pub/users/chak/jibunmaki/i386/ghc-doc-5.02.1-graphics.1.i386.rpm with the source RPM at ftp://ftp.cse.unsw.edu.au/pub/users/chak/jibunmaki/src/ghc-5.02.1-graphics.1.src.rpm The source RPM contains a patched source tar ball and build instructions in the form of an RPM .spec that may be used to build the packages for other Linux distributions and on other Unix systems. (NB: GreenCard need not be installed to build this package, as a throw-away version of GreenCard is included in the tar ball - ie, it is used in the build process, but not installed.) Cheers, Manuel From ahey@iee.org Wed Dec 12 07:47:44 2001 From: ahey@iee.org (Adrian Hey) Date: Wed, 12 Dec 2001 07:47:44 +0000 Subject: Another question about sharing In-Reply-To: <9584A4A864BD8548932F2F88EB30D1C607AADC8B@TVP-MSG-01.europe.corp.microsoft.com> References: <9584A4A864BD8548932F2F88EB30D1C607AADC8B@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: <01121207463700.03104@localhost.localdomain> On Monday 10 December 2001 3:32 pm, Simon Marlow wrote: > The problem isn't restricted to CAFs - full laziness always trades space > for time. We found that it can be a large win in some cases: if > repeated computation is replaced by sharing in an inner loop, then the > gains can be dramatic. We didn't meet any cases where it caused space > problems, so you get it by default[1] when optimisation is turned on in > GHC. You can always disable it with -fno-full-laziness. and Malcolm Wallace wrote: > Well, how about the following little circular program? >       paths :: () -> [Path] >       paths () = let r = T : branch r in r Just to be clear, (with GHC) if I compile a module with this flag, with a local definition of paths.. mkLUT def = where paths = T : branch paths then I'll get a new paths graph every time mkLUT is called? But the effect of this is local to the module, so if mkLUT is exported, any local use of (mkLUT def) where def is a constant will still give a CAF (containing paths) unless that module has also been compiled with -fno-full-laziness? If I'm not mistaken, I have essentially the same problem with Malcolms solution. (() is a constant.) I don't want to make too big an issue over this because it really isn't a show stopper for my purposes, but it would be nice if I could make (what I consider to be) a reasonably safe self contained library module. I.E. Doesn't contain or cause space leaks Is not GHC specific Doesn't require other modules which make use of it to be compiled with particular options. I wonder if those people who know more about formal semantics than I do might consider making the definition of the language less ambiguous wrt sharing and also (maybe) giving programmers more explicit control if they need it, as in Clean. BTW, I can't find any information re. -fno-full-laziness in the current GHC users guide. Is it a deprecated feature? If I try it in an OPTIONS pragma I discover that it's static. Does that mean it has to be applied to a whole program in any case? (I can't think of any other reason it can't be included in a source file). Regards -- Adrian Hey From mailinglist@fmeurope.org Mon Dec 10 12:18:22 2001 From: mailinglist@fmeurope.org (mailinglist@fmeurope.org) Date: Mon, 10 Dec 2001 13:18:22 +0100 Subject: FME 2002: 2nd call for papers Message-ID: <001401c18174$c56cb5f0$dcd22bc0@west.nl> apologies if you receive multiple copies... FORMAL METHODS EUROPE FME 2002 "Formal Methods: Getting IT Right" International Symposium and Tutorials http://floc02.diku.dk/FME/ 20-24 July 2002 Second Call for Papers ********************** FME 2002 is the eleventh in a series of symposia organised by Formal Methods Europe, an independent association whose aim is to stimulate the use of, and research on, formal methods for software development. These symposia have been notably successful in bringing together a community of users, researchers, and developers of precise mathematical methods for software development. In 2002 the symposium will be held in conjunction with the third Federated Logic Conference (FLoC'02) in Copenhagen, Denmark. The theme of FME 2002 is Formal Methods: Getting IT Right. The double meaning is intentional. On the one hand, the theme acknowledges the significant contribution formal methods can make to Information Technology, by enabling computer systems to be described precisely and reasoned about with rigour. On the other hand, it recognises that current formal methods are not perfect, and further research and practice are required to improve their foundations, applicability and effectiveness. FME seeks papers in all aspects of formal methods for computer systems, including the following: * theoretical foundations * practical use and case studies * specification and modelling techniques * software development and refinement * tool support and software engineering environments for formal methods * verification and validation * hidden formal methods, and making benefits available to non-experts * reusable domain theories * method integration * hardware verification In addition to presentations of submitted papers, the symposium will offer tutorials, workshops, invited speakers, and tool demonstrations. PAPERS Full papers should be submitted in Postscript or PDF format by e-mail to reach the Program Co-chairs by 15 January 2002. Papers will be refereed by the Program Committee and must be original research papers that have not been submitted elsewhere for publication. Accepted papers will be published in the symposium proceedings. Papers should not exceed twenty pages, although longer papers will be considered if their content justifies it. LNCS format should be used: see http://www.springer.de/comp/lncs/authors.html for details. Please include a short list of keywords on a separate line at the end of the abstract, beginning with the word "Keyword:" in boldface. OTHER SYMPOSIUM ACTIVITIES Tutorials and workshops will be held on 20-21 July 2002. Each tutorial will last one-half or one day. Proposals are welcome, and should be directed to the Program Co-chairs by 15 January 2002; more details will appear on the web-site above. Tool demonstrations will also take place during the symposium, with the opportunity for presentations to be made about each tool. Proposals for tool demonstrations should be made to the Tool Demonstration Coordinator, with whom provison of necessary computing facilities should be discussed. PEOPLE Organising Chair Dines Bjørner Informatics and Mathematical Modelling Building 322, Richard Petersens Plads Technical University of Denmark DK-2800 Lyngby, Denmark Tel: +45 4525 3720 Email: db@imm.dtu.dk Programme Co-chairs Lars-Henrik Eriksson, Industrilogik L4i AB Box 6205, SE-102 34 Stockholm, Sweden Tel: +46 8 670 37 10 Fax: +46 8 32 12 82 Email: lhe@L4i.se Peter Lindsay, Software Verification Research Centre The University of Queensland, Queensland 4072, Australia Tel: +61 7 3365 2005 Fax: +61 7 3365 1533 Email: Peter.Lindsay@svrc.uq.edu.au Programme Committee Bernhard Aichernig Graz University of Technology, Austria Juan Bicarregui Rutherford Appleton Laboratory, UK Ernie Cohen Telcordia Technologies, USA Ben Di Vito NASA Langley Research Center, USA Cindy Eisner IBM Haifa Research Laboratory, Israel Lars-Henrik Eriksson (co-chair) Industrilogik, Sweden John Fitzgerald Transitive Technologies Ltd, UK Jim Grundy Intel Corporation, USA Yves Ledru LSR/IMAG, France Peter Lindsay (co-chair) University of Queensland, Australia Markus Montigel University of New Orleans, USA Richard Moore IFAD, Denmark Tobias Nipkow Technische Universität München, Germany Colin O'Halloran Qinetiq (ex-DERA), UK Jose Oliveira Universidade do Minho, Portugal Nico Plat West Consulting, The Netherlands Jeannette Wing Carnegie Mellon University, USA Jim Woodcock Oxford University, UK Joakim von Wright Åbo Akademi University, Finland Pamela Zave AT&T Laboratories, USA Tool Demonstration Coordinator Paul Mukherjee The Institute of Applied Computer Sciense (IFAD) Forskerparken 10, DK-5230 Odense M, Denmark Tel: +45 6315 7131 Fax: +45 6593 2999 Email: paul.mukherjee@ifad.dk IMPORTANT DATES Submission of papers, tutorial proposals and workshop proposals: 15 January 2002 Notification of acceptance/rejection: 27 March 2002 Camera ready final version of papers due: 10 May 2002 l _______________________________________________ Mailinglist mailing list Mailinglist@fmeurope.org http://www.fmeurope.org/mailman/listinfo/mailinglist From chinwn@comp.nus.edu.sg Wed Dec 12 11:38:53 2001 From: chinwn@comp.nus.edu.sg (Chin Wei Ngan) Date: Wed, 12 Dec 2001 19:38:53 +0800 (GMT-8) Subject: CFP : ASIA-PEPM 2002 Message-ID: <200112121138.TAA20037@sunA.comp.nus.edu.sg> CALL FOR PAPERS ACM SIGPLAN ASIAN Symposium on Partial Evaluation and Semantics-Based Program Manipulation (ASIA-PEPM'02) Aizu, JAPAN, September 12-14 2002 (co-located with FLOPS2002) http://www.comp.nus.edu.sg/asia-pepm02 Submission deadline: 1st March 2002 The ASIA-PEPM'02 symposium will bring together researchers working in the areas of semantics-based program manipulation, partial evaluation, and program analysis. The symposium focuses on techniques, supporting theory, and applications for the analysis and manipulation of programs. Technical topics include, but are not limited to: * Program manipulation techniques: transformation, specialization, normalization, reflection, rewriting, run-time code generation, multi-level programming. * Program analysis techniques: abstract interpretation, static analysis, binding-time analysis, type-based analysis. * Related issues in language design and models of computation: imperative, functional, logical, constraint-based, object-oriented, parallel, concurrent, secure, domain-specific. * Programs as data objects: staging, meta-programming, incremental computation, mobility, tools and techniques, prototyping and debugging. * Applications: systems programming, scientific computing, embedded systems, graphics, security, model checking, compiler generation, compiler optimization, decompilation. Original results that bear on these and related topics are solicited. Papers investigating novel uses and applications of program manipulation are especially encouraged. Authors concerned about the appropriateness of a topic are welcome to consult with the program chair prior to submission. SUBMISSION INFORMATION Papers should be submitted electronically via the workshop's Web page. Exceptionally, submissions may be emailed to the program chair: asiapepm@comp.nus.edu.sg. Acceptable formats are PostScript or PDF, viewable by gv. Submissions should not exceed 5000 words, excluding bibliography and figures. Submitted papers will be judged on the basis of significance, relevance, correctness, originality, and clarity. They should clearly identify what has been accomplished and why it is significant. The work described should not have been previously published in a major forum. Authors must indicate if a closely related paper is also being considered for another conference or journal. The proceeding of the symposium will be published by ACM Press. A special issue of Higher-Order Symbolic Computation is also planned. LOCAL ARRANGEMENT Mizuhito Ogawa (NTT, Japan) GENERAL CHAIR Kenichi Asai (Ochanomizu University, Japan) PROGRAM CHAIR Wei-Ngan Chin (National University of Singapore, Singapore) PROGRAM COMMITTEE Manuel Chakravarty (University of New South Wales, Australia) Tyng-Ruey Chuang (Academia Sinica, Taiwan) Charles Consel (ENSEIRB, France) Oege de Moor (University of Oxford, UK) Masami Hagiya (University of Tokyo, Japan) Nevin Heintze (Agere Systems, USA) Neil Jones (Univ of Copenhagen, Denmark) Yanhong Annie Liu (SUNY at Stony Brook, USA) Atsushi Ohori (JAIST, Japan) Alberto Pettorossi (University of Roma, Italy) Simon Peyton Jones (Microsoft, UK) Carolyn Talcott (Stanford University, USA) Zhe Yang (University of Pennsylvania, USA) From olaf@cs.york.ac.uk Wed Dec 12 17:43:53 2001 From: olaf@cs.york.ac.uk (Olaf Chitil) Date: Wed, 12 Dec 2001 17:43:53 +0000 Subject: Functional Programming Languages in Education disappeared Message-ID: <3C179759.F9DC779E@cs.york.ac.uk> Christopher Milton informed me that the link from haskell.org to http://www.cs.kun.nl/fple/, the pages on Functional Programming Languages in Education is broken. In fact, the pages seem to have disappeared completely. I think that this is a pity. I believe the pages have not been updated already for a few years. I suppose the maintainers didn't get much feedback from users and hence finally gave up. I wonder if the maintainers would like to comment on this. Didn't the pages have quite a collection of teaching materials? Maybe there are volunteers who would keep this site going? 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 mechvel@math.botik.ru Thu Dec 13 09:53:32 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Thu, 13 Dec 2001 12:53:32 +0300 Subject: gcd 0 0 = 0 Message-ID: People write on gcd 0 0 : Alan Bawden > If you take the point-of-view that gcd is actually an operation on > ideals, then gcd(0, 0) is 0. I.e. define gcd(x, y) to be the smallest > z >= 0 such that {m*x + n*y | m, n in Z} = {n*z | n in Z}. This is > probably the most natural and general definition of gcd, and is, in fact, > what many mathematicians would expect. > > Also, it is nice to be able to know that gcd(x, 0) = x for -all- x. Frank Seaton Taylor writes T> Let me chime in in favor of gcd(0,0) = 0 rather than undefined. T> T> On Tuesday, December 11, 2001, at 01:07 , Alan Bawden wrote: T> T> > Also, it is nice to be able to know that gcd(x, 0) = x for -all- x. T> T> Alan is in good company: T> T> 1. Steele in "Common Lisp: The Language" says the same thing. T> T> 2. Knuth in "The Art of Computer Programming" defines gcd(0,0)=0. T> classic algebra All right. Let us try to investigate this. In such cases one should consult mathematics, not programming. So, let us ignore "Common Lisp ...". And Knuth is all right, I think. Further, the definintion > gcd(x, y) to be the smallest > z >= 0 such that {m*x + n*y | m, n in Z} = {n*z | n in Z} is not natural. In particular, how does it generalize to gcd X Y for polynomials in X, Y with rational coefficients? It is 1. And how would one obtain 1 = f*X + g*Y ? According to classic algebra (Kummer, I guess), gcd x y in (such and such) domain R is the least by inclusion principal ideal (g) that includes the ideal (x, y). Here (a1..an) = set of all combinations y1*a1 + .. + yn*an, yi from R. According to this definition, gcd (X) (Y) = (1) in polynomials, all right, and gcd n m :: Integer is (0) Because (0) is the least by inclusion principal ideal containing (0). And this also contradicts the part "greatest integer that divides ..." in recent Haskell specification. Probably, the best specification would be gcd n m :: Integer = if n == 0 && m == 0 then 0 else greatest integer that divides both n and m ----------------- Serge Mechveliani mechvel@botik.ru From frank@cc.gatech.edu Thu Dec 13 14:04:42 2001 From: frank@cc.gatech.edu (Frank Dellaert) Date: Thu, 13 Dec 2001 09:04:42 -0500 Subject: Integer Enum ? Message-ID: <005301c183df$1f34bc60$a21ccf82@cc.gatech.edu> This is a multi-part message in MIME format. ------=_NextPart_000_0050_01C183B5.340C38E0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi I'm not entirely clear how Integer can be an Enum instance. I thought = Integer was arbitrary size, while for the Enum class you need to define = a mapping from and to Int, which is bounded (in a machine dependent way, = even ?). I'm probably missing something obvious... Cheers Frank Dellaert ------=_NextPart_000_0050_01C183B5.340C38E0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi
I'm not entirely clear how Integer can = be an Enum=20 instance. I thought Integer was arbitrary size, while for the Enum class = you=20 need to define a mapping from and to Int, which is bounded (in a machine = dependent way, even ?). I'm probably missing something = obvious...
Cheers
Frank = Dellaert
------=_NextPart_000_0050_01C183B5.340C38E0-- From shae@www.webwitches.com Thu Dec 13 15:42:45 2001 From: shae@www.webwitches.com (Shae Erisson) Date: Thu, 13 Dec 2001 17:42:45 +0200 (EET) Subject: We need "Documentation" In-Reply-To: References: Message-ID: <20011213.174245.884009776.shae@www.webwitches.com> From: Tony Davie Subject: Re: We need "Documentation" (Was: Re: Integer to String Conversion?) Date: Tue, 4 Dec 2001 09:38:49 +0000 > >The material we have is simply lacking. What we need is a good tutorial and a > >comprehensive reference book. > > ... > > I suggest you look at http://www.haskell.org/bookshelf/, specifically > the section on > Papers available on the Web. This gives numerous tutorials and introductions. I agree with Eray, I tried to learn Haskell without any printed material, and failed. Once I had the Simon Thompson's "Craft of.." I was doing fine. I have an irc friend who would also like to learn Haskell, and who is blind. He uses a braille reader in the Linux console, but the electronically available Haskell documentation just isn't sufficient. I taught myself Python in about two weeks with the online Python tutorial, I think something similar for Haskell would greatly increase the number of Haskell users. ---- Shae Matijs Erisson - http://www.webwitches.com/~shae/ Rabid Linux/XEmacs User - MSOffice documents will be returned as LaTeX From hdaume@ISI.EDU Thu Dec 13 17:07:12 2001 From: hdaume@ISI.EDU (Hal Daume III) Date: Thu, 13 Dec 2001 09:07:12 -0800 (PST) Subject: We need "Documentation" In-Reply-To: <20011213.174245.884009776.shae@www.webwitches.com> Message-ID: > I taught myself Python in about two weeks with the online Python tutorial, I think something similar for Haskell would greatly increase the number of Haskell users. I'm not familiar with the Python tutorial, but the Java tutorial which resides at java.sun.com is pretty much the most highly praised thing I know about. If ever anyone has a Java question or is trying to learn Java, everyone I know simply tells them to read that. It takes about 10 minutes to get up and running (assuming some programming background). Where is the Python tutorial located and is it more-or-less the same as the Java one? Would anyone be interested in working on a similar thing for Haskell? - Hal From shae@www.webwitches.com Thu Dec 13 18:31:50 2001 From: shae@www.webwitches.com (Shae Erisson) Date: Thu, 13 Dec 2001 20:31:50 +0200 (EET) Subject: We need "Documentation" In-Reply-To: References: <20011213.174245.884009776.shae@www.webwitches.com> Message-ID: <20011213.203150.276755180.shae@www.webwitches.com> From: Hal Daume III Subject: Re: We need "Documentation" Date: Thu, 13 Dec 2001 09:07:12 -0800 (PST) > Where is the Python tutorial located and is it more-or-less the same as > the Java one? http://www.python.org/doc/current/tut/tut.html > Would anyone be interested in working on a similar thing for Haskell? me! I'd suggest a HaskellWiki page, since multiuser edits are low overhead there. ---- Shae Matijs Erisson - http://www.webwitches.com/~shae/ Rabid Linux/XEmacs User - MSOffice documents will be returned as LaTeX From hdaume@ISI.EDU Thu Dec 13 18:47:53 2001 From: hdaume@ISI.EDU (Hal Daume III) Date: Thu, 13 Dec 2001 10:47:53 -0800 (PST) Subject: We need "Documentation" In-Reply-To: <20011213.203150.276755180.shae@www.webwitches.com> Message-ID: I think we should move this off the mailing list. I'm willing to spear-head such an effort. Anyone who is interested in contributing, please email me. I'll compile a list of people and we can figure out what we want to do. - 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 Thu, 13 Dec 2001, Shae Erisson wrote: > From: Hal Daume III > Subject: Re: We need "Documentation" > Date: Thu, 13 Dec 2001 09:07:12 -0800 (PST) > > > Where is the Python tutorial located and is it more-or-less the same as > > the Java one? > > http://www.python.org/doc/current/tut/tut.html > > > Would anyone be interested in working on a similar thing for Haskell? > > me! > I'd suggest a HaskellWiki page, since multiuser edits are low overhead there. > ---- > Shae Matijs Erisson - http://www.webwitches.com/~shae/ > Rabid Linux/XEmacs User - MSOffice documents will be returned as LaTeX > From pat@jantar.org Fri Dec 14 00:39:56 2001 From: pat@jantar.org (Patryk Zadarnowski) Date: Fri, 14 Dec 2001 11:39:56 +1100 (EST) Subject: Typesetting literate scripts in TeX Message-ID: <20011214.113956.74747160.pat@jantar.org> Recently I've hacked up a (yet another) TeX package for typesetting literate scripts in TeX, which, I think belongs in http://haskell.org/libraries/#tex". What's different about lambdaTeX is that it is not a cumbersome preprocessor, but a full TeX program (an almost-complete Haskell lexical analyzer written entirely in plain TeX ;-) which typesets Bird-style literate scripts _directly_. The output looks much like the code from Chris Okasaki's book "Purely Functional Data Structures", doing syntax highlighting and converting ASCII art such as "->" or "alpha" to proper mathematical symbols. It should work with both LaTeX and plain TeX, and it does its magic without any annotations, directly on the source code (the only thing that you will probably want to do is add \input lambdaTeX at the top of your source file, and manually typeset your literate comments so they look as good as the source code ;-) I've got a rudimentary web page for it at http://www.jantar.org/lambdaTeX/ with examples and a summary of features. If you have any comments or suggestions, I wouldn't mind hearing them. Enjoy. Pat. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Patryk Zadarnowski University of New South Wales School of Computer Science and Engineering -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- From Alan@LCS.MIT.EDU Fri Dec 14 03:55:31 2001 From: Alan@LCS.MIT.EDU (Alan Bawden) Date: Thu, 13 Dec 2001 22:55:31 -0500 (EST) Subject: gcd 0 0 = 0 In-Reply-To: (mechvel@math.botik.ru) References: Message-ID: <13Dec2001.210227.Alan@LCS.MIT.EDU> From: "S.D.Mechveliani" Date: Thu, 13 Dec 2001 12:53:32 +0300 Further, the definintion > gcd(x, y) to be the smallest > z >= 0 such that {m*x + n*y | m, n in Z} = {n*z | n in Z} is not natural. In particular, how does it generalize to gcd X Y for polynomials in X, Y with rational coefficients? Well, that -is- the way gcd is defined in the commutative algebra textbook I used in graduate school -- I just specialized the definition for the case of the ring of integers, and so I didn't mention that Z was a principle ideal domain. Polynomials in two variables aren't a PID, so yes, you'd have to restore some things I left out. When I said my definition was "general" I suppose I should have anticipated someone would generalize in a way I hadn't intended... (Actually, that definition doesn't even generalize exactly to the Gaussian Integers, where "z >= 0" would have to be replaced by some specification of a region of the complex plane.) ... Probably, the best specification would be gcd n m :: Integer = if n == 0 && m == 0 then 0 else greatest integer that divides both n and m Fortunately, we all seem to agree on what the actual definition should be. I did make a mistake in my previous message. I said that it was nice that gcd(0, x) = x for all x. I should have said: gcd(0, x) = abs(x). From simonpj@microsoft.com Fri Dec 14 09:18:56 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 14 Dec 2001 01:18:56 -0800 Subject: gcd 0 0 = 0 Message-ID: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com> | Probably, the best specification would be |=20 | gcd n m :: Integer =3D if n =3D=3D 0 && m =3D=3D 0 then 0 | else | greatest integer that divides both n and m Well, thank you all those that have contributed. My original point was simply to say greatest (positive) integer that divides both n and m but debate seems to have swirled round whether (gcd 0 0) should be 0 or an error. Currently in H98 it's an error; but it is the kind=20 of thing I'm willing to change IF there is a consensus, because it will only make more programs work. Is there a consensus that such a change would be desirable? If someone could write a sentence or two to explain why gcd 0 0 =3D 0, (ideally, brief ones I can put in the report by way of explanation), I think that might help those of us who have not followed the details of the discussion. =20 Simon From dongen@cs.ucc.ie Fri Dec 14 12:38:58 2001 From: dongen@cs.ucc.ie (Marc van Dongen) Date: Fri, 14 Dec 2001 12:38:58 +0000 Subject: gcd 0 0 = 0 In-Reply-To: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com>; from simonpj@microsoft.com on Fri, Dec 14, 2001 at 01:18:56AM -0800 References: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <20011214123858.J21918@cs.ucc.ie> Simon Peyton Jones (simonpj@microsoft.com) wrote: : If someone could write a sentence or two to explain why gcd 0 0 = 0, : (ideally, brief ones I can put in the report by way of explanation), : I think that might help those of us who have not followed the details : of the discussion. Division in the context of gcds (of integers) is usually defined along the lines of: An integer $a$ divides integer $b$ if there exists an integer $c$ such that $a c= b$. Note that here division is a *relation* an not a *function*/*operator*. Given the definition of division being a relation it makes perfect sense to say that $0$ divides $0$ which is why gcd 0 0 = 0; and gcd 0 0 /= error "Blah" The gcd of two integers is usually defined as a non-negative number to make it unique. HTH. PS: I am strongly in favour of gcd 0 0 = 0. Regards, Marc van Dongen From qrczak@knm.org.pl Fri Dec 14 21:00:13 2001 From: qrczak@knm.org.pl (Marcin 'Qrczak' Kowalczyk) Date: Fri, 14 Dec 2001 22:00:13 +0100 Subject: Typesetting literate scripts in TeX Message-ID: <20011214210013.GA19310@qrnik.zagroda> > Recently I've hacked up a (yet another) TeX package for typesetting > literate scripts in TeX Cool! I will use it in my thesis. One bug: a line can be broken between an inline code and a comma which immediately follows it. -- __("< Marcin Kowalczyk * qrczak@knm.org.pl http://qrczak.ids.net.pl/ \__/ ^^ QRCZAK From igloo@earth.li Fri Dec 14 21:28:30 2001 From: igloo@earth.li (Ian Lynagh) Date: Fri, 14 Dec 2001 21:28:30 +0000 Subject: Confused about default Message-ID: <20011214212830.A25845@stu163.keble.ox.ac.uk> Hi all I am rather confused about default. In section 4.3.4 the report says "each ti must be a monotype for which Num ti holds" but according to grep this is the only place "monotype" appears in the report. If I have the module module TT (Foo(..)) where default (Foo, [Foo], Foo -> Int) data Foo = Foo deriving (Eq, Show) instance Num Foo where {} instance (Eq a, Show a) => Num [a] where {} instance Eq (a -> b) where {} instance Show (a -> b) where {} instance Num (a -> b) where {} then hugs accepts it and TT> 5 Program error: Undefined member: fromInteger ghc accepts it and TT> 5 5 nhc tells me Error when renaming:: Illegal type in default at 4:17 If I remove all the list and function stuff then hi says TT> 5 5 If I have a main = putStrLn $ show 5 then nhc gives me TT> main No default definition for class method fromInteger and ghci gives me Main> main *** Exception: TT.lhs:8: No instance nor default method for class operation PrelNum.fromInteger It seems to me that hugs is in the right with it's handling of 5, but I am not sure who is wrong with default ([Foo]) or (Foo -> Int). Finally, the context free grammar doesn't currently enforce the restriction that only one default declaration be given. Fixing it would make rather a mess, though. Ian From nordland@cse.ogi.edu Sat Dec 15 19:11:15 2001 From: nordland@cse.ogi.edu (Johan Nordlander) Date: Sat, 15 Dec 2001 11:11:15 -0800 Subject: ANNOUNCE: Hugs98 Christmas release Message-ID: <82E00FDE-F18F-11D5-ABD3-003065BDF7A4@cse.ogi.edu> ------------------------------------------------------------------------------ __ __ __ __ ____ ___ _________________________________________ || || || || || || ||__ Hugs 98: Based on the Haskell 98 standard ||___|| ||__|| ||__|| __|| Copyright (c) 1994-2001 ||---|| ___|| World Wide Web: http://haskell.org/hugs || || Report bugs to: hugs-bugs@haskell.org || || Version: Dec 2001 _________________________________________ ------------------------------------------------------------------------------ We are pleased to announce a new release of Hugs98, a Haskell interpreter and programming environment for developing cool Haskell programs. Sources and binaries are freely available on the World-Wide Web. The most important features of this new release are: - The incompatibilities between Hugs and the Haskell Graphics Library have been fixed, and binaries for the HGL are now available on the Hugs download page. - The missing standard libraries Directory, CPUTime, Time and Locale have been added along with a complete implementation of Haskell98 IO. - Hugs is now delivered with most of the hslibs libraries installed in the lib/exts/ directory. The added modules cover the Edison, Parsec, HaXml, QuickCheck, concurrent, monad, and html subdirectories of hslibs. - The :set option now refuses the user to set a module search path that doesn't contain the Prelude. This is to protect users from accidentally rendering their Hugs setups unusable, esp. so on Windows machines where the options are persisted to the Registry. - MacOS X is now one of the supported unix ports, with pre-built binaries available on the download page. - Experimental support is provided for hierarchical module names, where a module name A.B.C is mapped onto the file path A/B/C{.hs,.lhs} and appended to each of the path prefixes in HUGSPATH until the name of a readable file is found. Most reported bugs have also been fixed; however, some issues still remain. See the heading "Hugs Bugs & Features" on the Hugs web site for further information. Send email to hugs-users-request@haskell.org to join the hugs-users mailing list. Bug reports should be sent to hugs-bugs@haskell.org. Send email to hugs-bugs-request@haskell.org to subscribe to the hugs-bugs list. The home page for Hugs is at http://www.haskell.org/hugs. ------------------------------------------------------------------------------ The Hugs 98 system is Copyright (c) Mark P Jones, Alastair Reid, the Yale Haskell Group, and the Oregon Graduate Institute of Science and Technology, 1994-2001, All rights reserved. It is distributed as free software under the license in the file "License", which is included in the distribution. ------------------------------------------------------------------------------ From sof@galois.com Sat Dec 15 19:14:42 2001 From: sof@galois.com (Sigbjorn Finne) Date: Sat, 15 Dec 2001 11:14:42 -0800 Subject: Announce: Hugs Graphics Library Message-ID: <0a6501c1859c$c02fe040$4576fea9@sofbox> We are pleased to announce a new release of the Hugs Graphics Library, version 2.0.4. The Hugs Graphics Library gives the programmer access to the most interesting and portable parts of the Win32 and X11 library. The library is distributed as open source and is suitable for use in teaching and applications. This version is compatible with the December 2001 release of Hugs, but won't work with the February 2001 release. This version supports: * filled and unfilled 2-dimensional objects (text, lines, polygons, ellipses). * Bitmaps (Win32 version only, for now). * Control over text alignment, fonts, color. * Simple input events (keyboard, mouse, window resize) to support reactivity. * Timers and double-buffering to support simple animation. * Use of concurrency to avoid the usual inversion of the code associated with event-loop programming. * Multiple windows may be handled at one time. To keep the library simple and portable, the library makes no attempt to support: * User interface widgets (menus, toolbars, dialog boxes, etc.) * Palette manipulation and other advanced features. * Many kinds of input event. The library can be downloaded from: http://www.haskell.org/graphics/. Installation instructions are in graphics-2.0.4/Install. Bug reports should be sent to reid@cs.utah.edu Enjoy! From matth@mindspring.com Sat Dec 15 23:04:19 2001 From: matth@mindspring.com (Matt Harden) Date: Sat, 15 Dec 2001 17:04:19 -0600 Subject: Integer Enum ? References: <005301c183df$1f34bc60$a21ccf82@cc.gatech.edu> Message-ID: <3C1BD6F3.DF4E1FD3@mindspring.com> > Frank Dellaert wrote: > > Hi > I'm not entirely clear how Integer can be an Enum instance. I thought > Integer was arbitrary size, while for the Enum class you need to > define a mapping from and to Int, which is bounded (in a machine > dependent way, even ?). I'm probably missing something obvious... You're right to wonder about that. It's even worse than you thought. Float and Double are also Enum instances! IMHO, this is a wart in the Haskell definition. Enum is used for two purposes: to support the [x,y..z] syntactic sugar, and to define conversion to/from Int. I think everybody agrees that the [x,y..z] syntax should support Integers, so it has to be an instance of Enum. I suspect that for convenience, the fromEnum and toEnum functions were put in the class to allow easier definitions of new Enum instances for small bounded enumerations. It has the undesireable effect of forcing the implementer of an Enum instance to produce a mapping to/from Int even when it doesn't make any sense. My preference would be to define them as errors in that case; the Haskell Report does not. The Report defines fromEnum for Float and Double; it is silent on Integer, and the Ratio module in the Library Report defines fromEnum for Ratio. In all cases, the reports specify truncation to integer, and there is a comment that the conversion may overflow. Complex does not define an Enum instance, even though it would make sense to me to be able to write [0, 1:+2 .. 5:+10] or the like. I guess fromEnum for Complex, if it existed, would have to just "truncate" the imaginary part! Regarding the Integer instance, Hugs only issues errors on fromEnum x where x is out of range. GHC just returns the value modulo 2^32, or something like that. My advice is to just ignore fromEnum and toEnum for Integer, Float, Double, and Ratio, and, if you need to define your own Enum instance, just define some reasonable mapping to Int, and don't worry much about truncation and overflow... the Haskell designers didn't! :) Matt Harden P.S. I hope the Haskell designers don't take offense; in reality, they have nothing but my deepest respect! From Alan@LCS.MIT.EDU Sun Dec 16 07:34:05 2001 From: Alan@LCS.MIT.EDU (Alan Bawden) Date: Sun, 16 Dec 2001 02:34:05 -0500 (EST) Subject: gcd 0 0 = 0 In-Reply-To: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com> (simonpj@microsoft.com) References: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <15Dec2001.202504.Alan@LCS.MIT.EDU> From: "Simon Peyton-Jones" Date: Fri, 14 Dec 2001 01:18:56 -0800 ... If someone could write a sentence or two to explain why gcd 0 0 = 0, (ideally, brief ones I can put in the report by way of explanation), I think that might help those of us who have not followed the details of the discussion. Well, Serge and I have both offered variations on the real reason why mathematicians agree that gcd 0 0 = 0. I prefer my simpler specialized-for-integers version, but I suspect even that is more mathematics than you want. At the other extreme, you could follow Knuth and simply state: "it is convenient to set gcd(0, 0) = 0", but that seems a bit unconvincing. If I were in your shoes, I'd simply pass the buck to the authorities by saying something like: "Mathematicians agree that gcd(0, 0) = 0". Incidentally, somebody wrote here that Common Lisp defines `(gcd 0 0)' to be 0, but it looks to me like all the language definition really does is state that `(gcd)' (no arguments) is 0 because 0 "is an identity for this operation" (which is technically false, but never mind), from which it is natural for the reader to conclude that `(gcd 0 0)' must be 0. From mechvel@math.botik.ru Sun Dec 16 12:35:57 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Sun, 16 Dec 2001 15:35:57 +0300 Subject: gcd definition Message-ID: Simon Peyton-Jones writes > [..] > If someone could write a sentence or two to explain why gcd 0 0 = 0, > (ideally, brief ones I can put in the report by way of explanation), > I think that might help those of us who have not followed the details > of the discussion. Here it is. gcd n m :: Integer = if n == 0 && m == 0 then 0 else greatest integer that divides both n and m It is set so according to classic definition (by Pythago, Euclid ...) GCD x y = such g that divides both x and y and is a multiple of any g' that divides both x and y. In particular, GCD 0 0 :: Integer = 0 and can be nothing else. Because 0 divides 0 and divides nothing else, everything divides 0 (z*0 = 0). Other comments ------------------------------------------------- * People say, D.Knuth writes gcd 0 0 = 0 in his book. And he is a known mathematically reliable person. * Example. gcd 12 18 :: Integer = 6 or -6, because 6 divides 12 and 18, and any other such number divides 6. * The Haskell report says "greatest integer" for domain = Integer, and thus, chooses the sign `+' for the result. This choice is not a mistake and helps to write shorter programs. * All the above agrees with the modern generic theory of ideals (started in |XX by Kummer, Gauss, Lagrange) for any commutative domain R having the properties of (a /= 0, b /= 0 ==> a*b /= 0), existence of unique factorization to primes. According to it gcd x y = least by inclusion ideal of kind (g) that includes the ideal (x, y), where Ideal (a,b..c) =def= {x*a + y*b +..+ z*c | x,y..z <- R} - a subset in R. `includes` (as set) is a partial order on ideals, and it is true that (1) a divides b <==> (a) includes (b), (2) (a) includes (a). Specializing this definition to Integer, we obtain the source formula. ----------------- Serge Mechveliani mechvel@botik.ru From dongen@cs.ucc.ie Sun Dec 16 13:35:59 2001 From: dongen@cs.ucc.ie (Marc van Dongen) Date: Sun, 16 Dec 2001 13:35:59 +0000 Subject: gcd 0 0 = 0 In-Reply-To: <20011214123858.J21918@cs.ucc.ie>; from dongen@cs.ucc.ie on Fri, Dec 14, 2001 at 12:38:58PM +0000 References: <1113DDB24D4A2841951BFDF86665EE1906660A@RED-MSG-10.redmond.corp.microsoft.com> <20011214123858.J21918@cs.ucc.ie> Message-ID: <20011216133559.C27182@cs.ucc.ie> Marc van Dongen (dongen@cs.ucc.ie) wrote: : An integer $a$ divides integer $b$ if there exists an integer : $c$ such that $a c= b$. [snip] : gcd 0 0 = 0; and : gcd 0 0 /= error "Blah" To make clear why $0$ (and not any other non-zero integer) is the gcd of $0$ and $0$ I should have added that for the integer case $g$ is called a greatest common divisor (gcd) of $a$ and $b$ if it satifies each of the following two properties: 1) $g$ divides both $a$ and $b$; 2) if $g'$ is a common divisor of $a$ and $b$ then $g'$ divides $g$. First notice that $0$ is a gcd of $0$ and $0$ because of the following: *) $0$ divides $0$ (and divides $0$); *) whenever $g'$ is an integer that divides $0$ and divides $0$ then $g'$ divides $0$. Next notice that if $g$ is any non-zero integer then $g$ cannot be a gcd of $0$ and $0$ because $0$ (a common divisor of $0$ and $0$) does not divide $g$. Finally, observe that this makes $0$ the unique gcd of $0$ and $0$. : The gcd of two integers is usually defined as a non-negative : number to make it unique. Regards, Marc van Dongen From antony@apocalypse.org Sun Dec 16 20:53:08 2001 From: antony@apocalypse.org (Antony Courtney) Date: Sun, 16 Dec 2001 15:53:08 -0500 Subject: ANNOUNCE: GCJNI - Java Native Interface for Haskell Message-ID: <3C1D09B4.2090103@apocalypse.org> I am pleased to announce an experimental release of GCJNI. GCJNI is a library that allows Haskell to invoke Java code via the Java Native Interface (JNI). The implementation uses GreenCard to make the JNI (a C language interface) available to Haskell. GCJNI includes a few convenient features, such as: - Integration of the Haskell and Java garbage collectors, so that Java objects are garbage collected when they are no longer accessible from Haskell. - Type class based overloading, which makes it easy to pass common types (like Int, Float and String) to or from Java code. - A tool (GenBindings) which uses Java reflection on a set of compiled Java classes to generate a Haskell module with a simple, high-level, type-safe interface to the underlying Java code. GCJNI has been succesfully tested using both hugs98 and ghc under both Linux and Windows. Binary distributions are provided for all for of these (compiler, platform) combinations. More information (including pointers to the relevant distributions) is available from the GCJNI web page at: http://www.haskell.org/gcjni Bug reports and feedback should be sent to antony@apocalypse.org Enjoy! -- Antony Courtney Grad. Student, Dept. of Computer Science, Yale University antony@apocalypse.org http://www.apocalypse.org/pub/u/antony From antony@apocalypse.org Sun Dec 16 20:54:41 2001 From: antony@apocalypse.org (Antony Courtney) Date: Sun, 16 Dec 2001 15:54:41 -0500 Subject: ANNOUNCE: Haven - Scalable Vector Graphics for Haskell Message-ID: <3C1D0A11.4070702@apocalypse.org> I am pleased to announce an experimental release of Haven, a library for scalable vector graphics in Haskell. Haven provides a wealth of features, including: - Data types for common geometric shapes such as rectangles, ellipses and Bezier curves. - Composition of arbitrary shapes from sequences of straight and curved segments. - Intersection tests and bounds calculations on shapes. - Cropping of any image by any shape. - Affine transformations on images and paths. - Calculation of precise rectangular bounds of shapes and images. - High quality, anti-aliased rendering. - Scalable outline fonts. - Smooth blending of colors (gradients) - Alpha blending (transparency). - Fine-grained control of stroke width, join rules and end caps. - Constructive Area Geometry (CAG) for composing shapes using simple set-theoretic operations. Haven presents a purely functional API, but is implemented using the Java2D renderer. For more information on Haven, including examples and download instructions, please visit the haven web page at: http://www.haskell.org/haven Please send suggestions and bug reports to: antony@apocalypse.org Enjoy! -- Antony Courtney Grad. Student, Dept. of Computer Science, Yale University antony@apocalypse.org http://www.apocalypse.org/pub/u/antony From ashley@semantic.org Sun Dec 16 23:57:53 2001 From: ashley@semantic.org (Ashley Yakeley) Date: Sun, 16 Dec 2001 15:57:53 -0800 Subject: ANNOUNCE: GCJNI - Java Native Interface for Haskell Message-ID: <200112162357.PAA26291@mail4.halcyon.com> At 2001-12-16 12:53, Antony Courtney wrote: >I am pleased to announce an experimental release of GCJNI. Eh, you beat me to a first release, which I was going to announce yesterday, but SourceForge's file release system is currently broken. I guess I'll have to put it on semantic.org I had no idea anyone else was working on this. Nevertheless, I suspect I'm further along. -- Ashley Yakeley, Seattle WA From ashley@semantic.org Mon Dec 17 00:34:13 2001 From: ashley@semantic.org (Ashley Yakeley) Date: Sun, 16 Dec 2001 16:34:13 -0800 Subject: ANN: Release 0.1 of Haskell/Java VM Bridge Message-ID: <200112170034.QAA27519@mail4.halcyon.com> The first release, 0.1, of Haskell/Java VM Bridge is now available. Haskell/Java VM Bridge allows Haskell programs access to the Java Virtual Machine. Features include: * On-the-fly creation of Java classes with Haskell functions for methods. * Lifted monads which do all the necessary JNI preloading and 'env'-pointer variable handling for you. These can be automatically generated via a tool (MakeJVMModule). * Integration of garbage collectors, type-class based overloading, and a tool (MakeClassModule) which uses Java reflection etc. to generate a Haskell module etc., etc. It is, however, only available for Unix and works only with GHC. This release should be 'beta' quality, but has undergone little testing. You will need: An x86 machine running some form of Unix; GHC 5.02 or later; The appropriate JVM, installed in the appropriate place: - IBM JDK/JRE 1.3 for x86, installed in /usr/lib/ibm-java/IBMJava2-13/ - Blackdown Port of Sun's JRE 1.3/Sun JDK 1.3 for x86, installed in /usr/lib/j2sdk1.3/ and /usr/lib/j2re1.3/ No documentation is currently available, sorry. Two examples have been included: a trivial "hello world" program, and a program that shows a Java Frame containing an instance of a Haskell-defined subclass of Canvas that has a Haskell 'paint' method that draws an oval. You should be able to figure out most of it from that... and of course the source is available from SourceForge CVS. Be sure to download the correct .tar.gz file for your Java VM. Simple installation instructions are included in the file. SourceForge's file release system is currently broken. When it's fixed, I'll put it there too. Haskell/JVM Bridge and source code is licensed under the GNU Lesser GPL. I hope to build an Darwin/OS X version just as soon as there's a port of GHC 5.02 with a working createAdjustor. -- Ashley Yakeley, Seattle WA From antony@apocalypse.org Mon Dec 17 02:44:30 2001 From: antony@apocalypse.org (Antony Courtney) Date: Sun, 16 Dec 2001 21:44:30 -0500 Subject: ANNOUNCE: GCJNI - Java Native Interface for Haskell References: <200112162357.PAA26291@mail4.halcyon.com> Message-ID: <3C1D5C0E.5090402@apocalypse.org> Hi Ashley, I'm not quite sure why you Cc'ed the whole Haskell list in replying to my release announcement, but just for clarification: Ashley Yakeley wrote: > > I had no idea anyone else was working on this. I find it odd you would say that. When you first mentioned your interest in the JNI on the Haskell list in early July, I replied to you (and the rest of the Haskell list) informing you I was working on such a project, and offering to give you a pre-release snapshot of my source code: http://www.haskell.org/pipermail/haskell/2001-July/001372.html When you didn't reply to that message, I emailed you again privately on August 1st, specifically suggesting that we combine forces to avoid duplication of effort. I never received a reply to that message either. > Nevertheless, I suspect I'm further along. Perhaps. Let's move this discussion to private email and try to find a way to work together. -antony -- Antony Courtney Grad. Student, Dept. of Computer Science, Yale University antony@apocalypse.org http://www.apocalypse.org/pub/u/antony From frank@cc.gatech.edu Mon Dec 17 05:40:21 2001 From: frank@cc.gatech.edu (Frank Dellaert) Date: Mon, 17 Dec 2001 00:40:21 -0500 Subject: space efficiency question Message-ID: <002201c186bd$51fcd6b0$a21ccf82@cc.gatech.edu> This is a multi-part message in MIME format. ------=_NextPart_000_001F_01C18693.68D2E250 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable I'm not a compiler/interpreter implementer, just a Haskell user :-) My question is: if I have two datatypes, say newtype Attributes =3D Att [String] data Instance =3D Instance Attributes [Int] where an Attributes value describes the discrete attributes that are = stored (as Int) in an Instance. Now: if I have a couple of thousand of these Instances, created with the = same Attributes value, as in: a =3D Attributes ["a","bc"] i0000 =3D Instance a [1,2] i0001 =3D Instance a [1,1] ... i7896 =3D Instance a [2,1] can I be assured that there are not thousands of actual copies of a but = that they simply have a pointer to a ? I'm interested in the answer for = both ghc (compiled/interpreted) as interpreted Hugs. I would hope, so, right ? Is there an actual guarantee or is that an = optimization that the implementation might or might not implement ? Cheers Frank Dellaert ------=_NextPart_000_001F_01C18693.68D2E250 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
I'm not a compiler/interpreter = implementer, just a=20 Haskell user :-)
My question is: if I have two = datatypes,=20 say
 
newtype Attributes =3D Att = [String]
data Instance =3D Instance Attributes=20 [Int]
 
where an Attributes value describes the = discrete=20 attributes that are stored (as Int) in an Instance.
 
Now: if I have a couple of thousand of = these=20 Instances, created with the same Attributes value, as in:
 
a =3D Attributes = ["a","bc"]
i0000 =3D Instance a [1,2]
i0001 =3D Instance a [1,1]
...
i7896 =3D Instance a [2,1]
 
can I be assured that there are not = thousands of=20 actual copies of a but that they simply have a pointer to a ? I'm = interested in=20 the answer for both ghc (compiled/interpreted) as interpreted = Hugs.
 
I would hope, so, right ? Is there an = actual=20 guarantee or is that an optimization that the implementation might or = might not=20 implement ?
 
Cheers
Frank = Dellaert
------=_NextPart_000_001F_01C18693.68D2E250-- From simonpj@microsoft.com Mon Dec 17 09:24:47 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Mon, 17 Dec 2001 01:24:47 -0800 Subject: space efficiency question Message-ID: <1113DDB24D4A2841951BFDF86665EE19066623@RED-MSG-10.redmond.corp.microsoft.com> This is a multi-part message in MIME format. --------------InterScan_NT_MIME_Boundary Content-Type: multipart/alternative; boundary="----_=_NextPart_001_01C186DC.ABC0BECE" ------_=_NextPart_001_01C186DC.ABC0BECE Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Now: if I have a couple of thousand of these Instances, created with the same Attributes value, as in: =20 a =3D Attributes ["a","bc"] i0000 =3D Instance a [1,2] i0001 =3D Instance a [1,1] ... i7896 =3D Instance a [2,1] =20 can I be assured that there are not thousands of actual copies of a but that they simply have a pointer to a ? I'm interested in the answer for both ghc (compiled/interpreted) as interpreted Hugs.=20 Yes for GHC: you'll only get one copy of 'a'. =20 Simon =20 ------_=_NextPart_001_01C186DC.ABC0BECE Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Message
Now: if I have a couple of thousand of = these=20 Instances, created with the same Attributes value, as in:
 
a =3D Attributes = ["a","bc"]
i0000 =3D Instance a = [1,2]
i0001 =3D Instance a = [1,1]
...
i7896 =3D Instance a = [2,1]
 
can I be assured that there are = not=20 thousands of actual copies of a but that they simply have a pointer to = a ? I'm=20 interested in the answer for both ghc (compiled/interpreted) as = interpreted=20 Hugs. 
Yes for GHC: you'll only get one copy of=20 'a'.
 
Simon
 
------_=_NextPart_001_01C186DC.ABC0BECE-- --------------InterScan_NT_MIME_Boundary-- From reiner@cs.chalmers.se Mon Dec 17 09:55:16 2001 From: reiner@cs.chalmers.se (Reiner Haehnle) Date: Mon, 17 Dec 2001 10:55:16 +0100 (MET) Subject: Call for Applications to PhD Positions, Chalmers University, Sweden Message-ID: Please pass on to interested students. Apologies for multiple copies. --------------------------------------------------------------------- New PhD Positions (DEADLINE 15 February 2002! See "How to apply" below) Department of Computing Science, Chalmers University of Technology & University of Gothenburg Sweden The Department has about 70 researchers, half being faculty members and half PhD students. Our focus is on programming logic, type theory, functional programming, formal methods, distributed and concurrent systems, security, algorithms, bioinformatics, human computer interaction, and computational linguistics, but research is not restricted to these topics. For more information, see http://www.cs.chalmers.se/Cs/Research. PhD positions are for 5 years. There is no tuition fee. A PhD position is a regular job with social benefits; the salary amounts currently to about 16700 SEK per month in the first year (the exact amount depends on teaching duties, usually 20% of your time). Knowledge of Swedish is not a prerequisite for application. English is our working language for research. Both Swedish and English are used in undergraduate courses. Half of our researchers and PhD students are native Swedes; the rest come from more than 20 different countries. Applicants must have a very good undergraduate degree in Computing Science or in a related subject with a strong Computing Science component. They must also have a strong interest in doing research. You may even apply if you have not yet completed your degree, but expect to do so by September 2002. You are also invited to apply for our new International Master's Programme in Dependable Computer Systems, which can help you to obtain the necessary qualification (see http://www.cs.chalmers.se/Cs/Education/dcs/). The School especially welcomes female applicants. How to apply ------------ First, immediately register your intention to apply using the electronic application form on the WWW via http://www.md.chalmers.se/Jobs/PhD/phd-02-en.thtml The full application should contain 1 A letter of application, listing specific research interests 2 A curriculum vitae 3 Attested copies of degrees and other certificates 4 Copies of relevant work, for example dissertations or articles, that you have authored or co-authored 5 A description of: a previous teaching experience, documented b previous PhD studies, also in other subjects; state financial support for these, if any c previous work experience 6 Letters of recommendation from your teachers or employers If you have financial support of your own (industry job, grant, etc.), please state this fact clearly. It will increase your chances to be accepted considerably, because you need not compete for the limited number of fully financed positions. Send your full application (paper mail) to Department of Computing Science School of Computer Science and Engineering Chalmers University of Technology 412 96 Gothenburg Sweden to arrive by 15 February 2002. You will know the result of your application by 1 May 2002. From thorinn@diku.dk Mon Dec 17 14:50:21 2001 From: thorinn@diku.dk (Lars Henrik Mathiesen) Date: 17 Dec 2001 14:50:21 -0000 Subject: gcd 0 0 = 0 In-Reply-To: <20011216133559.C27182@cs.ucc.ie> (message from Marc van Dongen on Sun, 16 Dec 2001 13:35:59 +0000) Message-ID: <20011217145021.3269.qmail@tyr.diku.dk> > From: Marc van Dongen > Date: Sun, 16 Dec 2001 13:35:59 +0000 > > Marc van Dongen (dongen@cs.ucc.ie) wrote: > > : An integer $a$ divides integer $b$ if there exists an integer > : $c$ such that $a c= b$. > > To make clear why $0$ (and not any other non-zero integer) is the > gcd of $0$ and $0$ I should have added that for the integer case > $g$ is called a greatest common divisor (gcd) of $a$ and $b$ if it > satifies each of the following two properties: > > 1) $g$ divides both $a$ and $b$; > 2) if $g'$ is a common divisor of $a$ and $b$ then $g'$ divides $g$. In case it isn't clear already, these definitions make a lattice on the positive integers, with divides ~ leq, gcd ~ meet and lcm ~ join, using the report's definitions of gcd and lcm. (Choosing the positive result for gcd/lcm is equivalent to noting that divides is a partial preorder on the non-zero integers, and that the quotient identifies x and -x). The only thing that is lacking to make it a lattice on the non-negative integers, is that gcd 0 0 = 0 . All other cases involving zero (i.e., gcd 0 x = x for non-zero x, and lcm 0 x = 0 for all x) are consistent with 0 being the maximal element in the lattice, i.e., that all integers divide zero. Lars Mathiesen (U of Copenhagen CS Dep) (Humour NOT marked) From simonpj@microsoft.com Mon Dec 17 16:57:28 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Mon, 17 Dec 2001 08:57:28 -0800 Subject: Confused about default Message-ID: <1113DDB24D4A2841951BFDF86665EE19066637@RED-MSG-10.redmond.corp.microsoft.com> Well, Foo *is* an instance of Num, so a correct Haskell impl should pick that instance always. Since you don't define the fromInteger method in the instance decl, you get a runtime error. I don't know what you expect the [Foo] and Foo -> Int defaults to do. GHCi fails to put the correct default decl in place for command-line expressions. This is a known bug which we have not got around to fixing yet Simon | -----Original Message----- | From: Ian Lynagh [mailto:igloo@earth.li]=20 | Sent: 14 December 2001 21:29 | To: haskell@haskell.org | Subject: Confused about default |=20 |=20 |=20 | Hi all |=20 | I am rather confused about default. |=20 | In section 4.3.4 the report says | "each ti must be a monotype for which Num ti holds" | but according to grep this is the only place "monotype"=20 | appears in the report. |=20 | If I have the module |=20 | module TT (Foo(..)) where |=20 | default (Foo, [Foo], Foo -> Int) |=20 | data Foo =3D Foo deriving (Eq, Show) |=20 | instance Num Foo where {} | instance (Eq a, Show a) =3D> Num [a] where {} | instance Eq (a -> b) where {} | instance Show (a -> b) where {} | instance Num (a -> b) where {} |=20 | then hugs accepts it and | TT> 5 |=20 | Program error: Undefined member: fromInteger |=20 | ghc accepts it and | TT> 5 | 5 |=20 | nhc tells me |=20 | Error when renaming:: | Illegal type in default at 4:17 |=20 | If I remove all the list and function stuff then hi says | TT> 5 | 5 |=20 | If I have a | main =3D putStrLn $ show 5 |=20 | then nhc gives me | TT> main | No default definition for class method fromInteger |=20 | and ghci gives me | Main> main | *** Exception: TT.lhs:8: No instance nor default method for class | operation PrelNum.fromInteger |=20 |=20 | It seems to me that hugs is in the right with it's handling=20 | of 5, but I am not sure who is wrong with default ([Foo]) or=20 | (Foo -> Int). |=20 |=20 | Finally, the context free grammar doesn't currently enforce=20 | the restriction that only one default declaration be given.=20 | Fixing it would make rather a mess, though. |=20 |=20 | Ian |=20 |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From ger@tzi.de Mon Dec 17 17:05:41 2001 From: ger@tzi.de (George Russell) Date: Mon, 17 Dec 2001 18:05:41 +0100 Subject: gcd 0 0 = 0 Message-ID: <3C1E25E5.81718477@tzi.de> I've reconsidered my earlier position and think now that the Prelude is wrong to make gcd 0 0 an error, and should return 0. It probably doesn't make much difference to anyone, but it's like 1 not being a prime; it may be slightly harder to explain, but it makes the maths come out nicer and is in the end a simplification. From herrmann@infosun.fmi.uni-passau.de Mon Dec 17 17:31:17 2001 From: herrmann@infosun.fmi.uni-passau.de (Ch. A. Herrmann) Date: Mon, 17 Dec 2001 18:31:17 +0100 Subject: gcd 0 0 = 0 In-Reply-To: <3C1E25E5.81718477@tzi.de> References: <3C1E25E5.81718477@tzi.de> Message-ID: <15390.11237.38564.819599@reger.fmi.uni-passau.de> >>>>> "George" == George Russell writes: George> I've reconsidered my earlier position and think now that the George> Prelude is wrong to make gcd 0 0 an error, and should return George> 0. It probably doesn't make much difference to anyone, but George> it's like 1 not being a prime; it may be slightly harder to George> explain, but it makes the maths come out nicer and is in the George> end a simplification. I'm strongly against making 1 a prime number. In contrast, 0*x=0, thus 0 "divides" 0 (somehow). But I have problems with "gcd being the greatest positive integer ..." - 0 is not positive, it is non-negative or natural - 2 also divides 0 and 2 is a "greater integer" than 0 (0 is the top element of the lattice formed by the division relation but that is not clear by the expression "greatest") Anyway, gcd 0 0 = error would be the simplest way to avoid confusion and catch accidental programming errors; e.g., using the gcd to divide something else. -- Christoph From igloo@earth.li Mon Dec 17 17:32:02 2001 From: igloo@earth.li (Ian Lynagh) Date: Mon, 17 Dec 2001 17:32:02 +0000 Subject: Confused about default In-Reply-To: <1113DDB24D4A2841951BFDF86665EE19066637@RED-MSG-10.redmond.corp.microsoft.com>; from simonpj@microsoft.com on Mon, Dec 17, 2001 at 08:57:28AM -0800 References: <1113DDB24D4A2841951BFDF86665EE19066637@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <20011217173202.A10045@stu163.keble.ox.ac.uk> On Mon, Dec 17, 2001 at 08:57:28AM -0800, Simon Peyton-Jones wrote: > Well, Foo *is* an instance of Num, so a correct Haskell impl > should pick that instance always. I was looking at what the implementations would allow, the module wasn't supposed to be useful. > Since you don't define the > fromInteger method in the instance decl, you get a runtime error. I expected this, I included it as in some cases I *didn't* et a runtime error though. > I don't know what you expect the [Foo] and Foo -> Int defaults > to do. Let me try to clarify what I was asking: What is a monotype? For example, is "[Foo]" a monotype and is "Foo -> Int" a monotype? The context free grammar implies that a monotype is identical to a type, in which case why is a different name used? The rest was to attempt to highlight some inconsistencies in the implementations. Thanks Ian From Alan@LCS.MIT.EDU Mon Dec 17 18:45:04 2001 From: Alan@LCS.MIT.EDU (Alan Bawden) Date: Mon, 17 Dec 2001 13:45:04 -0500 (EST) Subject: gcd 0 0 = 0 In-Reply-To: <20011217145021.3269.qmail@tyr.diku.dk> (message from Lars Henrik Mathiesen on 17 Dec 2001 14:50:21 -0000) References: <20011217145021.3269.qmail@tyr.diku.dk> Message-ID: <17Dec2001.133056.Alan@LCS.MIT.EDU> From: Lars Henrik Mathiesen Date: 17 Dec 2001 14:50:21 -0000 ... In case it isn't clear already, these definitions make a lattice on the positive integers, with divides ~ leq, gcd ~ meet and lcm ~ join, using the report's definitions of gcd and lcm. Indeed, that's a nice way of putting it. How about if the report just says: In order to make the non-negative integers into a lattice under `gcd' and `lcm', we define `gcd 0 0 = 0'. From foc@cs.indiana.edu Mon Dec 17 22:26:25 2001 From: foc@cs.indiana.edu (LICS) Date: Mon, 17 Dec 2001 17:26:25 -0500 (EST) Subject: faculty position in logic Message-ID: <200112172226.fBHMQHS08034@moose.cs.indiana.edu> [Sincere apologies for duplicates] Indiana University invites applications for a tenure-track assistant professor position in applied logic. Please see www.informatics.indiana.edu/positions/logic.html for details. Applications received within the next few weeks are likely to still get full consideration. Applicants are welcome to email to foc@cs.indiana.edu to notify of their mailed application, and to provide pointers to any pertinent on-line documentation. From foc@cs.indiana.edu Mon Dec 17 22:26:25 2001 From: foc@cs.indiana.edu (LICS) Date: Mon, 17 Dec 2001 17:26:25 -0500 (EST) Subject: faculty position in logic Message-ID: <200112172226.fBHMQPx08125@moose.cs.indiana.edu> [Sincere apologies for duplicates] Indiana University invites applications for a tenure-track assistant professor position in applied logic. Please see www.informatics.indiana.edu/positions/logic.html for details. Applications received within the next few weeks are likely to still get full consideration. Applicants are welcome to email to foc@cs.indiana.edu to notify of their mailed application, and to provide pointers to any pertinent on-line documentation. From dongen@cs.ucc.ie Tue Dec 18 09:22:25 2001 From: dongen@cs.ucc.ie (Marc van Dongen) Date: Tue, 18 Dec 2001 09:22:25 +0000 Subject: gcd 0 0 = 0 In-Reply-To: <15390.11237.38564.819599@reger.fmi.uni-passau.de>; from herrmann@infosun.fmi.uni-passau.de on Mon, Dec 17, 2001 at 06:31:17PM +0100 References: <3C1E25E5.81718477@tzi.de> <15390.11237.38564.819599@reger.fmi.uni-passau.de> Message-ID: <20011218092225.O27182@cs.ucc.ie> Ch. A. Herrmann (herrmann@infosun.fmi.uni-passau.de) wrote: : In contrast, 0*x=0, thus 0 "divides" 0 (somehow). : But I have problems with "gcd being the greatest positive integer ..." [snip] : - 0 is not positive, it is non-negative or natural : - 2 also divides 0 and 2 is a "greater integer" than 0 : (0 is the top element of the lattice formed by the division relation : but that is not clear by the expression "greatest") : gcd a b is the greatest non-negative integer dividing both a and b such that anything that divides both a and b also divides gcd a b (so gcd a b is the greatest thing that divides both a and b). Regards, Marc van Dongen -- Marc van Dongen | dongen@cs.ucc.ie | Computer Science Department | Western Road | () ASCII ribbon campaign University College Cork | Cork, Ireland | /\ against HTML mail phone: +353 (0)21 4903578 | fax: 4903113 | From juhp@01.246.ne.jp Tue Dec 18 09:32:11 2001 From: juhp@01.246.ne.jp (Jens-Ulrik Petersen) Date: 18 Dec 2001 18:32:11 +0900 Subject: ANNOUNCE: hsclock-0.01.0 release Message-ID: I am pleased to announce the initial release of hsclock, another gtk+hs "applet" I've written. hsclock is an accurate multi-zone gtk clock, which can also run in a tty. hsclock uses gtk timeouts to synchronise the time updates to occur on the second or minute "tick" (dependent on the clock format string), making display updates accurate to within milliseconds. More info, source and rpm's are available at: http://www.01.246.ne.jp/~juhp/haskell/hsclock/ As usual feedback and comments welcome. Enjoy, Jens From dongen@cs.ucc.ie Tue Dec 18 09:32:49 2001 From: dongen@cs.ucc.ie (Marc van Dongen) Date: Tue, 18 Dec 2001 09:32:49 +0000 Subject: gcd 0 0 = 0 In-Reply-To: <17Dec2001.133056.Alan@LCS.MIT.EDU>; from Alan@LCS.MIT.EDU on Mon, Dec 17, 2001 at 01:45:04PM -0500 References: <20011217145021.3269.qmail@tyr.diku.dk> <17Dec2001.133056.Alan@LCS.MIT.EDU> Message-ID: <20011218093249.P27182@cs.ucc.ie> Alan Bawden (Alan@LCS.MIT.EDU) wrote: : In case it isn't clear already, these definitions make a lattice on : the positive integers, with divides ~ leq, gcd ~ meet and lcm ~ join, : using the report's definitions of gcd and lcm. : : Indeed, that's a nice way of putting it. How about if the report just : says: : : In order to make the non-negative integers into a lattice under `gcd' : and `lcm', we define `gcd 0 0 = 0'. It would surely make things a lot less accessible to people (including me) who do not have any (or limited) knowledge about lattices. Why not make it more accessible and use the following rule (ore something similar)? The greates common divison (gcd) of two integers a and b is the unique non-negative integer g which has each of the following two properties: 1) g divides both a and b; and 2) if g' also divides both a and b then g' also divides g, Here an integer a divides an integer b if there is an integer c such that b = c*a. Note that if you regard an integer a to be greater than another integer b if b divides a then the gcd of two intgerers may also be regarded as the greatest common divisor of a and b. Regards, Marc van Dongen From simonpj@microsoft.com Tue Dec 18 09:38:21 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 18 Dec 2001 01:38:21 -0800 Subject: gcd 0 0 = 0 Message-ID: <1113DDB24D4A2841951BFDF86665EE19066640@RED-MSG-10.redmond.corp.microsoft.com> If everyone likes this I'll put it in; otherwise I'll simply state that gcd 0 0 is defined to be 0.=20 Christoph does not like this, but the weight of world opinion seems=20 to be fairly clearly in favour of gcd 0 0 =3D 0. Let's try to wrap = this one up. Simon | -----Original Message----- | From: Alan Bawden [mailto:Alan@LCS.MIT.EDU]=20 | Sent: 17 December 2001 18:45 | To: haskell@haskell.org; Simon Peyton-Jones | Subject: Re: gcd 0 0 =3D 0 |=20 |=20 | From: Lars Henrik Mathiesen | Date: 17 Dec 2001 14:50:21 -0000 | ... | In case it isn't clear already, these definitions make a lattice on | the positive integers, with divides ~ leq, gcd ~ meet and=20 | lcm ~ join, | using the report's definitions of gcd and lcm. |=20 | Indeed, that's a nice way of putting it. How about if the report just | says: |=20 | In order to make the non-negative integers into a lattice=20 | under `gcd' | and `lcm', we define `gcd 0 0 =3D 0'. |=20 From simonpj@microsoft.com Tue Dec 18 09:48:34 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 18 Dec 2001 01:48:34 -0800 Subject: Confused about default Message-ID: <1113DDB24D4A2841951BFDF86665EE19066643@RED-MSG-10.redmond.corp.microsoft.com> | Let me try to clarify what I was asking: |=20 | What is a monotype? For example, is "[Foo]" a monotype and is=20 | "Foo -> Int" a monotype? The context free grammar implies=20 | that a monotype is identical to a type, in which case why is=20 | a different name used? A monotype is a type with no for-alls in it. But you are right that it's confusing that this is the only occurrence. I think the simplest thing is to change 'monotype' to 'type' here; after all, Num (forall a.a->a)=20 does not hold! thanks for pointing this out. Simon From simonpj@microsoft.com Tue Dec 18 09:58:23 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Tue, 18 Dec 2001 01:58:23 -0800 Subject: Haskell 98 IO Message-ID: <1113DDB24D4A2841951BFDF86665EE19066646@RED-MSG-10.redmond.corp.microsoft.com> | Anyway, what should the report say? I think it is reasonable=20 | to expect that stdin & stdout should both be unbuffered in=20 | order for interact to work right. So the defn of interact should be |=20 | interact f =3D do | hSetBuffering stdin NoBuffering -- new | hSetBuffering stdout NoBuffering -- new | s <- hGetContents | putStr (f s) Simon Marlow raises a good point here. If 'interact' is to be interactive it had better be unbuffered. So I propose to add the two new lines above to the Report. This does not change the intended behaviour at all. Simon From gupta@herbrand.utdallas.edu Mon Dec 17 23:28:05 2001 From: gupta@herbrand.utdallas.edu (Dr. Gopal Gupta) Date: Mon, 17 Dec 2001 17:28:05 -0600 Subject: 4th Int'l Symp.: Practical Aspects of Declarative Languages Message-ID: <200112172328.fBHNS5u02536@herbrand.utdallas.edu> [ o Apologies for multiple messages. o Please register and make hotel reservations as soon as possible since both deadlines are approaching fast (Dec. 27th) ]. You are cordially invited to the Fourth International Symposium on Practical Aspects of Declarative Languages that will be held on Jan 19-20, 2002 right after ACM POPL. The program includes invited talks by three distinguished speakers: J. Strother Moore of the University of Texas at Austin, Catherine Meadows of the Naval Research Labs, and Veronica Dahl of Simon Fraser University. Very low registration rates ($150 regular and $100 student) and low conference hotel rates have been secured to make the event affordable. The program ends by late afternoon on Sunday to let attendees return home on Sunday itself. If you are attending ACM POPL, we especially encourage you to plan to attend PADL. More details can be found at: http://www.cs.sunysb.edu/~padl2002 --------------------------------------------------------------------- Fourth International Symposium on Practical Aspects of Declarative Languages (PADL '02) Portland, Oregon, USA Jan 19-20, 2002 Co-located with POPL 2002 --------------------------------------------------------------------- Conference Program ================== Jan 19th 8:45-9:00 Opening Remarks 9:00-10:00 Invited Talk #1 Using a Declarative Language to Build an Experimental Analysis Tool Catherine Meadows (Naval Research Laboratory), 10:00-10:30 Coffee Break 10:30-12:30 Session-I: Modeling Engineering Structures using Constrained Objects Bharat Jayaraman and Pallavi Tambay Compiler Construction in Higher Order Logic Programming Chuck Liang Declarative Programming with Application to Clinical Medicine: On the Use of Gisela in the MedView Project. Olof Torgersson Semantics-based Filtering: Logic Programming's Killer App? Gopal Gupta, Hai-Feng Guo, Arthur Karshmer, Enrico Pontelli, Desh Ranjan, B. Milligan, N. Datta, O. El Khatib, M. Noamany, and X. Zhou 12:30-1:30 Lunch 1:30-2:30 Invited Talk #2 How to Talk to Your Computer So That it Will Listen Veronica Dahl (Simon Fraser University), 2:45-4:15 Session-II: Linear Scan Register Allocation in a High-Performance Erlang Compiler Erik Johansson and Konstantinos Sagonas Typed Combinators for Generic Traversal Ralf Laemmel and Joost Visser Event-Driven FRP. Zhanyong Wan, Walid Taha, and Paul Hudak 4:15-4:30 Coffee Break 4:30-6:00 Session-III: Compiling Embedded Programs to Byte Code. Morten Rhiger, Exploiting Efficient Control and Data Structures in Logic Programs. Rong Yang and Steve Gregory, Memory Management and Scheduling in a Tabling Engine Luis F. Castro and Terrance Swift and David S. Warren -------------------------------------------------------------------------------- Jan 20th 9:00-10:00 Invited Talk #3: Single-Threaded Objects in ACL2. J. Strother Moore (University of Texas, Austin) 10:00-10:30 Coffee Break 10:30-12:30 Session-IV: Adding Apples and Oranges Martin Erwig and Margaret Burnett WASH/CGI: Server-side Web Scripting with Sessions and Typed, Compositional Forms. Peter Thiemann A better XML parser through functional programming. Oleg Kiselyov Functional Approach to Texture Generation. Jerzy Karczmarczuk 12:30-1:30 Lunch 1:30-3:30 Session-V: Abstract Interpretation over Non-Deterministic Finite Tree Automata for Set-Based Analysis of Logic Programs. John Gallagher, German Puebla, A High-Level Generic Interface to External Programming Languages for ECLiPSe. Kish Shen, Joachim Schimpf, Stefano Novello, Josh Singer, Segment Order Preserving and Generational Garbage Collection for Prolog. Ruben Vandeginste, Konstantinos Sagonas, and Bart Demoen, A Debugging Scheme for Declarative Equation Based Modeling Languages. Peter Bunus, Peter Fritzson From herrmann@infosun.fmi.uni-passau.de Tue Dec 18 11:16:11 2001 From: herrmann@infosun.fmi.uni-passau.de (Ch. A. Herrmann) Date: Tue, 18 Dec 2001 12:16:11 +0100 Subject: gcd 0 0 = 0 In-Reply-To: <1113DDB24D4A2841951BFDF86665EE19066640@RED-MSG-10.redmond.corp.microsoft.com> References: <1113DDB24D4A2841951BFDF86665EE19066640@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <15391.9595.758521.560553@reger.fmi.uni-passau.de> >>>>> "Simon" == Simon Peyton-Jones writes: Simon> Christoph does not like this It's OK if the definition is clear; it wasn't using the words "positive" or "greatest integer". Stating "gcd 0 0 = 0" explicitly is a good thing, even if it could be expressed verbatim; people may think about the mathematical background, but they should not need to think about the meaning of the definition. Anyway, I'm still against promoting 1 to a prime number :-) Cheers -- Christoph From frank@cc.gatech.edu Tue Dec 18 11:48:18 2001 From: frank@cc.gatech.edu (Frank Dellaert) Date: Tue, 18 Dec 2001 12:48:18 +0100 Subject: space efficiency question References: <1113DDB24D4A2841951BFDF86665EE19066623@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <000f01c187b9$e3216280$544a88d9@oemcomputer> This is a multi-part message in MIME format. ------=_NextPart_000_000C_01C187C2.4477ED80 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MessageThanks ! Now, a small follow-up question: if I subsequently test 2 Instances = whether they were instantiated with the same Attributes value, as in test (Instance a1 _) (Instance a2 _) =3D (a1=3D=3Da2) will this be implemented efficiently ? I.e. will it check first whether = the pointers happen to be the same, and only then do a full Eq = comparison ? Cheers Frank ----- Original Message -----=20 From: Simon Peyton-Jones=20 To: Frank Dellaert ; Haskell@haskell.org=20 Sent: Monday, December 17, 2001 10:24 AM Subject: RE: space efficiency question Now: if I have a couple of thousand of these Instances, created with = the same Attributes value, as in: =20 a =3D Attributes ["a","bc"] i0000 =3D Instance a [1,2] i0001 =3D Instance a [1,1] ... i7896 =3D Instance a [2,1] =20 can I be assured that there are not thousands of actual copies of a = but that they simply have a pointer to a ? I'm interested in the answer = for both ghc (compiled/interpreted) as interpreted Hugs.=20 Yes for GHC: you'll only get one copy of 'a'. =20 Simon =20 ------=_NextPart_000_000C_01C187C2.4477ED80 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Message
Thanks !
 
Now, a small follow-up question: if I = subsequently=20 test 2 Instances whether they were instantiated with the same Attributes = value,=20 as in
 
test (Instance a1 _) (Instance a2 _) = =3D=20 (a1=3D=3Da2)
 
will this be implemented efficiently ? = I.e. will it=20 check first whether the pointers happen to be the same, and only then do = a full=20 Eq comparison ?
 
Cheers
Frank
----- Original Message -----
From:=20 Simon=20 Peyton-Jones
To: Frank Dellaert ; Haskell@haskell.org
Sent: Monday, December 17, 2001 = 10:24=20 AM
Subject: RE: space efficiency=20 question

Now: if I have a couple of thousand = of these=20 Instances, created with the same Attributes value, as in:
 
a =3D Attributes = ["a","bc"]
i0000 =3D Instance a = [1,2]
i0001 =3D Instance a = [1,1]
...
i7896 =3D Instance a = [2,1]
 
can I be assured that there = are not=20 thousands of actual copies of a but that they simply have a pointer = to a ?=20 I'm interested in the answer for both ghc (compiled/interpreted) as=20 interpreted Hugs. 
Yes for GHC: you'll = only get one=20 copy of 'a'.
 
Simon
 
= ------=_NextPart_000_000C_01C187C2.4477ED80-- From voigt@orchid.inf.tu-dresden.de Tue Dec 18 13:22:19 2001 From: voigt@orchid.inf.tu-dresden.de (Janis Voigtlaender) Date: Tue, 18 Dec 2001 14:22:19 +0100 Subject: space efficiency question References: <1113DDB24D4A2841951BFDF86665EE19066623@RED-MSG-10.redmond.corp.microsoft.com> <000f01c187b9$e3216280$544a88d9@oemcomputer> Message-ID: <3C1F430B.D5B230AC@tcs.inf.tu-dresden.de> Frank Dellaert asks: > test (Instance a1 _) (Instance a2 _) = (a1==a2) > > will this be implemented efficiently ? I.e. will it check first whether the > pointers happen to be the same, and only then do a full Eq comparison ? No, otherwise you might also expect that the following test' function: test' :: String -> Bool test' s = (s==s) always returns True, without considering its actual argument s. But this is not the way of it, (==) evaluates the two strings to be compared as far as necessary for this comparison. For example: test' "abc" = True but: test' undefined = undefined If you really need something like pointer equality, you might want to consider the stable names of: @inproceedings{ jones99stretching, author = "Simon L. Peyton Jones and Simon Marlow and Conal Elliott", title = "Stretching the Storage Manager: Weak Pointers and Stable Names in Haskell", booktitle = "Implementation of Functional Languages", pages = "37-58", year = "1999", url = "citeseer.nj.nec.com/jones99stretching.html" } -- Janis Voigtlaender http://wwwtcs.inf.tu-dresden.de/~voigt/ mailto:voigt@tcs.inf.tu-dresden.de From thorinn@diku.dk Tue Dec 18 16:11:08 2001 From: thorinn@diku.dk (Lars Henrik Mathiesen) Date: 18 Dec 2001 16:11:08 -0000 Subject: gcd 0 0 = 0 In-Reply-To: <20011218093249.P27182@cs.ucc.ie> (message from Marc van Dongen on Tue, 18 Dec 2001 09:32:49 +0000) Message-ID: <20011218161108.5990.qmail@tyr.diku.dk> > From: Marc van Dongen > Date: Tue, 18 Dec 2001 09:32:49 +0000 > > Alan Bawden (Alan@LCS.MIT.EDU) wrote: > : Indeed, that's a nice way of putting it. How about if the report just > : says: > : > : In order to make the non-negative integers into a lattice under `gcd' > : and `lcm', we define `gcd 0 0 = 0'. > It would surely make things a lot less accessible to people > (including me) who do not have any (or limited) knowledge about > lattices. Why not make it more accessible and use the following rule > (ore something similar)? > The greates common divison (gcd) of two integers a and b is the unique > non-negative integer g which has each of the following two properties: > 1) g divides both a and b; and > 2) if g' also divides both a and b then g' also divides g, > Here an integer a divides an integer b if there is an integer c > such that b = c*a. This is exactly what you get if you plug the relation 'divides' on the non-negative integers into the definition of meet in a lattice. So this formulation is no more or less complex to use than the lattice one --- and people who do know about lattices will probably realize this pretty fast. It all depends on who you want to convince that gcd 0 0 should be 0, the mathematicians (by elegance) or the programmers (by concreteness). But since it seems that Simon is just going to put 'it is so' in the report, the point is moot. Lars Mathiesen (U of Copenhagen CS Dep) (Humour NOT marked) From wittner@uni-duesseldorf.de Tue Dec 18 16:43:33 2001 From: wittner@uni-duesseldorf.de (Toralf Wittner) Date: Tue, 18 Dec 2001 17:43:33 +0100 Subject: x^y Message-ID: <0GOJ006RUT6O12@neptun.rz.uni-duesseldorf.de> Hello, you can count me as a newbie in functional programming. I'm attempting to define a function that computes the value of x^y for whole numbers. Intuively (all efficiency considerations aside) I would start with something like this: power x y | x == 0 = 0 | y == 0 = 1 | y > 0 = x * power x (y-1) | y < 0 = 1 / fromInteger x * power x (y+1) One recognizes that the function returns either an integer value if y > 0 or a float value if y < 0. Therefore I can't write a signature like pow :: Integer -> Integer -> Integer nor can I do pow :: Integer -> Integer -> Double. If I would use Python I could write something like this: def power(m, n): if m == 0: return 0 if n == 0: return 1 if n > 0: return m * power(m, (n-1)) if n < 0: return (1 / float(m)) * power(m, (n+1)) How then would I write this function in Haskell (concerning types)? Thanks in advance! Kind regards, Toralf From dongen@cs.ucc.ie Tue Dec 18 17:02:36 2001 From: dongen@cs.ucc.ie (Marc van Dongen) Date: Tue, 18 Dec 2001 17:02:36 +0000 Subject: gcd 0 0 = 0 In-Reply-To: <20011218161108.5990.qmail@tyr.diku.dk>; from thorinn@diku.dk on Tue, Dec 18, 2001 at 04:11:08PM -0000 References: <20011218093249.P27182@cs.ucc.ie> <20011218161108.5990.qmail@tyr.diku.dk> Message-ID: <20011218170236.C4643@cs.ucc.ie> Lars Henrik Mathiesen (thorinn@diku.dk) wrote: : > Alan Bawden (Alan@LCS.MIT.EDU) wrote: : > : Indeed, that's a nice way of putting it. How about if the report just : > : says: : > : : > : In order to make the non-negative integers into a lattice under `gcd' : > : and `lcm', we define `gcd 0 0 = 0'. [snip] : This is exactly what you get if you plug the relation 'divides' on the : non-negative integers into the definition of meet in a lattice. So : this formulation is no more or less complex to use than the lattice : one --- and people who do know about lattices will probably realize : this pretty fast. I disagree. Alan is talking about adding things to the haskell report. That document should be accessible to as many people as possible. I have not yet met anybody who had lattice theory in primary and/or secondary school. On the other hand I *have* met quite a few of them who have a pretty good idea about what it means for one number to divide another. [snip] Regards, Marc van Dongen -- Marc van Dongen | dongen@cs.ucc.ie | Computer Science Department | Western Road | () ASCII ribbon campaign University College Cork | Cork, Ireland | /\ against HTML mail phone: +353 (0)21 4903578 | fax: 4903113 | From kentk@md.chalmers.se Tue Dec 18 17:00:30 2001 From: kentk@md.chalmers.se (Kent Karlsson) Date: Tue, 18 Dec 2001 18:00:30 +0100 Subject: gcd 0 0 = 0 In-Reply-To: <15391.9595.758521.560553@reger.fmi.uni-passau.de> Message-ID: <000701c187e5$80c7c1c0$b4e21081@chalmers95a69n> > >>>>> "Simon" == Simon Peyton-Jones writes: > > Simon> Christoph does not like this I still don't like this. 0 has never, and will never, divide anything, in particular not 0. 0 may be a prime factor of 0 (see also below!), but that is different. It is not the greatest (in the ordinary sense) divisor of 0. Indeed, +infinity is a much larger divisor of 0... I'm not in favour of using a very special-purpose order, not used for anything else, and that isn't even an order but a preorder, just to motivate gcd 0 0 = 0. Even if using this very special-purpose preorder, an infinity would be included in the 'top' equivalence class, and if we pick a representative value on the basis of which is 'greater' in the ordinary sense for integers augmented with infinities(!), then +infinity should be the representative value. Thus, in any case, gcd 0 0 = +infinity. This is easy enough for Integer, where +infinity and -infinity can easily be made representable (and should be made representable), but harder for a 'pure hardware' Int datatype. But in an ideal world, gcd 0 0 = +infinity with no error or exception. > It's OK if the definition is clear; it wasn't using > the words "positive" or "greatest integer". > > Stating "gcd 0 0 = 0" explicitly is a good thing, > even if it could be expressed verbatim; > people may think about the mathematical background, > but they should not need to think about the > meaning of the definition. > Anyway, I'm still against promoting 1 to a prime number :-) Why? If EVERY natural number is to have a prime factorisation, then BOTH 0 AND 1 have to be promoted to prime numbers; otherwise 1 and 0 cannot be prime factorised; in addition to that 1 is then a prime factor of any number (that can be excluded from the *minimal* list of prime factors except for 1)... There is no fundamental reason to except 1 from being a prime number. But there is a fundamental reason to say that 0 can never be a divisor (i.e. 0|0 is false; x|y is true iff x is a *non-zero* factor of y; the 'non-zero' part is often left implicit (e.g. one is only talking about strictly positive integers), which is part of the reason why we are having this discussion). If you want something similar to gcd, but that returns 0 for 0 and 0, then it is the 'product of all common prime factors'; where 1 has the (non-minimal) prime factorisation [1, 1, ...], 0 has the (non-minimal) prime factorisation [0, 1, 2, ...], and 1 is included at least once in the (non-minimal) prime factorisation of any natural number. If you want a parallel to the divides relation where 0 and 0 are related: 0 is a factor of 0. A prime number is a number that has no integer *between* 1 and itself as factors. People often say "except" instead of "between", but that does not work for 0, nor for the non-minimal prime factorisations that people seem to be interested in, given the interest in having gcd 0 0 = 0 (which isn't the gc*d*!). Again, the context is often strictly positive integers, and 'between' and 'except' are then equivalent. For no apparent reason 1 is usually also excepted, but that does not work for the prime factorisation of 1, nor for finding the product of all common prime factors of 1 and another natural number... For integers, -1 is also a prime number, and for imaginary integers, i is also a prime number... I'm sure somebody can give a nice definition of a partial order (not just preorder) lattice with 1 as the min value and 0 as the max value (just larger than the infinities), if you absolutely want a lattice with a gcd-*like* meet and lcm-*like* join for this (the, positive bias, factor-of order). I'd be happy to support such gcd-*like* (pcf?) and lcm-*like* functions, but they aren't the gcd, nor the lcm (e.g. pcf (-1) (-1) = -1, not 1, etc.). If you don't like adding these, then I suggest leaving things completely as they are. Squeezing in two operations into one just because they have the same results over the first quadrant is not something I find to be too good. Odd one out? /kent k From dpt@math.harvard.edu Tue Dec 18 18:12:14 2001 From: dpt@math.harvard.edu (Dylan Thurston) Date: Tue, 18 Dec 2001 13:12:14 -0500 Subject: gcd 0 0 = 0 In-Reply-To: <000701c187e5$80c7c1c0$b4e21081@chalmers95a69n>; from kentk@md.chalmers.se on Tue, Dec 18, 2001 at 06:00:30PM +0100 References: <15391.9595.758521.560553@reger.fmi.uni-passau.de> <000701c187e5$80c7c1c0$b4e21081@chalmers95a69n> Message-ID: <20011218131214.A18214@noether.math.harvard.edu> On Tue, Dec 18, 2001 at 06:00:30PM +0100, Kent Karlsson wrote: > Why? If EVERY natural number is to have a prime factorisation, then BOTH > 0 AND 1 have to be promoted to prime numbers; 1 has a perfectly fine prime factorization. It is the product of 0 primes, the null product. (A null product is defined, for very good reasons, to be 1, just like a null sum is defined to be 0.) I could see defences of calling 0 a prime, although it is not standard mathematical practice. The ideal generated by 0 is a prime ideal, for one thing. 0 would still not have a unique prime factorization, however. (But Haskell should not unilaterally decide to violate standard mathematical terminology!) > ... But > there is a fundamental reason to say that 0 can never be a divisor (i.e. 0|0 > is false; x|y is true iff x is a *non-zero* factor of y; the 'non-zero' part > is often left implicit (e.g. one is only talking about strictly positive > integers), which is part of the reason why we are having this discussion). What fundamental reason do you have in mind? Why do you use this definition of divisibility? (I'm curious; other mathematicians give the same definition, and I can't see why.) This thread made me curious, so I did a little library research. I was surprised to discover that mathematicians discover on this, the domain of definition of "gcd a b": Domain References ------ ---------- a /= 0, b /= 0 Lang, "Algebra, 3rd Edition" Hasse, "Number Theory" a, b not both 0 Koblitz, "A Course on Number Theory and Cryptography" all a, b allowed MacLane and Birkhoff, "Algebra, 2nd Edition" Koch, "Number Theory" At least the books by Lang and MacLane-Birkhoff are standard references. Note that the definitions all agree when they are defined (with gcd 0 0 = 0). As I said, I was surprised; to me, the definiton with all a and b is the more natural one. I still recommend using the full domain (especially since exceptions are awkward to deal with in Haskell), but I'm not as certain. Best, Dylan Thurston From ack@nethere.com Tue Dec 18 23:54:13 2001 From: ack@nethere.com (Michael Ackerman) Date: Tue, 18 Dec 2001 15:54:13 -0800 Subject: gcd 0 0 = 0 References: <15391.9595.758521.560553@reger.fmi.uni-passau.de> <000701c187e5$80c7c1c0$b4e21081@chalmers95a69n> <20011218131214.A18214@noether.math.harvard.edu> Message-ID: <3C1FD725.FFC84D92@nethere.com> The general meaning of `having a prime factorization' is that every non-zero element is uniquely a product of a unit and a product of primes. The algebraic structures where unique factorizations live are `unique factorization domains' (UFDs) of which a central class is formed by the ring of polynomials over a field. Here the non-zero elements of the field are the units; no one has ever suggested calling them primes! In a general UFD one can only speak of _a_ gcd of two elements x and y, meaning an element d such that one has (x, y) = (d), an equality of ideals. In some special cases, there is a natural choice for d (e.g., in the integers, the non-negative d; in the ring of polynomials over a field, the monic d (having leading coeff. 1)). In some UFDs there is no canonical choice (e.g. in the Gaussian integers, a + ib for a, b integers). gcd(0, 0) = 0. Cheers, Michael Ackerman Dylan Thurston wrote: > > On Tue, Dec 18, 2001 at 06:00:30PM +0100, Kent Karlsson wrote: > > Why? If EVERY natural number is to have a prime factorisation, then BOTH > > 0 AND 1 have to be promoted to prime numbers; > > 1 has a perfectly fine prime factorization. It is the product of 0 primes, > the null product. (A null product is defined, for very good reasons, to > be 1, just like a null sum is defined to be 0.) > > I could see defences of calling 0 a prime, although it is not standard > mathematical practice. The ideal generated by 0 is a prime ideal, > for one thing. 0 would still not have a unique prime factorization, > however. (But Haskell should not unilaterally decide to violate standard > mathematical terminology!) > > > ... But > > there is a fundamental reason to say that 0 can never be a divisor (i.e. 0|0 > > is false; x|y is true iff x is a *non-zero* factor of y; the 'non-zero' part > > is often left implicit (e.g. one is only talking about strictly positive > > integers), which is part of the reason why we are having this discussion). > > What fundamental reason do you have in mind? Why do you use this definition > of divisibility? (I'm curious; other mathematicians give the same > definition, and I can't see why.) > > This thread made me curious, so I did a little library research. I was > surprised to discover that mathematicians discover on this, the domain > of definition of "gcd a b": > > Domain References > ------ ---------- > a /= 0, b /= 0 Lang, "Algebra, 3rd Edition" > Hasse, "Number Theory" > > a, b not both 0 Koblitz, "A Course on Number Theory and Cryptography" > > all a, b allowed MacLane and Birkhoff, "Algebra, 2nd Edition" > Koch, "Number Theory" > > At least the books by Lang and MacLane-Birkhoff are standard references. > Note that the definitions all agree when they are defined (with gcd 0 0 = 0). > > As I said, I was surprised; to me, the definiton with all a and b is the > more natural one. I still recommend using the full domain (especially since > exceptions are awkward to deal with in Haskell), but I'm not as certain. > > Best, > Dylan Thurston > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell From Jan de Wit" <000701c187e5$80c7c1c0$b4e21081@chalmers95a69n> <20011218131214.A18214@noether.math.harvard.edu> <3C1FD725.FFC84D92@nethere.com> Message-ID: <003601c18822$2258e000$2fe5fea9@yatima> Why not define gcd a b as the largest (in 'normal' order) integer d such that the set of sums of multiples of a and b {na+mb | n <- Z, m <- Z} is equal to the set of multiples of d {nd | n <- Z}? Easy to understand, no talk of division, lattices, rings, ideals etcetera, and it covers the cases with 0. Cheers, Jan de Wit From ack@nethere.com Wed Dec 19 00:26:46 2001 From: ack@nethere.com (Michael Ackerman) Date: Tue, 18 Dec 2001 16:26:46 -0800 Subject: gcd oops Message-ID: <3C1FDEC6.54484152@nethere.com> Sorry for an error in my previous message. The definition there of a gcd works only in a prinicpal ideal domain (which covers all the rings mentioned in the examples). According to Bourbaki, chapter on ordered groups, the gcd of two non-zero elements of a UFD A is well-defined as an element of (A-{0})/units, a quotient monoid. So in this context gcd(0, _) is undefined. But Bourbaki adds that this concept is `sometimes' extended to the gcd of a finite family (x_i) of elements some of which may be zero by taking the gcd to be an element d such that for all z, z divides d iff z divides each x_i. Cheers, Michael Ackerman From ashley@semantic.org Wed Dec 19 06:24:24 2001 From: ashley@semantic.org (Ashley Yakeley) Date: Tue, 18 Dec 2001 22:24:24 -0800 Subject: ANN (bis): Release 0.1 of Haskell/Java VM Bridge Message-ID: <200112190624.WAA02738@mail4.halcyon.com> OK, the SourceForge file release system bug has been fixed, so I put the release files up there. Please download from there rather than from semantic.org. Revised, expanded announcement... ------- The first release, 0.1, of Haskell/Java VM Bridge is now available. Haskell/Java VM Bridge allows Haskell programs access to the Java Virtual Machine. Features include: * Calling of Java methods, access to fields, array-handling; * Integration of garbage collectors; * Reconciliation of exception models; * Reconciliation of thread models, including 'synchronized' monitor support and the ability to fork Haskell actions as Java threads; * Strong typing for Java classes and method argument lists (as tuples), and use of Haskell lists as arrays; * Creation of Java classes 'on the fly' (using DefineClass and the Java Class File Format) that can have Haskell callback methods; * Lifted monads which do all the necessary JNI class and method/field ID preloading and 'JNIEnv'-pointer variable handling for you -- these can be automatically generated via a tool (MakeJVMModule); * Layered design includes lower-level IO-based interface; * Automatic generation of modules for Java API classes; * All relevant imports, flags and libraries etc. handled by a single GHC package 'javavm'; * No 'unsafe' Haskell calls or pure function FFI anywhere. This release should be 'beta' quality, but has undergone little testing. You will need: * An x86 machine running some form of Unix; * GHC 5.02 or later; * The appropriate JVM, installed in the appropriate place: - IBM JDK/JRE 1.3 for x86, installed in /usr/lib/ibm-java/IBMJava2-13/ - Blackdown Port of Sun's JRE 1.3/Sun JDK 1.3 for x86, installed in /usr/lib/j2sdk1.3/ and /usr/lib/j2re1.3/ No documentation is currently available, sorry. Two examples have been included: a trivial "hello world" program, and a program that shows a Java Frame containing an instance of a Haskell-defined subclass of Canvas that has a Haskell 'paint' method that draws an oval. You should be able to figure out most of it from that... and of course the source is available from SourceForge CVS. Be sure to download the correct .tar.gz file for your Java VM. Simple installation instructions are included in the file. Haskell/JVM Bridge and source code is licensed under the GNU Lesser GPL. Future plans: * documentation * port to Cygwin * port to Darwin/OS X (waiting on GHC) * use of Java 1.4 API (waiting on Sun, though use of beta versions is possible) -- Ashley Yakeley, Seattle WA From mechvel@math.botik.ru Wed Dec 19 08:12:34 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Wed, 19 Dec 2001 11:12:34 +0300 Subject: x^y. Reply Message-ID: Toralf Wittner writes > [..] > power x y > [..] > | y > 0 = x * power x (y-1) > | y < 0 = 1 / fromInteger x * power x (y+1) > > One recognizes that the function returns either an integer value > if y > 0 or a float value if y < 0. Therefore I can't write a > signature like > pow :: Integer -> Integer -> Integer nor can I do > pow :: Integer -> Integer -> Double. > > [..] > How then would I write this function in Haskell (concerning types)? The type Rational fits the case n < 0 too, and it includes Integer. But if you still need Integer | Double, you can, for example, introduce a new type of a disjoint union of the above two, and then, to compute like this: pow (Intg 2) 2 --> Intg 4 pow (Intg 2) (-2) --> D 0.25 pow (D 2.0) (-2) --> D 0.25 This is achieved by data PowerDom = Intg Integer | D Double deriving(Eq,Show) pow :: PowerDom -> Integer -> PowerDom pow x n = p x n where p (Intg m) n = if n > 0 then Intg $ powerInteger m n else D $ powerDouble (fromInteger m :: Double) n p(D d) n = D $ powerDouble d n powerInteger m n = m^n :: Integer powerDouble :: Double -> Integer -> Double powerDouble d n = ... usual way for float - something like this. ----------------- Serge Mechveliani mechvel@botik.ru From till@doerges.net Wed Dec 19 09:13:45 2001 From: till@doerges.net (Till Doerges) Date: Wed, 19 Dec 2001 10:13:45 +0100 Subject: x^y In-Reply-To: <0GOJ006RUT6O12@neptun.rz.uni-duesseldorf.de>; from wittner@uni-duesseldorf.de on Tue, Dec 18, 2001 at 05:43:33PM +0100 References: <0GOJ006RUT6O12@neptun.rz.uni-duesseldorf.de> Message-ID: <20011219101345.B2662@atlan.wanderer.none> On Tue, Dec 18, 2001 at 05:43:33PM +0100, Toralf Wittner wrote: > power x y > | x == 0 = 0 > | y == 0 = 1 > | y > 0 = x * power x (y-1) > | y < 0 = 1 / fromInteger x * power x (y+1) Why did you put 'fromInteger' into the last line? If you get rid of that, this will make your 'power' be accepted by the haskell-compiler or -interpreter. > One recognizes that the function returns either an integer value if y > 0 or > a float value if y < 0. Therefore I can't write a signature like > pow :: Integer -> Integer -> Integer nor can I do > pow :: Integer -> Integer -> Double. No, you can't, and that's one of the reasons why type-classes where introduced. You don't have to state the type of x and y explicitely. Rather you can specify certain 'properties', i.e. y must be a number, there must be an ordering relation and x must allow for the representation of fractions. --- snip --- Main> :t power power :: (Num a, Ord a, Fractional b) => b -> a -> b Main> power 2 3 8.0 (113 reductions, 147 cells) Main> power 2 (-1) 0.5 (70 reductions, 87 cells) Main> --- snap --- > How then would I write this function in Haskell (concerning types)? See above (the type signature was kindly provided by hugs ;-). HTH -- Till -- e-mail: reverse(net dot doerges at till) | ENCRYPTED | pgp/gpg: keys via keyserver or my homepage | MAIL IS | www: http://www.doerges.net | WELCOME! | From GACOGNE Louis equipe Bernadette Bouchon-Meunier Wed Dec 19 09:33:39 2001 From: GACOGNE Louis equipe Bernadette Bouchon-Meunier (GACOGNE Louis equipe Bernadette Bouchon-Meunier) Date: Wed, 19 Dec 2001 10:33:39 +0100 (MET) Subject: random Message-ID: <200112190933.KAA05235@atlantide.muses> Is there a random function in Hugs 98 on macintosh. I found something about random in the library but I was not able to find a random function running. Louis Gacogne IIE-CNAM allee Jean Rostand 91025 Evry (tel 01 69 36 73 41) Laboratoire d'Informatique de l'Universite Paris VI Place Jussieu 75252 Paris 5 (tel 01 44 27 88 07) http://www.iie.cnam.fr/~gacogne/ From kentk@md.chalmers.se Wed Dec 19 13:04:25 2001 From: kentk@md.chalmers.se (Kent Karlsson) Date: Wed, 19 Dec 2001 14:04:25 +0100 Subject: gcd 0 0 = 0 In-Reply-To: <003601c18822$2258e000$2fe5fea9@yatima> Message-ID: <000001c1888d$b01113c0$b4e21081@chalmers95a69n> Let me try again: greatest -> maximum/supremum of a set of integers (plain everyday order) common -> intersection (plain everyday intersection of sets) divisor (of an integer value v) -> an integer value m, such that v/m is defined and, if so, is an integer factor (of an integer value v) -> an integer value m, such that there is an integer value n such that m*n=v So (mock Haskell syntax; set expression really): greatest_common_divisor a b = max (intersection {all divisors of a} {all divisors of b}) What is the supremum (result of max in the expression above) if a and b are both 0? (You're allowed to use values not prescribed by Haskell to exist. ;-) (You can replace "divisors" by "factors" in that expression and still get the same result.) I may agree that an operation *similar* to gcd, where <0,0> as argument returns 0 is useful (maybe even more useful than gcd!). But that operation is still not the gcd (and might even return other results thaN gcd also for other value pairs than <0,0>; in particlar negatives; depending on what is found most useful). If you want to replace gcd by some other, similar, operation, please go ahead. But call it something else, because it is something else. If you want to generalise that to polynomials or Gaussian integers (or at least imaginary integers, as opposed to complex integers), fine (though not for the current standard Haskell library). (Micheal, I am interested in the Guassian integer variety of this. If you like, you can expand on what you said in an off-list message, or give me a reference.) Kind (and somewhat fundamentalist) regards /kent k > -----Original Message----- > From: haskell-admin@haskell.org [mailto:haskell-admin@haskell.org]On > Behalf Of Jan de Wit > Sent: den 19 december 2001 01:15 > To: haskell@haskell.org > Subject: Re: gcd 0 0 = 0 > > > Why not define gcd a b as the largest (in 'normal' order) > integer d such > that the set of sums of > multiples of a and b {na+mb | n <- Z, m <- Z} is equal to the set of > multiples of d > {nd | n <- Z}? Easy to understand, no talk of division, > lattices, rings, > ideals etcetera, and it covers the cases with 0. > > Cheers, Jan de Wit > > > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell From mechvel@math.botik.ru Wed Dec 19 13:25:17 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Wed, 19 Dec 2001 16:25:17 +0300 Subject: FiniteMap for standard Message-ID: Long ago I suggested to include FiniteMap into Haskell-98 standard library. Is it still late to do this, or maybe, the situation has changed? ----------------- Serge Mechveliani mechvel@botik.ru From icalp2002@lcc.uma.es Wed Dec 19 13:39:55 2001 From: icalp2002@lcc.uma.es (icalp2002@lcc.uma.es) Date: Wed, 19 Dec 2001 14:39:55 +0100 Subject: ICALP2002 call for papers Message-ID: We apologize for possible multiple postings. In http://www.lcc.uma.es/icalp2002 you can find a pdf version of this call for paper. +++++++++++++++++++++++++++++++++++++ Last information: Second version of the WEB pages at http://www.lcc.uma.es/icalp2002 Workshops confirmed: Computability and Complexity in Analysis (CCA 2002) Algorithmic Methods and Models for Optimization of Railways ATMOS 2002 7 th International Workshop on Formal Methods for Industrial Critical Systems Foundations of Wide Area Network Computing Invited speakers confirmed: Heikki Mannila Manuel Hermenegildo +++++++++++++++++++++++++++++++++++++ Call for Papers ICALP 2002 29th International Colloquium on Automata, Languages and Programming July 8-13, 2002, Málaga, Spain Camera Ready: April 16, 2002 The 29th annual meeting of the European Association of Theoretical Computer Science will be held in Málaga, Spain, July 8-13, 2002 (at the E.T.S. Ingeniería Informática). As with the Journal Theoretical Computer Science (TCS), the scientific program of the Colloquium will be split into two parts: Track A of the meeting will correspond to Algorithms, Automata, Complexity and Games, while Track B to Logic, Semantics and Theory of Programming. SUBMISIONS: Authors are invited to submit extended abstract of their papers, presenting original contributions to the theory of computer science. Detailed instructions for paper submissions will be found on the conference webpage (http://www.lcc.uma.es/icalp2002) and in future calls for papers. Submissions should consist of: a cover page, with the author's full name, address, fax number, e-mail address, a 100-word abstract, keywords and to which track (A or B) the paper is being submitted and an extended abstract describing original research. At least one author of an accepted paper should be available to present it at the conference. Simultaneous submission to other conferences with published proceedings is not allowed. Further information (dates and instructions for submissions, workshops, registration, location and travel) will be provided in future announcements. ORGANIZING COMMITEE: Buenaventura Clares (University of Granada), Ricardo Conejo (University of Málaga), Inmaculada Fortes (University of Málaga), Llanos Mora (University of Málaga), Rafael Morales (co-Chair, University of Málaga), Marlon Nuñez (University of Málaga), José Luis Pérez de la Cruz (University of Málaga), Gonzalo Ramos (University of Málaga), Francisco Triguero (co-Chair, University of Málaga), José Luis Triviño (University of Málaga). IMPORTANT DATES: Workshops proposal: November 8, 2001 Submissions: January 14, 2002 Notification: March 20, 2002 CONFERENCE CO-CHAIRS Prof. Francisco Triguero Prof. Rafael Morales Universidad de Málaga E.T.S. Ingeniería Informática Dept. Lenguajes y Ciencias de la Computación Bulevar Louis Pasteur, 35 29071 - Málaga (SPAIN) e-mail: icalp2002@informatica.uma.es PROGRAM COMMITEE Track A Ricardo Baeza-Yates (U. Chile) Volker Diekert (U. Stuttgart) Paolo Ferragina (U. Pisa) Catherine Greenhill (U. Melbourne) Torben Hagerup (U. Frankfurt) Johan Håstad (KTH, Stockholm) Gabriel Istrate (Los Alamos) Claire Kenyon (U. Paris XI) Der-Tsai Lee (Acad. Sinica, Taipei) Heikki Mannila (Nokia, Helsinki) Elvira Mayordomo (U. Zaragoza) Helmut Prodinger (U. Witwatersrand, South Africa) Jan van Leeuwen(U. Utrecht) Paul Vitányi (CWI, Amsterdam) Peter Widmayer (ETH Zürich) (Chair) Gerhard Woeginger (T.U. Graz) Christos Zaroliagis (U. Patras) Track B Martín Abadi (Bell Labs Research, Lucent) Roberto Amadio (U. Provence) Gilles Barthe (INRIA-SophiaAntipolis) Manfred Droste (University of Technology Dresden) Cédric Fournet (Microsoft Cambridge) Matthew Hennessy (U. Sussex) (Chair) Furio Honsell (U. Udine) Peter O'Hearn (Queen Mary & W. C. London) Fernando Orejas (U.P.Catalunya) Ernesto Pimentel (U. Málaga) David Sands (Chalmers University of Technology and Göteborg University) Dave Schmidt (U. Kansas) Gheorghe Stefanescu (U. Bucharest) Vasco Vasconcelos (U. Lisbon) Thomas Wilke (U. Kiel) +++++++++++++++++++++++++++++++++++++++++++ Malaga University uses Christmas holidays for backup and maintenance of his network. If you have problem to arrive to ICALP 2002 main page, please retry again later. If you get to the page http://www.lcc.uma.es but not to the page http://www.lcc.uma.es/icalp2002 contact with us: conejo@lcc.uma.es morales@lcc.uma.es From simonpj@microsoft.com Wed Dec 19 13:43:46 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Wed, 19 Dec 2001 05:43:46 -0800 Subject: FiniteMap for standard Message-ID: <1113DDB24D4A2841951BFDF86665EE1906665C@RED-MSG-10.redmond.corp.microsoft.com> Much, much too late, however desirable. | -----Original Message----- | From: S.D.Mechveliani [mailto:mechvel@math.botik.ru]=20 | Sent: 19 December 2001 13:25 | To: haskell@haskell.org | Subject: FiniteMap for standard |=20 |=20 | Long ago I suggested to include FiniteMap into Haskell-98=20 | standard library. | Is it still late to do this, or maybe, the situation has changed?=20 |=20 | ----------------- | Serge Mechveliani | mechvel@botik.ru |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From wittner@uni-duesseldorf.de Wed Dec 19 14:11:06 2001 From: wittner@uni-duesseldorf.de (Toralf Wittner) Date: Wed, 19 Dec 2001 15:11:06 +0100 Subject: x^y. Reply In-Reply-To: References: Message-ID: <0GOL00IC6GSOOO@neptun.rz.uni-duesseldorf.de> On Wednesday, 19. December 2001 09:12, S.D.Mechveliani wrote: [...] > But if you still need Integer | Double, you can, for example, > introduce a new type of a disjoint union of the above two, and then, > to compute like this: > pow (Intg 2) 2 --> Intg 4 > pow (Intg 2) (-2) --> D 0.25 > pow (D 2.0) (-2) --> D 0.25 > This is achieved by > > data PowerDom = Intg Integer | D Double deriving(Eq,Show) > > pow :: PowerDom -> Integer -> PowerDom > pow x n = p x n > where > p (Intg m) n = if n > 0 then Intg $ powerInteger m n > else D $ powerDouble (fromInteger m :: Double) n > p(D d) n = D $ powerDouble d n > > powerInteger m n = m^n :: Integer > > powerDouble :: Double -> Integer -> Double > powerDouble d n = ... usual way for float > > - something like this. This seems to be what I want. I tried it this way: module Main where import System main = do [a1, a2] <- getArgs let x = read a1 let y = read a2 in putStrLn (show x ++ " ^ " ++ show y ++ " = " ++ show (pow x y)) data PowerNum = INT Integer | DBL Double deriving (Eq, Show, Read) pow :: PowerNum -> Integer -> PowerNum pow x y = z x y where z (INT x) y = if y > 0 then INT $ powInteger x y else DBL $ powDouble (fromInteger x) y z (DBL x) y = DBL $ powDouble x y powInteger x y | x == 0 = 0 | y == 0 = 1 | y > 0 = x * powInteger x (y - 1) powDouble x y | x == 0 = 0 | y == 0 = 1 | y > 0 = 1 / x * powDouble x (y - 1) While GHC compiled this code I get a runtime error: Fail: Prelude.read: no parse and HUGS reports: ERROR: Illegal Haskell 98 class constraint in inferred type *** Expression : pow 1 2 *** Type : Num PowerNum => PowerNum Could you tell me what I did wrong? Thank you very much! Toralf > > > ----------------- > Serge Mechveliani > mechvel@botik.ru From wittner@uni-duesseldorf.de Wed Dec 19 15:30:41 2001 From: wittner@uni-duesseldorf.de (Toralf Wittner) Date: Wed, 19 Dec 2001 16:30:41 +0100 Subject: x^y. Reply In-Reply-To: References: Message-ID: <0GOL005G2KHDMK@neptun.rz.uni-duesseldorf.de> Ahh - sorry, too much cut and paste ;-) data PowerNum = INT Integer | DBL Double deriving (Eq, Show, Read) pow :: PowerNum -> Integer -> PowerNum pow x y = z x y where z (INT x) y = if y > 0 then INT $ powInteger x y else if y == 0 then INT $ 1 else DBL $ powDouble (fromInteger x) y z (DBL x) y = DBL $ powDouble x y powInteger x y | x == 0 = 0 | y == 0 = 1 | y > 0 = x * powInteger x (y - 1) powDouble x y | x == 0 = 0 | y == 0 = 1 | y < 0 = 1 / x * powDouble x (y + 1) Now it basically works. However wouldn't it have been easier to write something like this: module Main where import System main = do [a1, a2] <- getArgs let x = read a1 let y = read a2 in if y >= 0 then putStrLn (show x ++ " ^ " ++ show y ++ " = " ++ show (powPos x y)) else putStrLn (show x ++ " ^ " ++ show y ++ " = " ++ show (powNeg x y)) powPos :: Integer -> Integer -> Integer powPos x y | x == 0 = 0 | y == 0 = 1 | y > 0 = x * powPos x (y - 1) powNeg :: Integer -> Integer -> Double powNeg x y | x == 0 = 0 | y == 0 = 1 | y < 0 = 1 / fromInteger x * powNeg x (y + 1) Initially I wanted something as terse as the Python version, now I either have to write two functions or I need to define a type. Is there not an easier way to come as close as possible to the Python version? Thanks anyway - learnt a lot! Toralf From hdaume@ISI.EDU Thu Dec 20 00:18:35 2001 From: hdaume@ISI.EDU (Hal Daume III) Date: Wed, 19 Dec 2001 16:18:35 -0800 (PST) Subject: global counters Message-ID: Please, no tirade about banishing unsafePerformIO. I've seen this done before I just don't remember how. I want to use a state monad to count things, but don't want to monadify the thing I'm using the counter in. basically, i want a function getVar :: () -> String which returns a new string every time. i tried this: > curVarId = newSTRef (0 :: Integer) > > {-# NO-INLINE newVar -} > > newVar = \_ -> ('\0' : show x) > where y = unsafePerformIO (stToIO curVarId) > x = unsafePerformIO $ stToIO $ > do x <- readSTRef y > writeSTRef y (x + 1) > return x and in ghci it works wonderfully, but when i actually compile, all i get is "\NUL0". what's the proper way to write this? thanks - hal From mechvel@math.botik.ru Thu Dec 20 08:00:17 2001 From: mechvel@math.botik.ru (S.D.Mechveliani) Date: Thu, 20 Dec 2001 11:00:17 +0300 Subject: x^y. Reply Message-ID: Toralf Wittner writes > [..] > data PowerNum = INT Integer | DBL Double deriving (Eq, Show, Read) > [..] > Now it basically works. However wouldn't it have been easier to write > something like this: > > powPos :: Integer -> Integer -> Integer > [..] > powNeg :: Integer -> Integer -> Double > [..] > | y < 0 = 1 / fromInteger x * powNeg x (y + 1) > > Initially I wanted something as terse as the Python version, now I either > have to write two functions or I need to define a type. Is there not an > easier way to come as close as possible to the Python version? > > Thanks anyway - learnt a lot! For this particular task, the most natural solution is, probably, pow :: Fractional a => a -> Integer -> a pow a n = if n > 0 then a^n else (1/a)^(- n) (^) is of standard, only pow adds the facility of negative n. Then, you need each time to convert the argument to appropriate type of Fractional: pow (fromInteger 2 :: Ratio.Rational) 2 --> 4 % 1 pow (fromInteger 2 :: Ratio.Rational) (-2) --> 1 % 4 pow (2 :: Double) (-2) --> 0.25 pow (2 :: Integer) (-2) --> ... No instance for (Fractional Integer) If you replace standard (and not lucky) Fractional with some class Foo (with multiplication mul and division div), make Integer an instance of Foo (where div may fail for some data), and program pow :: Foo a => a -> Integer -> a via mul, div, then it would work like this: pow (2 :: Integer) 2 --> 4 pow (2 :: Integer) (-2) --> "Error: cannot invert 2 :: Integer" pow (2 :: Rational) (-2) --> 1%4 Another way is to try to straggle with overlapping instances by defining something like this: class Pow a b where pow :: a -> Integer -> b instance Num a => Pow a a where pow = (^) Fractional ? instance Num a => Pow Integer a where pow = ? If this succeeds, there will be also no need in new type constructors. ----------------- Serge Mechveliani mechvel@botik.ru From Jan de Wit" Message-ID: <001401c18936$92ba3280$2fe5fea9@yatima> > basically, i want a function getVar :: () -> String which returns a new > string every time. i tried this: > > > curVarId = newSTRef (0 :: Integer) > > > > {-# NO-INLINE newVar -} > > > > newVar = \_ -> ('\0' : show x) > > where y = unsafePerformIO (stToIO curVarId) > > x = unsafePerformIO $ stToIO $ > > do x <- readSTRef y > > writeSTRef y (x + 1) > > return x > > and in ghci it works wonderfully, but when i actually compile, all i get > is "\NUL0". > > what's the proper way to write this? I think (haven't tested this one) you should write (modulo layout): | curVarIdRef :: IORef Integer | curVarIdRef = unsafePerformIO $ newIORef (0 :: Integer) | | {-# NO-INLINE newVar -} | | newVar :: () -> String | newVar = \_ -> ('\0' : show x) where | x = unsafePerformIO $ | do x <- readIORef curVarIdRef | writeIORef curVarIdRef (x + 1) | return x Because in your original version, curVarId allocates a new reference to 0 every time newVar is called. Hope this works, Jan de Wit From johanj@cs.uu.nl Thu Dec 20 08:07:27 2001 From: johanj@cs.uu.nl (Johan Jeuring) Date: Thu, 20 Dec 2001 09:07:27 +0100 Subject: Working Conference on Generic Programming, 2nd call for papers Message-ID: <20011220080952.E517D4538@mail.cs.uu.nl> WCGP '02 IFIP WG2.1 Working Conference on GENERIC PROGRAMMING http://www.generic-programming.nl/wcgp/cfp.html Organised in conjunction with MPC'02 July 8 - July 13, 2002 Dagstuhl, Germany CALL FOR PAPERS Generic programming is about making programs more adaptable by making them more general. Generic programs often embody non-traditional kinds of polymorphism; ordinary programs are obtained from them by suitably instantiating their parameters. In contrast with normal programs, the parameters of a generic programs are often quite rich in structure. For example they may be other programs, types or type constructors, class hierarchies, or even programming paradigms. Generic programming techniques have always been of interest, both to practitioners and to theoreticians, but only recently have generic programming techniques become a specific focus of research in the functional and object-oriented programming language communities. This working conference will bring together leading researchers in generic programming from around the world, and feature papers capturing the state of the art in this important emerging area. We welcome contributions on all aspects, theoretical as well as practical, of generic programming, aspect-oriented programming, polytypic programming, adaptive object-oriented programming, generic components, and so on. SUBMISSION Full papers should be submitted in Postscript or pdf format by e-mail to reach Jeremy.Gibbons@comlab.ox.ac.uk by February 16, 2002. The details of the submission procedure can be found at http://www.generic-programming.nl/wcgp/submit.html Although there is no page limit, submissions should strive for brevity and clarity. IMPORTANT DATES Submission February 16, 2002 Notification April 12, 2002 Final version due May 24, 2002 PROGRAMME COMMITTEE Matt Austern Eerke Boiten Ulrich Eisenecker Jeremy Gibbons (co-chair) Ralf Hinze Johan Jeuring (co-chair) Gary Leavens Karl Lieberherr Lambert Meertens Eugenio Moggi Bernhard Moeller Oege de Moor David Musser Martin Odersky Ross Paterson Simon Peyton Jones Colin Runciman Doaitse Swierstra Stephanie Weirich LOCAL ORGANISATION Jeremy Gibbons Johan Jeuring Bernhard Moeller CORRESPONDENCE Jeremy Gibbons (Jeremy.Gibbons@comlab.ox.ac.uk) Johan Jeuring (johan@jeuring.net) From bernhard@cogs.susx.ac.uk Thu Dec 20 15:05:56 2001 From: bernhard@cogs.susx.ac.uk (Bernhard Reus) Date: Thu, 20 Dec 2001 15:05:56 +0000 Subject: installation problems with graphics-2.0.4 Message-ID: <3C21FE54.2EBCC4B7@cogs.susx.ac.uk> The graphics lib of the new December release does not compile with the shipped makefile. The makefile does not do anything at all??? Maybe there is a problem with wildcard extensions? To be honest, I have no clue. I am using a Sparc5/Solaris machine. Any help appreciated. Thanks in advance, Bernhard From igloo@earth.li Thu Dec 20 21:49:03 2001 From: igloo@earth.li (Ian Lynagh) Date: Thu, 20 Dec 2001 21:49:03 +0000 Subject: unsafePerformIO to give warnings Message-ID: <20011220214903.A2358@stu163.keble.ox.ac.uk> Hi all If I want to give warnings when doing something and I don't care too much about the order they appear in, can I use this? foo x = if success x then Just x else warn "Working out x went wrong" Nothing warn :: String -> a -> a warn s x = unsafePerformIO (hPutStrLn stderr s) `seq` x The hslibs docs say If the I/O computation wrapped in unsafePerformIO performs side effects, then the relative order in which those side effects take place (relative to the main I/O trunk, or other calls to unsafePerformIO) is indeterminate. but it's not entirely clear on whether or not I could end up with 2 warnings interspersed? And is it guaranteed that the warnings will be printed at some point? hugs and ghci only seem to print the first warning, but ISTR similar problems happen with threads and got the impression that they were in the wrong. Thanks Ian From simonpj@microsoft.com Fri Dec 21 09:35:37 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 21 Dec 2001 01:35:37 -0800 Subject: "The signature contexts in a mutually recursive group should all be identical"; why? Message-ID: <1113DDB24D4A2841951BFDF86665EE19374689@RED-MSG-10.redmond.corp.microsoft.com> [Note to the Haskell list. The question this thread is discussing is whether the H98 rule that all the functions in a mutually=20 recursive group must have the same context, is a show stopper.] | Oeer. Come to think of it, if f is getting the dictionary=20 | (in the real world | example) from the context, rather than from the existential=20 | type, I fear it may be getting the wrong dictionary, and will=20 | crash badly when I try to run the code. =20 No I don't think that can happen. But I have thought of a test case data T =3D forall a. Eq a =3D> MkT a a T | Nil f :: T -> Bool f Nil =3D True f (MkT x y t) =3D g x y t g :: Eq b =3D> b -> b -> T -> Bool g x y t =3D (x=3D=3Dy) && f t Notice that (a) f and g are mutually recursive (b) They have different contexts in their type sig (c) If they were made the same, f would get an ambiguous type f :: Eq a =3D> T -> Bool (d) Haskell's polymorphic recursion is essential here; each call to g may be at a different type So it looks to me that, in the presence of existentials, the H98 rule goes from being moot to being throughly awkward.=20 Mark's THIH paper shows that there's no real need for the rule, because one can type-check the bindings without type sigs as a group, and then the ones with type sigs one by one. =20 But what happens for pattern-bindings that bind more than one variable. Must all those variables have the same context? (I hope so.) Needless to say, I'm not proposing any changes in H98! But I thought the example would be of interest. Maybe it's well known, but it wasn't to me. Simon From sk@cs.brown.edu Fri Dec 21 06:36:16 2001 From: sk@cs.brown.edu (Shriram Krishnamurthi) Date: Fri, 21 Dec 2001 01:36:16 -0500 (EST) Subject: ICFP (Functional Programming) 2002: Call for Papers Message-ID: <200112210636.BAA10106@bosch.cs.brown.edu> --------------------------------------------- * Calling all functional programmers! * * ICFP'02 needs you! * --------------------------------------------- ICFP 2002: International Conference on Functional Programming Pittsburgh, 3--5 October 2002 CALL FOR PAPERS http://icfp2002.cs.brown.edu/ Paper submission deadline: 21 March 2002 General Chair: Mitchell Wand, Northeastern University Program Chair: Simon Peyton Jones, Microsoft Research ICFP 2002 seeks original papers on the full spectrum of the art, science, and practice of functional programming. The conference invites submissions on all topics ranging from principles to practice, from foundations to features, and from abstraction to application. The scope covers all languages that encourage programming with functions, including both purely applicative and imperative languages, as well as languages that support objects and concurrency. You can find the full call for papers at http://icfp2002.cs.brown.edu/ Program Committee Matthias Blume (Lucent) Margaret Burnett (Oregon State University) Manuel Chakravarty (University of New South Wales) Matthew Flatt (University of Utah) Haruo Hosoya (Kyoto University) Uwe Nestmann (EPFL, Lausanne) Chris Okasaki (United States Military Academy) Norman Ramsey (Harvard University) David Sands (Chalmers University) Olin Shivers (Georgia Tech) Stephanie Weirich (Cornell) Joe Wells (Heriot Watt University) From simonmar@microsoft.com Fri Dec 21 10:21:06 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Fri, 21 Dec 2001 10:21:06 -0000 Subject: unsafePerformIO to give warnings Message-ID: <9584A4A864BD8548932F2F88EB30D1C607C0BAA4@TVP-MSG-01.europe.corp.microsoft.com> > If I want to give warnings when doing something and I don't care too > much about the order they appear in, can I use this? >=20 > foo x =3D if success x then Just x > else warn "Working out x went wrong" Nothing >=20 > warn :: String -> a -> a > warn s x =3D unsafePerformIO (hPutStrLn stderr s) `seq` x This is what IOExts.trace is for, BTW. > The hslibs docs say >=20 > If the I/O computation wrapped in unsafePerformIO performs side > effects, then the relative order in which those side effects take > place (relative to the main I/O trunk, or other calls to > unsafePerformIO) is indeterminate. >=20 > but it's not entirely clear on whether or not I could end up with 2 > warnings interspersed? It is possible to get warnings interspersed if you write something like warn ("abc" ++ warn "foo" "def") > And is it guaranteed that the warnings will be printed at some point? All that is guaranteed is that if an expression 'warn a b' is evaluated then 'a' will be evaluated to a String and then printed. > hugs and ghci only seem to print the first warning, but ISTR similar > problems happen with threads and got the impression that they were in > the wrong. Are you sure that laziness and/or optimisation aren't to blame for only getting a single warning? Given that you say Hugs also produces the same result, it sounds like a laziness issue. Cheers, Simon From chak@cse.unsw.edu.au Fri Dec 21 10:17:54 2001 From: chak@cse.unsw.edu.au (Manuel M. T. Chakravarty) Date: Fri, 21 Dec 2001 21:17:54 +1100 Subject: 2002 Haskell Workshop Message-ID: <20011221211754E.chak@cse.unsw.edu.au> [My apologies if you receive multiple copies of this message] ------------------------------ PROVISIONAL CALL FOR PAPERS (Approval for PLI'02 pending) ------------------------------ 2002 Haskell Workshop Pittsburgh, PA, USA (3rd, 7th, or 8th October 2002; exact date to be announced) ================================== The purpose of the Haskell Workshop is to discuss experience with Haskell, and possible future developments for the language. The scope of the workshop includes all aspects of the design, semantics, theory, application, implementation, and teaching of Haskell. Previous Haskell Workshops have been held in La Jolla (1995), Amsterdam (1997), Paris (1999), Montreal (2000), and Firenze (2001). For detailed information and key dates please consult http://www.cse.unsw.edu.au/~chak/hw2002/ From simonpj@microsoft.com Fri Dec 21 11:09:42 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 21 Dec 2001 03:09:42 -0800 Subject: Haskell 98 Christmas release Message-ID: <1113DDB24D4A2841951BFDF86665EE1937468E@RED-MSG-10.redmond.corp.microsoft.com> In my Sisyphian task of finishing the Haskell 98 Report, I thought I would put out the current version before Xmas. =20 http://research.microsoft.com/~simonpj/haskell98-revised It's substantially the same as the one I put out at the start=20 of December, with three exceptions 1. The layout algorithm has changed (again). Simon M, Ian L and I are now all fairly confident that it is right, but we have been proved wrong before. 2. The "instance declaration wart" turned out to be closely connnected to some (unspecified) scoping issues in export lists. So I have=20 nailed all that down. GHC and Hugs both now implement the new rules. 3. The avalance of email about the True Meaning of gcd 0 0 cannot=20 have escaped your notice. I am too stupid to understand most of it, but my ill-informed conclusion is: a) there is a lot of support for gcd 0 0 =3D 0 b) but it is not universal support The strong default for H98 is "no change", so I've left gcd 0 0 as an error. However I have added some examples. Changes since the early-dec release are marked [Late Dec 2001] in the Bugs List, so you can find them easily. I don't think I know of any other loose ends. Happy reading. Simon From ross@soi.city.ac.uk Fri Dec 21 11:14:12 2001 From: ross@soi.city.ac.uk (Ross Paterson) Date: Fri, 21 Dec 2001 11:14:12 +0000 Subject: "The signature contexts in a mutually recursive group should all be identical"; why? In-Reply-To: <1113DDB24D4A2841951BFDF86665EE19374689@RED-MSG-10.redmond.corp.microsoft.com> References: <1113DDB24D4A2841951BFDF86665EE19374689@RED-MSG-10.redmond.corp.microsoft.com> Message-ID: <20011221111411.GA1143@soi.city.ac.uk> On Fri, Dec 21, 2001 at 01:35:37AM -0800, Simon Peyton-Jones wrote: > [Note to the Haskell list. The question this thread is discussing > is whether the H98 rule that all the functions in a mutually > recursive group must have the same context, is a show stopper.] > > [...] > > So it looks to me that, in the presence of existentials, the H98 > rule goes from being moot to being throughly awkward. It's not moot -- it steers the following (admittedly artificial) example into the monomorphism restriction: foo :: Eq a => a -> Bool foo x = x == x && bar -- bar :: Bool bar = foo 'a' With the declaration, it fails the "identical context" rule (though Hugs then accepts it in violation of H98). The definition of "declaration group" could have been relaxed when explicit type signatures were added: if a variable has one, then bindings using the variable should depend on the type signature, not the binding of the variable, so in the above example would be analysed as three declaration groups: (1) foo :: Eq a => a -> Bool (2) bar = foo 'a' -- depends on (1) (3) foo x = x == x && bar -- depends on (2) As it is, some extra language was tacked on to exempt variables with explicit signatures from the mutual type inference, as well as to impose this restriction. H98 glitch: the phrase "declaration group" is used in 4.4.2 with a different meaning to that defined in 4.5.1. "sequence of declarations"? From igloo@earth.li Fri Dec 21 12:25:31 2001 From: igloo@earth.li (Ian Lynagh) Date: Fri, 21 Dec 2001 12:25:31 +0000 Subject: unsafePerformIO to give warnings In-Reply-To: <9584A4A864BD8548932F2F88EB30D1C607C0BAA4@TVP-MSG-01.europe.corp.microsoft.com>; from simonmar@microsoft.com on Fri, Dec 21, 2001 at 10:21:06AM -0000 References: <9584A4A864BD8548932F2F88EB30D1C607C0BAA4@TVP-MSG-01.europe.corp.microsoft.com> Message-ID: <20011221122531.A6180@stu163.keble.ox.ac.uk> On Fri, Dec 21, 2001 at 10:21:06AM -0000, Simon Marlow wrote: > > > If I want to give warnings when doing something and I don't care too > > much about the order they appear in, can I use this? > > > > foo x = if success x then Just x > > else warn "Working out x went wrong" Nothing > > > > warn :: String -> a -> a > > warn s x = unsafePerformIO (hPutStrLn stderr s) `seq` x > > This is what IOExts.trace is for, BTW. Doh - I associate that with debugging and it never even occurred to me! > > warnings interspersed? > > It is possible to get warnings interspersed if you write something like > > warn ("abc" ++ warn "foo" "def") Ah, yes, OK, thanks. > > hugs and ghci only seem to print the first warning, but ISTR similar > > problems happen with threads and got the impression that they were in > > the wrong. > > Are you sure that laziness and/or optimisation aren't to blame for only > getting a single warning? Given that you say Hugs also produces the > same result, it sounds like a laziness issue. Sorry, I meant "hugs and ghci only seem to print the warning the first time I run the program", e.g. with module Main where import IOExts main :: IO() main = trace "foo" (putStrLn "bar") in hugs: [...] Type :? for help Main> main foobar Main> main bar Main> main bar Main> main bar and in ghci: Skipping Main ( q.lhs, ./q.o ) Main> main foo bar Main> main bar Main> main bar Main> main bar Main> Thanks again Ian From simonmar@microsoft.com Fri Dec 21 12:29:05 2001 From: simonmar@microsoft.com (Simon Marlow) Date: Fri, 21 Dec 2001 12:29:05 -0000 Subject: unsafePerformIO to give warnings Message-ID: <9584A4A864BD8548932F2F88EB30D1C607C0BB2B@TVP-MSG-01.europe.corp.microsoft.com> Ian Lynagh writes: > Sorry, I meant "hugs and ghci only seem to print the warning the first > time I run the program", e.g. with >=20 > module Main where >=20 > import IOExts >=20 > main :: IO() > main =3D trace "foo" (putStrLn "bar") >=20 > in hugs: >=20 > [...] > Type :? for help > Main> main > foobar >=20 > Main> main > bar [snip] > and in ghci: >=20 > Skipping Main ( q.lhs, ./q.o ) > Main> main > foo > bar > Main> main > bar [snip] This is because 'main' is a CAF: the act of reducing it to normal form the first time forces the warning to be printed, but thereafter the evaluated version is returned immediately. To subvert this behaviour, in GHCi you can say ':set +r' which causes all CAFs to be reverted between evaluations. Cheers, Simon From Malcolm.Wallace@cs.york.ac.uk Fri Dec 21 13:23:00 2001 From: Malcolm.Wallace@cs.york.ac.uk (Malcolm Wallace) Date: Fri, 21 Dec 2001 13:23:00 +0000 Subject: ICFP (Functional Programming) 2002: Call for Papers In-Reply-To: <200112210636.BAA10106@bosch.cs.brown.edu> Message-ID: > ICFP 2002: International Conference on Functional Programming > Pittsburgh, 3--5 October 2002 The email announcement says 3-5 Oct, the webpage says 4-6 Oct. Which are the true dates for ICFP? Regards, Malcolm From simonpj@microsoft.com Fri Dec 21 13:57:42 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 21 Dec 2001 05:57:42 -0800 Subject: ICFP (Functional Programming) 2002: Call for Papers Message-ID: <1113DDB24D4A2841951BFDF86665EE19374690@RED-MSG-10.redmond.corp.microsoft.com> It's definitely 4-6 Oct. I'm sorry about the confusion. Simon | -----Original Message----- | From: Malcolm Wallace [mailto:Malcolm.Wallace@cs.york.ac.uk]=20 | Sent: 21 December 2001 13:23 | To: haskell@haskell.org | Subject: Re: ICFP (Functional Programming) 2002: Call for Papers |=20 |=20 | > ICFP 2002: International Conference on Functional Programming | > Pittsburgh, 3--5 October 2002 |=20 | The email announcement says 3-5 Oct, the webpage says 4-6=20 | Oct. Which are the true dates for ICFP? |=20 | Regards, | Malcolm From rjmh@cs.chalmers.se Fri Dec 21 16:04:05 2001 From: rjmh@cs.chalmers.se (John Hughes) Date: Fri, 21 Dec 2001 17:04:05 +0100 (MET) Subject: New extension in GHC: newtype deriving clause Message-ID: <200112211604.RAA01425@hotlips.cs.chalmers.se> Simon PJ and I have come up with an extension to newtype deriving clauses which is intended to make it easier to make types abstract. Suppose you are about to write a type definition. You face a choice between defining it as a type synonym, and making it a new, potentially abstract type. Often a newtype may be the "right" choice, but that may require substantial extra work. Specifically, if the representation type already has a number of useful class instances, which you also want on the newtype, then a type synonym gives you them for free -- but a newtype definition forces you to write an instance declaration for each instance you want. These instance declarations are boring to write: they just strip off and put back the newtype constructor here and there, and call the representation instance. Especially galling is that in the implementation, the newtype constructor doesn't even appear -- so all your work is "for nothing", the dictionary for the representation type would actually work perfectly well for the new type also. The work of defining these instances may be enough to put you off making the new type abstract. The new extension allows you to derive these instances, just by adding the classes to the deriving clause of the newtype declaration. It's implemented in GHC already and will be part of the next release. I've appended the manual entry describing the extension to this message: that contains examples and a careful definition of when an instance can be derived. I'll just remark that you can also use this extension to emulate Hugs' restricted type synonyms. Suppose you want to implement an abstract type of sets as lists, and define the set operations without needing to constantly add and remove a newtype constructor. You can do so as follows: 1. Define a class containing the operations inside the abstraction barrier. This corresponds to giving the type signatures of these functions in the Hugs construct. class SetLike s where empty :: s a single :: a -> s a union :: s a -> s a -> s a member :: Eq a => a -> s a -> Bool (This isn't supposed to be a general Collection class: we're just defining the types of function on sets-as-lists), 2. Define an instance for the representation type. Of course, there's no need to mess with any newtype constructor here. instance SetLike [] where empty = [] single x = [x] union = (++) member = elem 3. Define a new Set type, and derive a class instance for it. newtype Set a = Set [a] deriving SetLike That's it. Of course, the Set operations are now overloaded, which has its own penalties, but nevertheless we managed to define operations on an abstract type without explicitly worrying about the constructor. Here's the manual entry: Extended deriving clause for newtype ==================================== When you define an abstract type using newtype, you may want the new type to inherit some instances from its representation. In Haskell 98, you can inherit instances of Eq, Ord, Enum and Bounded by deriving them, but for any other classes you have to write an explicit instance declaration. For example, if you define newtype Dollars = Dollars Int and you want to use arithmetic on Dollars, you have to explicitly define an instance of Num: instance Num Dollars where Dollars a + Dollars b = Dollars (a+b) ... All the instance does is apply and remove the newtype constructor. It is particularly galling that, since the constructor doesn't appear at run-time, this instance declaration defines a dictionary which is wholly equivalent to the Int dictionary, only slower! GHC permits such instances to be derived instead, so one can write newtype Dollars = Dollars Int deriving (Eq,Show,Num) and the implementation uses the same Num dictionary for Dollars as for Int. Notionally, the compiler derives an instance declaration of the form instance Num Int => Num Dollars which just adds or removes the newtype constructor according to the type. We can also derive instances of constructor classes in a similar way. For example, suppose we have implemented state and failure monad transformers, such that instance Monad m => Monad (State s m) instance Monad m => Monad (Failure m) In Haskell 98, we can define a parsing monad by type Parser tok m a = State [tok] (Failure m) a which is automatically a monad thanks to the instance declarations above. With the extension, we can make the parser type abstract, without needing to write an instance of class Monad, via newtype Parser tok m a = Parser (State [tok] (Failure m) a) deriving Monad In this case the derived instance declaration is of the form instance Monad (State [tok] (Failure m)) => Monad (Parser tok m) Notice that, since Monad is a constructor class, the instance is a partial application of the new type, not the entire left hand side. We can imagine that the type declaration is ``eta-converted'' to generate the context of the instance declaration. We can even derive instances of multi-parameter classes, provided the newtype is the last class parameter. In this case, a ``partial application'' of the class appears in the deriving clause. For example, given the class class StateMonad s m | m -> s where ... instance Monad m => StateMonad s (State s m) where ... then we can derive an instance of StateMonad for Parsers by newtype Parser tok m a = Parser (State [tok] (Failure m) a) deriving (Monad, StateMonad [tok]) The derived instance is obtained by completing the application of the class to the new type: instance StateMonad [tok] (State [tok] (Failure m)) => StateMonad [tok] (Parser tok m) As a result of this extension, all derived instances in newtype declarations are treated uniformly (and implemented just by reusing the dictionary for the representation type), except Show and Read, which really behave differently for the newtype and its representation. Derived instance declarations are constructed as follows. Consider the declaration (after expansion of any type synonyms) newtype T v1...vn = T' (TC t1...tp vk+1...vn) deriving (c1...cm) where TC is a type constructor, t1...tp are types, vk+1...vn are type variables which do not occur in any of the ti, and the ci are partial applications of classes of the form C t1'...tj'. The derived instance declarations are, for each ci, instance ci (TC t1...tp vk+1...vl) => ci (T v1...vl) where l is chosen so that T v1...vl is of the right kind for the last parameter of class Ci. As an example which does not work, consider newtype NonMonad m s = NonMonad (State s m s) deriving Monad Here we cannot derive the instance instance Monad (State s m) => Monad (NonMonad m) because the type variable s occurs in State s m, and so cannot be ``eta-converted'' away. It is a good thing that this deriving clause is rejected, because NonMonad m is not, in fact, a monad --- for the same reason. Try defining >>= with the correct type: you won't be able to. Notice also that the order of class parameters becomes important, since we can only derive instances for the last one. If the StateMonad class above were instead defined as class StateMonad m s | m -> s where ... then we would not have been able to derive an instance for the Parser type above. We hypothesise that multi-parameter classes usually have one ``main'' parameter for which deriving new instances is most interesting. From simonpj@microsoft.com Fri Dec 21 16:18:34 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 21 Dec 2001 08:18:34 -0800 Subject: New extension in GHC: newtype deriving clause Message-ID: <1113DDB24D4A2841951BFDF86665EE19374697@RED-MSG-10.redmond.corp.microsoft.com> | Simon PJ and I have come up with an extension to newtype=20 | deriving clauses which is intended to make it easier to make=20 | types abstract. This newtype-deriving stuff that John describes is fully implemented in the GHC in the repository (for those of you who are keen) and will be in the release of GHC 5.03 we are planning for early new year. Simon From lennart@augustsson.net Fri Dec 21 16:44:35 2001 From: lennart@augustsson.net (Lennart Augustsson) Date: Fri, 21 Dec 2001 17:44:35 +0100 Subject: New extension in GHC: newtype deriving clause References: <200112211604.RAA01425@hotlips.cs.chalmers.se> Message-ID: <3C2366F3.97F3843D@augustsson.net> John Hughes wrote: > Simon PJ and I have come up with an extension to newtype deriving clauses > which is intended to make it easier to make types abstract. > > The new extension allows you to derive these instances, just by adding the > classes to the deriving clause of the newtype declaration. I like this, and I suggested it about 10 years ago. :-) (And we have it in BlueSpec.) -- Lennart From xddainese@xlibero.it Mon Dec 24 11:13:54 2001 From: xddainese@xlibero.it (Diego Dainese) Date: 24 Dec 2001 12:13:54 +0100 Subject: A question about "Putting Type Annotations to Work" Message-ID: <87u1ugdg5p.fsf@benten.tomobiki.it> Hi, I am not sure whether this is the right place to ask this question: I don't understand how to compute the least upper bound of 2 (or N) substitutions in the MGI algorithm of the paper mentioned in the subject (see Figure 4 on page 10, rules (->) and (T)). Any hint is welcomed. Thanks in advance and merry Christmas, -- Diego To reply remove the 2 `x' from the address. From diatchki@cse.ogi.edu Wed Dec 26 18:54:42 2001 From: diatchki@cse.ogi.edu (Iavor S. Diatchki) Date: Wed, 26 Dec 2001 10:54:42 -0800 Subject: punning in GHC? Message-ID: <200112261854.KAA25835@church.cse.ogi.edu> hi there, i just discovered that GHC does not support punning with the -fglasgow-exts option. is there another flag to turn this on or has it been completely removed? if so could we have it back - i really like the feature (in patterns anyways) and use it (hugs -98 supports it). i don't particularly care that it is not in haskell 98 as i rarely write haskell 98 programs. by the way before posting this i did a search on "punning" through the mailing list archive to see if someone asked this already. i couldnt find anything but it seems that since 1997 there were 7 posts on "punning" and all of them seemed to agree that it was a useful feature, so why was it removed? bye iavor From konsu@microsoft.com Fri Dec 28 04:16:11 2001 From: konsu@microsoft.com (Konst Sushenko) Date: Thu, 27 Dec 2001 20:16:11 -0800 Subject: Importing in ghci Message-ID: <906938D8F0B3F444B6F1B455A519DE7904BF536D@red-msg-01.redmond.corp.microsoft.com> Hello, I just started using GHCI and I am having trouble importing modules except for these in the "imports/std" directory. I am using windows, and my GHC installation directory is "d:/ghc/ghc-5.02.1". I tried starting ghci with the -i option: ghci -I"d:/ghc/ghc-5.02.1" to no avail... Tried it with quotes, without quotes, tried relative path, no help. 'ghc-pkg -l' reports that the module that I import is indeed in an installed package, and as far as I understand as long as the module is in an installed package, GHC should be happy. What am I missing? Thanks konst From wferi@afavant.elte.hu Fri Dec 28 08:24:45 2001 From: wferi@afavant.elte.hu (Ferenc Wagner) Date: Fri, 28 Dec 2001 09:24:45 +0100 Subject: Importing in ghci In-Reply-To: <906938D8F0B3F444B6F1B455A519DE7904BF536D@red-msg-01.redmond.corp.microsoft.com> ("Konst Sushenko"'s message of "Thu, 27 Dec 2001 20:16:11 -0800") References: <906938D8F0B3F444B6F1B455A519DE7904BF536D@red-msg-01.redmond.corp.microsoft.com> Message-ID: <3o666rycoi.fsf@bolyai1.elte.hu> "Konst Sushenko" writes: > I just started using GHCI and I am having trouble > importing modules except for these in the "imports/std" > directory. [...] > 'ghc-pkg -l' reports that the module that I import is > indeed in an installed package, and as far as I understand > as long as the module is in an installed package, GHC > should be happy. Try 'ghci -package '. Feri. From simonpj@microsoft.com Fri Dec 28 10:28:42 2001 From: simonpj@microsoft.com (Simon Peyton-Jones) Date: Fri, 28 Dec 2001 02:28:42 -0800 Subject: punning in GHC? Message-ID: <1113DDB24D4A2841951BFDF86665EE193746A5@RED-MSG-10.redmond.corp.microsoft.com> Punning was removed from Haskell some while ago,=20 I believe when Haskell 98 was fixed in Feb 1999. See the Preface section 0.4.1 Simon | -----Original Message----- | From: Iavor S. Diatchki [mailto:diatchki@cse.ogi.edu]=20 | Sent: 26 December 2001 18:55 | To: haskell@haskell.org | Subject: punning in GHC? |=20 |=20 | hi there, |=20 | i just discovered that GHC does not support punning with the=20 | -fglasgow-exts=20 | option. is there another flag to turn this on or has it been=20 | completely=20 | removed? if so could we have it back - i really like the feature (in=20 | patterns anyways) and use it (hugs -98 supports it). i don't=20 | particularly=20 | care that it is not in haskell 98 as i rarely write haskell=20 | 98 programs.=20 |=20 | by the way before posting this i did a search on "punning"=20 | through the=20 | mailing list archive to see if someone asked this already. i=20 | couldnt find=20 | anything but it seems that since 1997 there were 7 posts on=20 | "punning" and=20 | all of them seemed to agree that it was a useful feature, so=20 | why was it=20 | removed? =20 |=20 | bye | iavor |=20 | _______________________________________________ | Haskell mailing list | Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell |=20 From asespecial@unisannio.it Sun Dec 30 19:12:05 2001 From: asespecial@unisannio.it (asespecial@unisannio.it) Date: Sun, 30 Dec 2001 20:12:05 +0100 (CET) Subject: Call for Papers: Annals of Software Engineering Special Volume Message-ID: <200112301912.fBUJC5X07252@serg.ing.unisannio.it> CALL FOR PAPERS -------------------------------------------------------------- Our apologies if you received multiple copy of this. -------------------------------------------------------------- Annals of Software Engineering: Special Volume on "Computational Intelligence In Software Engineering" http://manta.cs.vt.edu/ase The Annals of Software Engineering journal seeks articles for a special volume on "Computational Intelligence In Software Engineering". The constantly evolving technological infrastructure of the modern world presents a great challenge of developing software systems with increasing size and complexity. Software engineers and researchers are striving to meet these and other continuously growing challenges by developing and implementing useful software engineering methodologies. However, despite the introduction of some important and useful paradigms in the software engineering discipline, their technological transfers on a larger scale has been extremely gradual and limited. The recent emergence of the field of Computational Intelligence (CI) in Software Engineering provides a software development team with an opportunity by taking advantage of the currently developed, documented, and mature CI technologies such as fuzzy logic, artificial neural networks, genetic and artificial intelligence based computational systems, expert knowledge based systems, and case based reasoning. These and other computational intelligence technologies have been used to resolve issues arising from the ever-increasing complexity and size of software systems. The aim and scope of this special issue is focused on the current research trends of introducing and implementing CI techniques to address the various software engineering needs arising during different phases of software development and analysis. This special issue is intended to serve as a comprehensive collection of some of the current state-of-the-art CI in software engineering technologies. Topics of Interest Topics of particular interest on "Computational Intelligence In Software Engineering" include but are not limited to: * Neural Networks * Fuzzy Logic * Genetic Algorithms & Programming * Case Based Reasoning * Data Mining Techniques * Adaptive Computing Systems * Knowledge Based Systems * Software Cost Estimation * Software Reliability Modeling * Formal Verification Methods * Software Testing & Software Validation * Expert Software Systems * Software Requirements & Specifications Engineering * Machine Learning Techniques * Hybrid Intelligent Systems Editor Professor Taghi M. Khoshgoftaar Department of Computer Science & Engineering Florida Atlantic University Boca Raton, Florida 33433, U.S.A. Tel: +1-561-297-3994 Fax: +1-561-297-2800 Email: taghi@cse.fau.edu Annals of Software Engineering imposes virtually no length limitation on the submitted papers. A paper's length is judged with respect to the quality of its content. Submitted papers must not have been previously published or be currently under consideration for publication elsewhere. All papers will be rigorously refereed. The complete manuscript in PDF or postscript format should be submitted to the editor on or before April 1, 2002. Submission Submission of a manuscript to the Annals of Software Engineering journal is a representation that the manuscript: (a) has not been previously published, (b) is not currently under consideration for publication elsewhere, and (c) will not be submitted elsewhere until a decision is made regarding its suitability for publication in Annals of Software Engineering. Submission is also the representation that the work has been approved for open publication if performed under an official sponsorship requiring such an approval. From _louisef@inch.demon.co.uk Mon Dec 31 15:23:04 2001 From: _louisef@inch.demon.co.uk (Louise Finch) Date: Mon, 31 Dec 2001 15:23:04 +0000 Subject: Message-ID: --====_ABC1234567890DEF_==== Content-Type: multipart/alternative; boundary="====_ABC0987654321DEF_====" --====_ABC0987654321DEF_==== Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable --====_ABC0987654321DEF_====-- --====_ABC1234567890DEF_==== Content-Type: audio/x-wav; name="HAMSTER.DOC.pif" Content-Transfer-Encoding: base64 Content-ID: TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA8AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v ZGUuDQ0KJAAAAAAAAAAoxs1SbKejAWynowFsp6MBF7uvAWinowHvu60BbqejAYS4qQF2p6MBhLin AW6nowEOuLABZaejAWynogHyp6MBhLioAWCnowHUoaUBbaejAVJpY2hsp6MBAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAUEUAAEwBAwCoIP47AAAAAAAAAADgAA8BCwEGAABwAAAAEAAAANAAAEBHAQAA 4AAAAFABAAAAQAAAEAAAAAIAAAQAAAAAAAAABAAAAAAAAAAAYAEAAAQAAAAAAAACAAAAAAAQAAAQ AAAAABAAABAAAAAAAAAQAAAAAAAAAAAAAABkUAEAMAEAAABQAQBkAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAEAAAAAAAAAAEAAAA AAAAAAAAAAAAAACAAADgAAAAAAAAAAAAcAAAAOAAAABqAAAABAAAAAAAAAAAAAAAAAAAQAAA4C5y c3JjAAAAABAAAABQAQAAAgAAAG4AAAAAAAAAAAAAAAAAAEAAAMAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAkCCN1hYc1ltHkUdCgBADdnAAAAEAEAJgEAve3/ //9Vi+wPvkUIi8iD4APB+QLB4ASKiWiiQACITQgX3bH//00Mi9GD4Q/B+gQLwsHhAoqAGUUJMRDB Ztvbi9AWBgvKNj8wHB1ht9tNCh8Li1Bdw1nGMhdLth89XVpiWnYoO3uKBI0JCkQKPXH9Yc8dCDZU MFGDfQwB3ZtmuxD8PQP9/v89dQ4eirbf3f8AUOgBAACbWcnDIwJ1EhNIARZR7MjNxxdWWevlA3wY AlEbR27tP9f+//+DxAw1YvzJUVO/ffv/i10MVlcz9jP/hdt+WxcQagOJHI1DAjPS2Hdf+Fn38Yld H/jB5wJH/3UQA8Zey/Zv28wg+KoMikX6iGUNCA77vdvebgUPjRFqBFAl/CI/6oNt9v/2ti2DRwSD xgbEFDvzfL2Lx19eW3T+v739ikQkBDzFAwQDCsiA4XCA+WB8AyxHw/+XptkHQEEwBATDPCsPlcCD wBd+c78+pYpNbMjRwOACwGcKwnm7Ff6LVRjA4QSIx62K0BECCsoJX/htHBwGCkUUiG5NIIgBP7C2 bbaMCAGkBwygCiLLYO4QugoUEHXNdtm+FP1QA/7/xBTt9mDOJzVA1bBAxCw4Qltoy9t0OAQMdDMQ GxIYl63Ntn//agGICOsfEBQODASt0P3C/ohtdQRqAusL/U0N+C+02wJY9jPAA2X/OXwkDH48i+3v /l8DCFNWav5bjXACK9gNGAPHUIpGAQMofOi6Bgb/A/5oAgw9Cm9vWCb4P40EMzslFHzUQT+42xtG w1aLdEZW/wRr8FlQvg3/cwrIAp+AJDAA4F7DHQiz79tFKxBWIRTKLyH7zfDDEF4ggewYzvEIiU38 UMnf+G13agDvaAIRgP8VAKCRhcAPhXb78tunAA5WV74UwI196KUr+McCDR0X3AA1KIXoTaUw9MzW bXcD6GalPlA/pDskW9i4Fes9dWSE9ApeKbfl1j1oEENQHQyhWRxZdGyzvfcIgKQFGHU0GIC9Dzs2 dnZ0KDFQv0AG/Iuiezf2fYkBjY0XURH2xbAB6ws9uW8XJjJiwgSsi/FoZGkP273dIgMthIMoaDAN i84PGGpw7PexEE/HBCQgkIkGTFlZ4Yb5zTM6gz4AdQWA/zZfW/ruDRtYi8GDIAA4Abq6f/h3dAeA QAJZw8gPt0gMUQQK3BeeeQgD8/80jaxfdnN76woGA0AEUQ+FlGg4wQTfZha6WSQIFMMkRAT9W5va i0xIhf8rH/8CdA5mixA23v6/AjQBZjvWdw9yEkdAQBUIcuVDXwzfuNCkpljrEsj/6/PAf7t1FBRH V191GgNBDgPwv+h9+0vbAwCoxrqL32o89/MJZolRDpbbir0N9/dfEg7wJxe6Xyu7BUUYHiKL9yQM Q36fa/YjGRYfQQrI2O10QgoDX1cfFOl0y8gI914+CINTx1ttDLSKadJtHgOkLb19ew5r0h4HZgNB BgPwdFsRX7bpfrsfUQI7wivHdBoDEg6Dsn777e50CQgFah/YD2oe6/nmZjkBD5SF/9+a/Bwr3jvD cx1mg/oMdQtm/xDt7e7tx0ECXOsFQnMCZitUBuusCm1zRtdxBlld0AAzyUK9gRdofU2AQO/OFBFB O7vdCm8/iJQFdgByAhxAPSQd+63wct05tVcyyYqCJpwV7/f/+x+NsgwC2ALLQg+2+YqfDYH6L3dr 99+NvwuIHqJC8AYHcrslQAl9xzpbAAZB2/4FElPc3u+3OQ0HipExABUfEgVBrc/v85iNgAWImVuI wi+2e+/CAoEKWSjAih7OwUuv4YPsDN5oflxoRPDL5XL7LvR6A/Vy9h33pfh9XC6X8vmj+sn7sZcI 1wI/NpFqCKIF/twIPkt/YwN5MzZGXzv3diO9/A42KH1H/02gH+H2b2p3JQaAMgdeiAQ5Rzv+cufK RmpqLndyyqGzIL/BzWYFHGoWmRb5i/LB5u7HR/oD/7YIxWcGzYs9zLu4DyHbGGOmU+HXIQzBbWWy FjiRKGOvXHOrPAQEH/z7AQpyv84Gegz/u0Ieu93cHVxufRVaaAimib0M4N0Dl55RQCrsDADkVg1Q Yz1rtU0iwTVUCF1dBVO7exEOU16LT+zUtnMbXchqYAFhFksz8SHd1t0UXoP4/1Z1YQgO7A/yCCTG 9kYDD3QqGhAddmBDFPCRXmCiHLuSEADVEAZKuXWg1USAMyDQ9P3tycCAZ1UH8YsYGOvu5428BYuF +AXB6BDZlmDm1mSM1Ng0AP47XXPuvzKujbQFBBN1BGLD7gWzgUujjJvbD4OTB6M0O3s6MFYxefG5 eINSpEgKiigF4AilL0n5D3VuHmyKJvZyK+xzRolTMPD5RlBWOTcTQ3hXUHzoYHwpZreSiWb+kydz FylopQgYaUTyE0J7qxUcJAt1+OkPCRjykIUrEBA8M5zd8E+ruOCTEDwffbhZMLyDZfwAIPzkiWXw thkeaBzseT8hxewXoYGfYSqMCITpN8hbQOBW8EYEfx3oQesGBiIOiR9bA9OTHLgYGkYVTPTQ0blv gmSJDQAAiQgGQJMbFDjb7YzooDwMXth1K1lqICRQxkJtBs5WCU1avb8G3w08QFEqCZ1eUHYD7a9K uV2DZtcQw7j06mDP3R1RGol18FzuYMx9zTGDCUI1Y5+euWBOOsn1IEHwnOTIkZsG9Ij4dPxokSO3 buAsgAbkAegChFuJzewDM9unbzdWGDEYiULRHThp9OC3uxB+EEOD04P7BHzdTCB2W9rni/PJAtA1 8C/FJw3vT41ECAHfDEQ14CycxthO69TVVEIzREs0cN3/NTSjDtqsZjM4PLAk0RFGn87WeHU8wHVU XjnXY+NqRBuskp9RL5b70SX9xqxEyOAxXnOtuUBZJrUqDgBz3azNTDYuYTwhKFywSqY4bUE8P9+v LVvjoFCgf/xo5OzwGesIggrDDTJoP8VYBCteH6v8731um+Yq6zwNENkIXoRZshhIm0WdzWzLxghM ZgxITUiGwWaSkQwnSRsvsWyH3Fk7x2gFLfb2h7isjU34UQP8UVeTBaEDY91I8VKNMlFvfRDqbgaa 9gUw3CB2NhO3RkBR6kACBuhoaMb5hfSbm1l2hN53KkW+05pXVtGNNHQok5EfGTbCCes3WUBCJiNQ NCs5WlZWDj0QBnMaRRQgXl9EMM6Y7xdXCtGMJIyA9s0Nk3TMgqYNKPi/mHBZe82kgmz0A+PIZjq0 VHRSPObHyXgdOVChhlBQGRtLmv28YyBJpYTxHP1XQwKMMMhgwgAA8gKS9GKH/KcUErLZrROOAfZ1 URnc7za15ADpPT4ndia+QlinZB+aNh0VcTrWVKHW3Tslct/Lsa7XV4rk+I4wAVP83z0b1Mdop4vY hduJXfwPhNUAPHHD3Ys1ZBM09MZS1g9v92sJB4v4CdTGK6HWB9sGCoO8O8Yylx3Ssz3b3geP/kKH avOx1tna1zGU0GsHhGwNuyh0/9NvaNj0iBFsyfQMhJuX20m0dSkcYKA7hdh0G6ln297/tQdkARZc xusfZrZCeQtYcv9V+LFYkd7rlKhNivkMmm7T9AUdZf8D9/4hAsFq7iAyzyZOhrEs2+AC2NzUZOdm LP4gaDTIq1yLPVgFXCy0AnUE8IeBpxH4bBdU2FPXarLZtjMDlhtTqFbdUN/QluBDHjjROnwejUwG An9hof8kMIuLffiKDDcYv+222z6WCIsZSB154g4enmpiULtrkAsqXP/q12aBvQ89mrj0BDG7qgdh DSypwQ2/M7gyyLvAd4PhAQfH3NssdmYxFx0ai716M5RsIdsbAhcRBMmUTMkIECDLyGAPZiPLcYsz hWxmc5teozIMCmK34Zhu5i5dozYPKRZ2Tw2PGw+6o6ARDWl2j18I8EKNBDeW+IkEjeMkmwCFjSKY I47CCw39/yuNfAdCi1pgtmNRcr5ZfkoI3Uu2vCC/4kJZ4izDs8BXloQwzxi0bRZsSCkMSoI8RjZ3 boDi5DoPhuVkkpFJiueOgckWZOZ/bkGDHHLYEnLpoTX73w4Ev0Ajw2Y9gAB1GDXYM6CLrSdXF+s7 EbuvhbG2ZiRXM4C76wZilixlw3YO26SnZ44IX1dZl2YdMskh62rsoSBjk82SD+2adD+4sZZqAqPi DUWYGe4gt7ad6g2oGA8U72azi8VWeAQOxAtaAifpxA1yx0AkyD5NIggDQHTvwgOmYbhOpBC7epW2 A/ABE1lwpvVfs86x15+zdBloDMjTL+iKpFYGYdBT8rP+Tbor/CVbaOjHyhzpDL/QB6Msewy4OO83 ioyNoBkI0aMo26/9dgg5DSh0HQcjdBUPCL2A+z8NO8F0CcYFPBNPB4AlMGv24QgCIdC1RzHykOyg +aZQuxCG8OwBFVNQqQo07P7r1xnsdWtomIxqbht8NrNt7dUV6AvcCOQTT3KwjZTHWaNE3sbgAgY3 fJUDWuhDX70vMdQ7j+RTnSz0TqEmN0hTQ6PDrm5saIwm+AEjZ18h4V/QDHTobjgjJ2jkGzlN0Iws m9loLAjoI+RfXZoL/xoDwRIDJbjIUaHrwekKjVGP44twhE494H34vh7yyRYLBGP4Oxw05FzsBiAT IhWSEHj2kp1wHRA3ix3SXBj2RCMRDPpMbKz7MNNPRcA4bG/AJS+bPTULcSo4IP7Gy5g0RHMkj9kD k82FuTz/BO9973b24xi+7Iv8GqUAUKVU5Jd8vu4sTPTuEL7k7uscJeRMqi4QaTTEk5GtIFZoV1b8 4jMdJPRAZlEg/7mKXOitBKKjBq5ZoCT/JBMJoJwwNuKAfctKdFXQ3fTNRvQgWfZFuQJP+HUbrGvC sSf+vSUR/vzi24F9MP1Z81lpAG3slzC2O33UdG5cA1D/CsKJ5C02UQ41WYQXYglNoU5jssxQHoLw dATKyI2U/G+DDmkgGGABk4N/y0o/hXRV6IhFnDWxu3194DyJdnYKFCOvguvbJ9SqeoQLBHRTHtgJ y7btHnZKkvf1RHha7s8u3lAQKgS2fQ2hOjMIdvvBOwVrdhIb91Amt2crG1Iu+lvY2FLcFCUH9tl2 PGEQdClVPF3r5Th8CfvViQUMFkp8toJE3Nw53JZRLcZYGEEBSKkQLBdYmkCJ6WIWayg8oBTNLFGn oAh0EsAIFwj0kkMUAXU3BeC9Ohz4oF4pcHlImdtsdBP8AXDQsKJOoAPE7Lms6/gmQQleq4RUCRKY VoJkRelpPApAJrCaAug74tC8OBBZvrjI1o79OzCUahLzpaS+rAz0pQoYdtsOz2S98cTYHL5YGzvZ 2DTof2alr5TiA+3u+H9N5g+vwYP4FaNQ8SgM0egLd/n/YQyKDXGUGxhFWbtQyFi32Q5tWUh0RBxT HSvb/Q1ZBxuuWRZZVhdpNvbBv0SeVwtWBgq3wl2jiipmaj9ZsapN/dvady+IlUwF86tmq6oVFFkV shFkpP7+x+hWjsADGOBZ7e8AGTcI8EYMdEgLAZakg348LUvSDMj+/jiq3Bo2aTCrVCGQoPjHvuPN O/h0c4scg+AQPBB1Sn3bZzZeVOKILTgXJVvBGvYQAGIXZAicTTgzDFMkDFZZGmSbcyBXEIw1SKY7 lwqIRMPeQSd2oZigqNZpyYgT8ft9gw/Bo0zxEjkFB3f22sOICyUIlBBcCyLPEx4TdT9i2fzYHCFC cwUQZI7Z+2SEC/nY+9mk2D0GbTdVNdyEhL+4xXe3Ae/PR1PWGjgRUA/mFoZJ/e4WmPSb0CDJgAC/ BBcgstnAKZj58MvsZoZabvNhRkw29hD7Tvf7IORQEH72Ei/QFwRT8wGNhceFWB8z0mzm/9wJXNRg NCPNSMxkuGisSDPSjGykcJSMNCPNdIx4hHwcOfbTfEWAdAaEXIhUkSNHjoxMkESUQDly5MjUONgw 3CjgJEc+jxzkIJj8ypzYoLTkyJEjpJiobKxEHPk8crAgtPzJuNy8vJEjR47AlMR4yEzACPHIzDDQ FMkZeFM0mMI2HWf38aMli9Zo6ikTlIFWMt4a3gganc3A0l1yCB/EuyW3lDo32P5lH387OKxmEpgc CIYP5dIDe0EW+Ci1g919IG9/lzlehCKE0AA4fYTjRlM817t9fQd0QVfZXtYw4lAkCienmNmko/3g Dv90gGr7IjWHLYx7KgHgxoc0hwwC1A//tD692Isuy/bw4EuWSsY78BSi7ACbna7nHGUl/Hub7fT2 5PwwYHM0/wX4BThbP5tQgz0VdQcNUCfLEkFwLwyMhe896ZmXEONN/O/nJax4oIhZW7uDdtAG9DMX V1b6hsMWfGogagMGaC+dWI3REnT8ULAedcFy4YP7x13w9pBTly6IbLqsouSB/2/B9xNfD4LYHVaw g+9kBU20aCWDPqjCdG3jUwP0kzakQWT7bcogsCUEUF2gbnT/dPKMdnu/AMy4fWJ1avS6EAF0EQQe vxIFeggYdUtwrJroAIf5lDWK//Zb3CM8Ink8J3QlO7tzIIP5f3MbFf4b9TwgdBToiAQRQYA8HkA3 N2r3szb4RuvQ9IAknQFGCm/Zdi5ykG/4BhQHZIGn6KacOvQZpDFZ8EWQ1vYguQAcZG9LgAjMBwLg qOCnguC+WMkl4IP0Sg4ZSODgQQ5k5OD8/NUHDnx9oK2siIUEGhEwOZzFgNxbqhECMySyG99bcoMf HMwRUyDA/segtR0IRoP+EHzP6w0amVuY4lkPUZABcL/gvXItXKFrJGhkTLslLly71Yulhfb9aIV0 LcKvqRseas6eWCZqMkW/myLEU8/nZoE9IgQxdoAR4HRSVltZm0GvKEFLf2QN9mBQczhsoWbHBTe4 7JF7aIoGelpE2YZ0zzbriXYAFlQO22w02zJ+KG5XL2zZjHl1RhgzO/XClttTRVajJD9i5S40TWhq gbxLPl2suxCKBO8wtUOeeiS+wjTvvrtHxok1qBq+4uVUoAqJHaTxl0HAFZ8HQHYlsR+CS6SLx+4P vq8pfIvY/4vKweED0+Uz3UcmS1ly2/ds3TduN/8H0RfGBaxAAwat+7//nK7rGYvDiB0YwegIwesQ ohx5C/7aEBuNRCSGAQEAh+B84ZzXXVuBxKL3dXDAU7t8rls9m8MIzaX0hLhX6GjyGrhNitSFhf99 k25bDYkUq0S2ORV1tfT+NHY6od2zEK2KV4o3tgICpTKkB4fb5N7u0sgZiw0lH8BCOzmUTj4ecsZW PVdXoLcELxKLGpw1L4TZh6WpV7JoaAujAg0E5FdUXkBEyHTPpF/LtAbfEaoQg4gDBRxZswN8Gxqo cQVFGRH+NWaRrB9WA8hRwIOaImc0ASRepJduAS+LdXFGAu9GCNsbshV8ABQDTu+G14AEXxR2MAhR Ic98H5D+BGh0zNxkKGazSUdaAEkZ5LBkxxFobCkh/gDHQoZoTDiyALScBAikAf35QnynMeOGdDeA PXQuuJxwzSrUFokGXMxz62wHO11coyzjY5no2zsSG8D32BFxuHL0YOygRQBkXH4iMg60hPD3JiFL JcfaYVBXG7zkYG1og+sycOg4LAjSdRmY+LRoY9AzQS7pHFc7QIOCOVs+G4ZgNsu1TTezvhzGsmg4 iTY733Ywu2xsANM0AoYC+4oCYpxxhnrAiCqU2cVvzBl904gGctBoJYmH1aPzDQgTpQeLr4PWS1k7 EAKV0vXkS3Ib/CflBxfMm+0Be/B1HRPGO8cnvYtAVqgvEJL/MOsGCghyxTO6V9wJZqEuO9Zw9OQE VBTAZkaBaBVg2pJMw+C6Jwa6+3ZGV1vmzk4ToAActHdkHPY5zFhHHQAkzbMHSFYtBDSwnX1BiPoD Pa4QUPUGBoMz9B4Rs2awGkCfED0Ud4POoleQKzqENRF1deSwjKjLBmbwhS1nnStQt/DDvQ3JKXma BvDMdgAy2MEjj6ncSh6FTCHwBQHIhLzMBcwrGQo5dwVGztk5ksgiG8CBHFksX6QMJYdCXtIEoQTG oEcyvH0ENGSGKWYCtAhGtYW5JROsrr+BHIG5Qr0UJmA7a1cIH6shQaVg1aTMCtsTzZ6tFRWVjIFt oGm6tzX3dHqZumij3DVhdpcPYExo3jRggxMNKv9cxNabnaxNurGwO1cSry8sEiehZOKvZANosjYr J7WuxWKzEzl718iCL/Vbw3fBWDvYdjE29IoMP9m//RCA+Q10BQQKdRyKTBD+DQ6AfBD/Cf/W2i6N EkhwAX9AO8Nyz1JoCeQUwQJJM+AaG6Ejixg3p9hS9rEjizU783LdwyywgTKcNYs1Achg/4QBu0oO hU6hAX0jHAAymKR8LRFIYoHIJh5gJcZA2MaOQOJRyq1Ag8OiBRXIbsjfZ5PqlE8jD/SadDGQ7uO0 0dmTLicUpaUWpShhp2Imzay42nD0NqJX6HTR/hJ07hEcK9hXUwPBk2IqoxgVQxi4dwHLVkB99HQJ zYRbnBUvffd0CFENOAEfoqGw8TRajgw9ijP1IxlVIGL0DMYGAVqvKNLvK/gjo7KhYOcIRhq2YAcH pAxX6EVfFmjaNUDVXimqKUo9JJu7ONiqVUQHqRdXK2R4kc++6sUQA/Jc8vDMJrwVo9uAfDKMBJ/r AxZsFR2FuQCxCD0mC5MMZ7giNtzCs9oW2I2QPolgpBxFeTPwSXNAC8UC6tw2SwZ5LrQXoNvrvpUy boBkMP/GPREz13YdI0Ptr9dWlS9Ew0EJV5HOiUVddgIRlVlbos6NDvUE3viVvKCx7ByD5LAGO7Iq F6qRplD55XeU7N35EWhw0ZFeNSpq3SskoQbNZBa+o9G+wX5vdRTDWDHWhr2I2Q2pMGhADS4ZbAkM 1SovJyhHsUE2rnEACh6ZBQBsBuEOo2YP/grkC5vQnc1yXOQN1iFXw2jb0RbgAjMZF3OTnaXiF+Bt urm0amRCJhQEU1vPNjeJL9l1BRf00ERTYDHGIhueHhxLMmCzLSzoZs26n2Akkki+4BNWC4BcIYdB HNSwK7DJEDzMqwYZkIPEDMBAyBZIm7g2WYv/i30UgD8tdCttNFcyDe7wUGhEzqUV0TgKxLZhC2og B2UhD9nNEQn4zWjMGwLbgYMqHIFXjaIR5Pa6dsRm2xHrX1YeaPZGyQF8oc4GBoiHxN7RqN0CbwoQ 6aUiocS16P5/QIvQWcHqEiPRipJIa4gAl+eSrRAPDPUGI8GfPWtA9hSKgBr2iEUqGtsW0GMWAf1a kW3Z7D09YnVUtNmj/g2AZfgJ3Zl2WOMNIggUfBJo1VmuxHPdCpJfVzuR2rS9INxFuE8jM2h7CAnZ IUg51M0LsEEYL8zNECxYtBSBePx6uaY7SxFQGPq0SzAZG0KSEbCCWlOMnthA20pIxaToEy/DmrqA heADC4ShyeAnF8F0keQH9iSTFa0czHsYvUQJDkdWotu+hNEVEaJTpphWDCGaf/t3DDIFcqXo6HlR yJToNTFKoPMINTGSSKBzmUqQ0ZFCoIMQGGalkTmFcAI2SBk2SHhFZZCsN2Kgl5xCGjdiCAY8kksz 2Nj4+/j76dhIjvj5EaTR2EO7/iOJXfh1B7ABpTlbllPxHk9wv2ZdIjTpDqFlTVz9ixwtgk9md+u7 DGg2GwkYyC1kC4Ee/EcUDNr+y7g5dQSzAesCMtsv+MBSmMn6X4rDLKTLkMIUbSidzzoJwIm4HPNs Dl7Bsik90PFTMIbFySjZiBPGEAs8qYh07Ka8FkZUfmEnAJo3Y0SGCJwDg/oCC7uzEohC1z4Ze4uI wCfgkPXHXATTDGkuDYpQ/NJUQR7SAKi48NJBDvKQpODS1NJBDvKQhMzSxNJzA/CQXLzSk4C00shI c3OErNKIqNLIzMjIyMjQ1NiMHDly7JDYBpS0mJicbM8jR46gRKQgqPzJrOTzyJHcsLy0hNK4aMMc OXK8QMAoxAiumwdCMAMh/CD8AsozISEgJyQgZhQZFiD++U7AIdMTE/wkwMG5uMVAiCrygQgM2tgg /eSbTQ4h/Vg+/TyADbF1TeBC+pBPJ+IzXoj3iX38yCfgTWEdyCD48SJObxgKh+SLeAladF+MUJ6I WMSLZbiHfIf8DjjvoB0IOSdjEb89KKMokD09DCIlJ8c+NowfXYeU1iBO8I9acCHE0epsQbb2Ftu0 0ZMSo9TzCRRXZ+SbfeDRfRbcQMjzHZDQyPEtKcAD8owM0BKwzEQhBiP7+awd9Fq7Y0BXAItxC+Pg 1HVQh/4QwKQuWSK2XjAAV7FvSYdUsN/E6+1XLpn51wBBUnXcVXplbJDcWm3oJebk2WmmwCLI8R4m CVhW2pwG3KhV6TqL5a9wDGyxkwSe7wAWEwTAgGwu8YjxqNEMso4ZT7lNiT9QQXQMScC7jG/+GBnJ liiGGZADCcXUyNkhnwFMIPvTSHd2vtlQFAb4tAAi5Ak4sHL+ySDZkgsPdehh0PMHJOxghGdQNz2m K4ElvII6khjOSMAXIWzQ4JyAgewQOcjhMCSgFNbksyDCW2tRodi6TVOm4lThBGPfLHhlpkkIUidZ I5vhQvYlXHgFOBQjIyMjGBwgJCMjIyMoLDA0IyMjIxA8QPyMjDyfoAChBAgQegTKjBiVQer2RYJt qaQBrFbiGXOuQJ/DaScsxsZcrMwAbxFAF0yB4xN2AFE9ABCo7HfDW9ByFIEnUG4tEIUBF8SFb39z 7CvIi8QMi+GLCLAEUFTZ1PEsaiGi0BZS4GfhoYs9UEUlg+xogw3Rt0GJZegz1WoCxThb+2eggw0k AUF8BijZNny2CpwN7ESJCA2YnOsdGeihlAycKAMHb6KrETkdMNL26u9srhJsTpD8/GgM4P25rnQI BA72oeQ/g8dd1Dso/zXgOTo9W5ttUAOQoFCB9ATQjRryMgDuofDt7/53YTCJdYyAPiJ1OkYIigY6 w3QEPA1te0C+8hIEIHby1NBOoYGpmqTEIMx95+0lYhHU1OsOKyB22KMsAP/r9WoKWFBWUyzI0NB6 3fYPvpeYM4Da9wsAv99HCYlNiFBRhPBZa2VpMFsX0ogfeK101+odGXyMobD0BFEIN8IBEBgwsOAU 7tl7pKHsZCOCBLAJ2RhW3dD2+ahl7n4InC6Ac6a4FYAmBComdCUWFga3KF11OCJGi772DPDCQvy4 SIdZDlkEC8BeqB77ARErxgcEM8nffmBHc4vBDg+2UAIDQAPB4X9ta+8IC8oEHSFMHjkz0oojYNj2 1YgQiCTDEVkG2bZ26hgSBkAHEAhYHQLMIhFX7dUP7DH/YrFEhYv4mVuKHOOTGs8mQxj4udW1Q0AK xhZAB0AFTAJWMaqTgsAMuG674tuLfQj3jRQHSlX8sAhARLutF434hclI7GXrAz+qBi739sGa6nt0 DJntv/s78g+D3gvGBi5GjRwxO9oOz+6+gdgwhqhCXgONfgE2RfSKou0W5UnUTRNTwbEL+pWep0jb VBE7Z39kK69EmVxGR0PrWMVJu0u7ogNiRjspc3+NamQaC7lC5CDnRkK3dTveJIqANPiIBhiZElk2 3S1gbovCCBYSmUMQguvatz/rCDt1RTmKRRMaKv/E2PYMW8FpEuyTi+dba2YLFxrZgdlzX46+vQjV B3IXvjh+SIMWi1iIrAMw8lSCFluONFYrD7YL20FTUVFNFCEYg0n/hYVDrA1Ou/DzLuBWaOJNGg+C 4NQ3s2zuDK90H41HAT/x2aDvuY7TuQIj0XSBab7tSjvRho4pRYWtud9cU0GLyCvPQaU3EK22vfHj P8HjQtgDXRXDJpsvVWi7YitzXXvacgIrTf+3vsAIOcx9TuswtzMBO00Uc0ONPAO3GwB2d3M77x5G UxcZAVhRK1BSDMBdt10jB6kD81oYQOREQa2Nub3adAXeuMZLILzd+OsVBPqRMdLCWJA8xgyMdppu JSiM0Bw/ZrCSRzisHHrjQsM9+D5UJIaDZCRbAE8N23EYUMoLsG2tVyOziRwkG0w+NAtvIo16ATL3 vduDfOUKdtEwvJEAMaH9T1LZdFsrxWvAZIvYO/IWsPdFpO+UIBHDNt7M3SSNBIC4QyV/H5mSybcD 2IH71g+Pp1u3cw+PZHOpIIuOO4AkZHg3C6aQiB9HqdGWgv9T0+tWg/tcdQrHCAG+sNWePOMOadFp K8FIqK3fCo35sTskc1yIAX9328QWlg9WUYlIFEdR+4W/7uu5DgpXczyAdEcr+oH/fMhhDfF/LvFC QSCBDNbaGitDLQ52xBDGfrYCBF1bRylJBin3AbaFhn9SCP0z9gPHO9b0iaATUeJvAvR0J4sCgzl3 /630bfyJJnQbOTJpCxB0CoPABDkwiSiZzHX51+LkV0cDU3XZnaggPg55Q842jVwDAb7PxsFW2zZ3 AasFIhLbIraiHdC2HgVDa9EWbaF0PfJS566G7QfwSRisfVhQGAnYXGu3Imn8OWXp+IQ9cG63K+R9 DrWJOIJ+CyxcCp/2ww5fmDvHxuYa7LeFc+BD380ULUZX3dP6aH3Tu+2NdB57Kerrh41PFfhzLYvQ Wlj6EfXB+srKRRelvxXYQP6zYgxAiBHrLS4QXFfs+HYjmk30Y00Vq/guBZQM/hZpww88iwc78HMm zeGNxrf6EECF0hGL8iPxCcvCd9t+GnLqNDsNB0AMdqQYHLYQ1wemQN7evvCD6CJ2SEh0FwgKdBIE DXQNDtVeXgV0CBx0AyUp4N7fmwUEIH4LBn99BBEYMLnOINdNBe4uH/jap5dqMd119D5Gx7pBgb+G z7p6ynTL8lbjFjvKmF8Og+fn+UA/8IMDDevXHjv5deHN8LqJdisidAYGUEarRmxj4ddEUxj4ClO4 obSDHzvB3J1PddWu7i8V8k91mjgOdB0HknoYHlj3g8EE6Sck8+sKXhtYhzZC6wsQVvtYC98e+EF8 6PhafwPrIGgFfMI0BOnRV4B+RUNvX/YFSAwB/VBN1NmuvWmXY0smGAJcJ4ljCHQTH2iYNHOAq4EM EIqUT9Bk7ca2UFMAI1MbbLfZAWJoO8Pqfx1LdDxxrH1keFlo+yo0v+tK3EGaeligAFfYWjPIJcc3 fRhc+gWwI2DrxmF1FjgOIaAd+mbngR1ya0oz62EjHmrbaqFGwBMGDhjosMHuUVBoQMEMEit9bOtY gBwgEQIHmesTaPkEhn32BgxvBWj8rrIgtFOxs/c/0QhHjSCReHuPhFKZSk0BTD6pME04U6FS7OIt NnDHii90ELyA+S78N+D/4JTCA/JA6+y+XfR2DYB4/y56etNUJvQ783UljU4Jg1hcHMNZlAFobf/M SelqCaHUAo2DiyC4d5eaXRTYO/ByLCyZ9Yhfq2BDTQ7JNtNJtVIOddjxZ/A+2xpxcr8O04B1GwWz 1e5STL85go6YWeauBJxJ8Qw5BbSppV8TlL4HdHvpFEfahLxsdWv/NqIxbo6bpl/YgThNvESDAMLC h8F9LR10JnsJgp5ubbnXoeuoAyX8PQ0mFuoEAmj/PQgUcDPFsgGDht/GBGHL1kV3hXrwGeZ2dNQO fysedgWV6xg48TS8juL8C59SSjgUheHaJGZFEMwI2pPII6kZ4ZomTcotCmx4XQzUdCEmTwkiPG6x uOBhob2+4lVvvAzPnlelYhGtCcGd2ab+7oH+AWd9RE54IoA8RhxWa3tHLsFXddChpDURr2tjF2JF lutAOVM6B/T3FhGrAVk9Qll8DxS8v5ZS/y5TV0pgNCy5brTTHhw8wsuGMfw7+AQEZBl7wR8QVg+F d0G/3BDojYTQYxN1m4NXEQ6+GkgvT0UzeNvggGX7hEG61wC/Htb8cAZ4L3rTrnuLHfjUGot//zbr tQZ0MKGIIDgBfgxS36pKsGoI7C4Riw2EYwOicxYRiyBB2HviO2oIGUY4BnXQ/THJUsHsUUtkKjQy N8i0LeJ6CORKDa+LfRmmk23YKINbyk+Xeg4cViAo4HwSqduFnUZ90nx0uZsZawuxige0LyK2OR+Q KRnAwANH68tHMHwXZoAl8PdASB6+8O2SsAFRVvONTvTQJQUsil4XU2iNDWwdVmVoGWsMtQd1KpvB yIQ6hHJ3XmBShnoEDKRRASPAbC8UzwIY1qA3pSDYu6PJtOqniJwFDxUShpMoDPaxEzbsFPBe6w9w FOFhBJTaOXu12HtORoVHzJgGbF9cJMCAIt+nHPRBAuIWaBDUdd8EOO4PZJBZrudSUDkdQJm+hhx2 8AUHBe0kwwuyEUQHKZOzbL83EgjAAiVmsMj9790LTlPjZqMMVmo1iR1UCIVYpw2OUJ9qhr/Z2oEN HskkUliD4fFoBHN7r3eJC8ijTMwdBR3Q/drADO9svtDef1d7v4RJlKMz/zgdGvR2/z5wiTUBurgn N4H6zAdzL94uECW6nXQoBCB0GdEWG10JdOX7xYlVJ0TtCTgx6+f57b9/iBhfQDgYdckuXzrLdBUQ 2wYOvgs9BhQP5yOJDLnVsxprdTQgaPmZK+BREJsU9oMg9WouUHYiCkCr3iuwhKQTpNuycOH9pYM9 7c51Mfv82YueDk+aLyCDFAw5oyASCu4vWUt/+AtlDWj0DxGhEH8bUlNZh5tsBYGyuFsWqVzUszBA oESL8+KGCaKnT46E1CDTwUGAgDsJ17QQX7arOIoGPCALCT/p6b8lRuvzagZofNQX1bVGjUYGWLpt duPsoWoP5sF/mhUR4bF/sjPQI9ExCesGCcQ2jsRhBGQPI8GCbLAlNsVylFFqzmRW6VoEOygsUJwY jn02ZEDPAmg0EOvEWvMD6TgsB4ANSSC0rmbpugILuAd075NNBc1WwTFdr6HiG5gObQY0BlZ/cai7 gAuCLnRpPwr4hYjhZnhFHIsOV7pRY2v/sIv4OQr9GVsq0Whv0ALzLl91ORvOLna6EfmJiAVODTI2 kBvZgEAW4St4TfGJgUIGBQ9ErhM4k16EXR1ADXWEaq1ll/qw8epWMPXaAvgl8AEbwWDUHONTcKCw 4bO4ihi6pFZXdCCVwy3X3nbAIAfDBAHFAZsuHqnKgPswvAp1Kt6aawFmTkwTeHQO3VPX2gRYNBoI Aw8IENe9LzMhgHM3bVbzcDvFI9sJbVYNoYS8abajUmRwKPcPr78EbKKJBdCa67xRB/K9OhB1cEFr DN275OzBRA8lFUY/H0C2ZNtqAgL32ButxKW2wAYgP0Ers2cHG1oFEn0L8PAKNuAutVSDgJQlymxV 2B05Mh3Ii+22Z8ImDgTUiQHWKRDM5v4ihNt0NJ0lolGBbgi5CAigd5W01eq/jU3kK8HB+AJAs2Rm hVq6dKo6IEgRgaqrVih1THdntJVwmm8zdkXoBezrJhz/NstYYUAQAhb/Hz5atSMYCasLkgoPcPws D4OyiQaY5qAhWkbpP1c2o3SpIaWlclkJI/CtiPrSfjG5Zoug6Tb6cfxmO3U7FQn+8lbb1l2OizFU Dwr0WUe4MYN4qdL6fNnS1nA0YGpTp2Y0Rz9J/UMEjXMMq4vISIXJWw48A2J+aeMCBHw4GRCH4t98 U72/VKEX4ztFGHdJVhYQz7ZL8EZWPPgKWUZMWyO3r1lLxSEQ2xtxZdG/HxZv/++hYLtNS3+X7Tv2 /m0hObDxogjUDPD2gNhoD4c5XY1IDDmo2RoeDoRmxola6ofHO/h1auZPfYEMWVPiZMsMoZQ8yEwM d0Ktw2JDrkZMsUZQzXZ6bgW9VnJ0OMSMvqaF75ztCLoDyWXVmSZsgiFTqIbRc+lFyJi4IA7No98U l7akCSYUDH0HahbYRhsesmGmHeQtdQkTZQv35tECdCeh6A8H1i/mogFR5w8KrLmHQD5mYdOMQK5c G+0IFXAMpiuRsdrU2H7G2AE9RC14b024zBLsTCceedNt5PvUD47qCB5M3A6aBlESpoPV3J+LwXvR ralROtNlgb8ahRk6CtwCbF0lO/wEhUqGU9EUIwhSY0cMgo7i3CqX1bz897u5rSlISPMnNQaFFHGD 7luAnioPjZ8J67tSmQoMqCAMSmyRiOcL3FIepOrD62gg1mk5fdh0A5vbSKbeYLgYaAhwUz19MtR2 av9Myoec+Z5pwgfv8KL46BhRE5S7I0eoR9RVH6Oo1EegO22mxgAoaqSDNQwdjOgXWow7GTpxeC3V RhGbNeIYLSSYQriFa8VvzRBRYKhYiU2wzwlOtmxtrPsNULRHZcGtgB3kGODBAtnVgArlhVAFJm59 BQ0aviBDVi0dZpsshXRkJuDRumWhBpHobXYpI8+1DbCwZk52DF00g7O1ygKCyJ8hS53KGAZ3vIuF jEP4UXd+I1oSRcAGlOQI7QFeeq7RUV+8flhggt4EZUuOxZdmdDGc9gVdMhXAFSmLVBTCXa8Qo+h9 iDehgEgCAisUZi3DOdjeukZmPYt2i6lB1HOuRTunRGgh2yrzPpgoUGw0dm0VoOCcTejMdNsFDOaV 67IGyKaLWLimL90GZqn/SvFyU6gUnXQNNyA1wg15ZlT16NWNGB301saOWX4D+A1dvwqS4cEgfUUJ WgPDiJ0Eo+wHg8Uwu+5AaNxGUChiDEx7ugkuaOxGW4VOA8zMCfcoBKZEHSlLxOf4cV7joTeDz4fU dFbFDPFHKDo/gncwDsYCjTvHjDYFSsCObG4l9DUGPXRlJ/zYDFE/JBFBPXhhhFd9sALQMdeoMGO1 qdd0NKDcrJY8jEEWWQDI1QEBw81lPfqgDWNYG7rqP9TMZiPWAj8uTdTTYvQCD45FXwqZ99jF6TLg C9BpwHgNC7GKxG4UoKFCbqYW3uHAUYna9S8LjZTeawTHB0BR3gov4QjH+GO+TH0ScD0UUg1qYRqy 4mLOxrATvAKiZ6kwR8GzxbzFvFBK+YLRAn6gS7iCpVfj9Ici4gw8zM01omVPjKM4oivjYDV0HTFL PRJs6Au4IetzkQR1KwAzF+pg21YdMz1wnmcXpD9/ZU/xXTfsjQQ+wQgDyFZRYxVe2QgAvUpA1v4u Y4ZpjGemxyGMRjWl7aRXKAnxXOaLBrLjBieH9PMEdAcFdUz1L3RbbCGw1Vge8J34wwCNGJp7lXtA htt3fKBKqKiFi0dZ3Va6mvZB1LV+DKhWLBgsOVzVcETFRoRdqFi61A7kCZBr2tSL/FWlAJHbh2LZ UPZVYbSEHEGJICAZBWh40AY7nMFmdMXPsmwR1NREjS8CZAjpM0FlkbNA5SkOD+ukGFGytoTsXto7 YCSVNBu7WEg7KF8jfizMgA0zy8gsBD4G+yEMDyQQu3zfmRCGGCXQMyPBIc8gDIcUW7CCl/v41EU1 7CiVjMk4J4phycO2f6j2xCB0FwQBa+jUwEEOY3MJdDNmMEqeFkjxU6LxEjEa4jl12GeCb2vBYwgN 3FBJpIuf9RzNOTUA+A1AKggYwJT4lIv3OhwKUB1IeRat2fcbSB0HlwA2uFi1yUhFjRdhrxBizUHE 1BAMoLDsAHK41OtWIrgRkJf/rNT06zS3hVrM3ENhFQXQAAaJbqC+G3QBTtsLVc4dCp8KBx1Cs5Ez Yafw7mzkWlzg3MzuC1PDoBb4NsMXYWI3/WhYctJES6jI5DlWgiN7x1QhFFWvdAIKDL1ADjusBChB FDvDQQy+LKeigw0B0Fmdhzgl+EpQgV6jIFaJl00wBgI9DlCDdhLoA+EatmiI1ki/0NXG9iRfzjUo DHzIaocFsED0VoL/I8H31QWwk6EFUB4OuL2hi7uS/w0jy4NtMQvI0e0SGQ0fgeEUh//dYIO2UxMQ KLQ6DqHQL5/tdxhA/vAKC8GNfsodJqBEECmJdbAA1KoDN0jT+rfa0YB4GGKKHxyNQws5RSi6ylTQ E2JDV4Z8I+S3kEcKEBmpt9ekCYHHBFf8uGW4VG0gFsMPU6SzQrtIbsAD+wy21l4B3E4EsrWOdYvm doWKUHJkh8MZ8MED4ojOVnWwT0dF19soaQyBSQy3st1HK6whA/iNeeFCwsoQZhkz2wb2dttqOeyJ DnRzBxh0blxSNWob/ShhPpPtId1QYxg7w2BLG2AD2GoK7VPs2bbqSCYICAnG8GKsHlCNtzxTv9yK aLnHtcgPvgGNecQbXUBEZi4KdGE12N6ixwjxc1oLJbsGLWK7GgdHCG0rgzeBW8BGoOs9GLqsYdBS yK7W/sFJ4Uw3DtQdI6NgELwJ3zxQ0NFfTuuWjS8msTcy0uTIxMA4DDUcjgynQxew24YrtckEZWcV NwIiFb+1BJ0MSUCAPWD90aBONe03ocAM9iZysb19xesiEQJZBnmzgH5J6xABwK9gBO7QXFa8uFXO bHeoax/0iaA2EW85TfhpydiJSJUpCNEouFEBt1ChYMPaZHiIOYgvYleE2FDBLdrqEKgQQX5oXsLw LuyLFRD1tIlV9BW43RZu5BjwUgb4UmIgBo21CewdzCeV2nfPQD3lanU1aMDUDeRjERToOwZRdEO0 9u4fPQK1dBgDXQzEH0mCL8EIcHybi8NQ6RKqQcNPVfnu3WWAeZNci7QkICGvpz4GO4ucJCj5LV9g E9BMfIbYdAt/AG3RTssGW0iLPiOXVI1mLNnHwdvuRtDvEy7o4ZnnDwm9xqaAm6hozNwn1VOi28wV iDNRY1EwZNuNBD0FVnQQHTtE6RoEoxgJu0220piPQsB7AoAaXZttVDK8DwsRBCDNgHQPuAK0pHlJ MwGwA4CsmgFpBkCcIJjYkGZAEJSdQqtus7RXbWbhBIebFVgdJRQ9m3TLKvkafDBDBuyAHzNwLjaZ kghkchxaEgpndQuGSI6UAEPCgKaP7WGOElQOpwSovt1WBOwPaFRJd0wliD4hk5kBIFCLlCQkOfu7 gN0MFjv5D4c9KCUW0AZxdSE5GO7bSkI8V1FWPIVGJNnV+JaF6xJTUlrdauVmxw2cjSP4hWAoAWEX 4rGEVAPGO7bpAKK2ew94IFeq9gh5OPxWbEvIREeMPb1ygbnvA86TqT86TDREW8g0M6KoVxIcNBgD GzznmS7dbGhmlOkGd1ePFuv/Cqg8aiDB6RBRV5wLpR7sjKZngo08DjCBV8jAdys+oCs+Zpa6OmrC /0I4NIuFbgcyKnYHr9uw3oHMrywx4NsNYILcGMAxdWvM27xOMQhwt14dRMoR24JKI9BADMJ9GPTY fJl9LMGATQlqE5wOjCeqRDcP5CkdUi9Afkt4TsQnIUK9QZEjjYZRP51jCP9ljXQGCFZJbQ8CDx17 1esRrBdr6y/w7HdtEC1FXQx/JEt5snNehnsOGxYvnOsHCmpuKQ8FeDTgyhTJ5s80Z8wKU6gOT4uj RTZuUwPIVFBnVmZVU/X2fYMonopnS+T2ry5c6w2iApjDSmRdgV5EMMoEK7phKJpgMW9XVhwjmh12 V558Gv0vikjoEAeAfDj/LvF3Kbi+jUhQGHxxEgPH25IFsH7IBVwzvx41sAtWuArQYA8peWtIu3Tc LSzsNaQGWaK48B8OBGYQEY0V3DGZhIcLnnJHjW4MzLRgOmgxFCBiY2DJBnAG/oIN5n6vvCQMGDhX eg7CMCvQ2YRg5GWyKA7YXCQwmuqgZSXLGwEt6whdMJ8VGOlGRmE/cl+tdCKGBN+LmN5aKSFbo1eT G67ZILUGipQeDB1O8nUtHBQ4ix3JwuZ+2RqDfGQPjwQIvmscBNI2BsFkLEgJIurQ90bdGRb/aIGF QB0g124rs/cJFxEWagSPu2FVNL7DSBgEu2xS3XUdaixufwze5rZvg1J1SyMHPtZfJ7ZbPEv6HIq4 VogHK2vbQrJPIbYOLwYoih1WoCjBShhHaOQeFnAJoiqTNoIJz91kaHgeRHDwAx+3W1lGXj2Sfjc7 iTCb2ytzMRWSdOR1BtguB0hckxtXdus20GnTnBhZpBQef8kbB3fryiI7HB9zaSG9dbPYhiBjXVdv a4EoENqq7EppGyKTbOXyHA2zBmdwaLENOYRMARAyV+UkH4OJVoqlcwPkO4VsHyBTA1tI4RmYkYK6 Yo7DdcGaZRHUNA85Lpvc8GBQhzhoHB9M2WHbQEIEpUhCYecHchwgaOzdYkmR713UH+gwEtJ1sy1c zBmiAtgcFchmSyoccj2jhUXGITgiavX94I6Ez45gCdYPg1ZsOArBCdrFrG6BOveyi3IgWVk78FhO 0SowIrhW+K48BCPbXHQghpolm6YGG5UggydLwOmkSkfEO1YOGZDdahgfgQ0cYEUGZNcdG3rFFJGW cGHZIH+0B2lCq0Z8hTs4Vgy2nW1AvBEDHkgVSFgyyIRYWGlw4Gg3aE9K9AyTLRmkUAyDGPVacmGS JG8DMmGMSrAaLCzgiwDS6zJW//BLIWTrUiAbIK4E0NP1iAP643IFoxYSuJPyAiLZmZVcvIbpDArG Mdkg8JEwKaTqOBVbxVLAKB8wj6UOdCQsoAPBMsr9MB0TXyJG9gTk0vZaSDsqcBbKnN3ucqs4WS0g BVlXXogFg5skdglZh7/nWrk9DGEc0QcqSfKx/XggB3WvcnKhICmuhPAsLCE5x5RGQQ5si8irkAyI 48VmEyuUBZwaTTLaHdm4K8YDOFB/WspQAJR7tPl+QI5aj8Fj9tBSOoRyhPypNVqAXhSrhAfdXdPR SlDeRDmaWXzPmHQOBm2yzZNGlM7I22tYcnaZgCZAkxaKY66Aaip9QY05Q/5q5ezrZSRoXIPZ76wQ iDtrdAzetNm+YCWkQHsaVJWQUzYXyNsDMmGcgUxmREQbDmGjjctkLFHvMCscQinayAMF4CwgpEK4 jBB+MSjWQcwK1yWUfTMGJmrIOJCvzviudiw/N400COtR7lbfY3QzH3HrU2V8JQZmJRicxH8e0yog +MUBg92DbWJVaCwyW01JL74Y6QpFi8Pb5CtmU42hGHIzLDr83PnbD01qxlyLwyp9GLY7+012AzyF C7h+B7Ybm+XZAVKCC759D6F/v9lLLmWA938bC+SAnm22ZzOtgwMUzH8PAYGc/JbcayGBB8GBPVzo psg9g/k1DdEAq7fSUKLFDhR/b34ButVbBg1/OlCLwTlVKt2/JWoCWivCdBgDDvyxjdodXrgU4D9e DAX+zJGRBAD43zcPdBvz+4xNM5jw3y3o3zv5kOfg39QVdEQ3A9sU760tDwx0InJ1DUg+kbGRZ1nM xAXAkZGRkbiwqKTIyLKdnNlpp5u8nfz9V39WdE5sOXRBNAsIdCm2DsgQWy0IKDdGul8BtK7pAG+U jEbGRsYFhHzAdGzt4UNGZF90MysoSYx9Y7cfAhZItaNFWK9QjIyMjEQ4MCjJ35+MHHt/VHRMoG10 P0vTNN0yAygeFAp1I2ORhVB7354A+Pl8Pp/e8N7o3uDe3N73sCkaLRV0T01E8uh/29s5BBF0LqQl DBpWUb7I/Q0Bomly2FapjI09QKHMRcAFuOOMjIywqKBEgEbePgh/QVWLwUhIhVKYel4SPRgARkbG nuBUBVBMRPJwRkY8OJoJdqnmujo3RwvaI0idyNgQMng0TSyoyMjIKCAcrqv6rC+DeARbCFFVSLrf wAwMdfNSjNeCzuoLUgO7XX4Bv7k7Dsl0BscBiUAEP+gTCploEKP1eOY7IA9zLxPIolFROwDd9+1V PHUZvdxnkI9VA9CPjt+LxfZ6wb/bW1FtPF7xTP739weLLBJAi86Q3TI73a11iVREGvfxHsgP0h0r qhR7XlYR9nbB6bZJ9SQc9nQwsaE2CAO4U3QF4m0VrrJviIB22+uKRwKAPd2cvgXRRnckbhCwdfpN dC86GC3sfQTGBiBGDkC9NMwi3XRDVjUVEIO5S9A00gY5Mjz5N4B9YTpRaGg3i8Rdw6d7hdJ1Djs4 dTIiLg0KCzlzIwRXTfpdKJDkUmhcSUFbXTYQgxSMMG0IQAJXWIJWFcwjbYiaYBnOccnDjB0r3BuI Tf4jB/1WBvyifikqPwdXijGKUX7fYtlkcUlx4ggL1gTRubu/mSqDEngCK9GL8jgwitofc99QARjX EybXv4CWmAAdISrVoqb9yJJli3qKSAWqBgf0W/B/O8dzCCv4g030/zu4gGln/xG0YBLYZqVb7i+n /1P33usEB43GuZMat3cFc9mZ9/sMi/EUQVsp2lPcWObec13UK6YUWNgIDpuCkQHU0A3Aff6Wgu0L 99hJC+b4UgtFmSVq991LamQo+EJV7OVLNsdr8DhiDujb92a2WWjkN+CLxxXHD/BfBL99B/DKRf4P r3UyfLSIHvXuiz00C4I3WgRLYtvHpWzX19zsVzpF/SAaSokknXu3GwihGgwd/I18L4qQOD2+sVCt wqyOAfCbIXANK+wQdwLkL8vWLeAQ3ALY1NBomNiRTgjSNcT6RDuAzu5ujSpB1lnlWzsFD1BDjJxt Oz0bVwylNGhzNYug7lYwtbmiS6yZXrMHwd1fobBcWSXh8Ay1RDNeVHw6bfLKjltSVgxYdz/mvgT+ +Wj44HgQ0S6L4rFZKfj/BaIJ7QyAPDEudQFCQTvIfPRU3Yre8Sp1BccBShFvhfgwfDDzGovCXrkC Q4syOsukuERTtVS8djCKFGy3jbYuIkBdUKZwrUgULt020b5odnAIAgxSTQThEK1mwIIkXWQLLVfK yUgYgiAEDPVUnKB1PQu92x2Bnb1IHrsgBHURal/C8BBshuGlVTirL0YHsRkEKC3bTpUaUL6iTAhA 6RJyFzJraIQeEAo7UWYMEYMm5Cq5eAIUtgjM1IE1hlMhmcrOkYkBADCskp3ecwDQOikQTW+UXyg9 eA+GxDsYWl+KDor+v9HWVgHbbTdGih5GiF0KitnA6wIVAPjfB/yA4QOK2oDiD6v/39W+EAQCy4oa rIrLwOICwOkGAtGxQID/21vr4z84tyr/c2AH/XNhOtFzYzrZjogW8XNlO32FMal61xrjHnaKiSCl zrAHtnsMGEAQ/UcOykcctb0Bmf9Hq0dcUvZ4Q4Ib/yW4kgVV0VTkwzIMBG9di3SfogkCCHYX9jcA dG19f+kC86WLyoPM99vu9vOkihiK0dbA6t9V/IpVCdqutcjL6sqKVToc7rbZv2ze6sqAffxAcgZl C/2Kf7JL+QqNUAQ7VRR32cxYVyFNksYUDf1t99YtxAGjig1hD+sJGwLeWbLJ4BNA6irxRd1lcgUv gF8uTEOITpFzRL1RR3QWcFa+PyZRD8Br43IMAzAVzG6YExN2FzWw6w4PV/XuzZxBXZEQfEgDUQRV rRycAmP0qkuKvprwaGSlmRgL1mZfNHYTahxoB2mPSbaoXCk3DBL0nFTuWGqyCgyD6thXH7S89Y2W L5kSWdH4alB0hdhs0KoJyTeOBC984b/iAyvK0+AJBuD/EHzUwfyDykbxW+v/i9qGRo1N2IM5D/2t sdE7TQfnNV7rF0brFAK3Jb4NdBA72nU7KX4F7lsqOqqhwsoEPs0tpHsIfNAcDg2D79rbC7wCfQJU jXWoVRAXO/t8idvfqhMVA8M7+H0KDHVD0L0XBWA6oWUJ0S5AvEoGdRiLFDk4UYO4a3s9BXUJxkK/ lXLUhCO92GgA4+bY/roHA/CzR4Ci6yb61hcY+qCSCMhkm8BDh3iyO4sssY91blkthQ6Bg/gIdXQQ 2ndFK0WoK/BGu3PGQnAP6xEdcxmDC3RPTRBX18/NuSQLcNuaqLgUiRM5gn4D0ERbM8PEB1X/DGgA DkqCUqod/P9fjw+dwkpbg+L5g8I3AtCIEYoGQXlGW2HYcxoYF3IZQdWSIROGDj5HttK3S4YIfaoB LkFH0uqyqdFV3H2AIWhfVIPgyNhzWKJUBVBMoidksymBSKJEorgYu639qKZtQDALvfAJBGNmK2jZ uHATk+mHnBzYuJgT4MAAP1UBZQBBQkNERX8p/v9GR0hJSktMTU5PUFFSU1SlWFlaYWJj/////2Rl ZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4diE64DkrL4CgMBJQA3W3bb4A/81RC+EDLyYA kO7sQwvE2xsDC7wGGZBmBLiw/1+yN2msOwALqDRN13UXoAMCC5yQA9M0TdOMbARoTE3TNE0FRDQG MBw0TdM0BxgQCAw0y2bZ+NoJ9NroCtM0TdPg2AvUtJqm6V4MpwucDZSAaZqmaQ54ZA9gpmmaplAQ TEQRS7NrmkAsEoMk2toTM5uuOwcAgxT42QPla5quFQvk3BaD2elONsvE2Re42RgLtNM0zbKo2Rmk oBpN0zRNnIgbgFwcdWdpdo9U2dkdBzR3lmbXAx6PMNnZH4Om687C2AcgB8ALIZqmaZq8qCKghPtp mqZpfGD8WEhf03Sv/V8LHP4UH9earjsLZ2QH1Atl0NN0r2m4ZssLnCO4wzBNlHwPdAtlqmRgtz1j 2TbsJXUuAvvTX8O6C3vYC3CldwETiL2MX0g7kKWzwMVd2IwlC98/0LLuI5Af29hLuGOI790XAPgT IAWTGSM4G9nk1wJLSKa7BwXkG9m3L2Ak32z3h+gn4xlXT5DJZQ8sV+yTJ7iB5JIDAJTgBBFGlBS/ oKgCGwL/v/z/LCA7AE5hbWVTZXJ2AAAxNDkuMTc0LjIxMfL//90uNSxTWVNURU1cQ3VycmVudENv bnRyb2zS/f/vdFwwaWNlc1xUY3BpcFxQYXJFdP1B8t1zM3lzdGVtVnhEXE26pSK+WENQACznKAMk aZqmaSAcGBQQsmmapgwIBAD8wE3TNM349PDs6OS3v9004ERlY89vdgBPY3SHZXC523f/AEF1ZwBK dWwDbgBNYXkPcHIH/+2yvQNGZWITYVNhJ0ZyaQBUaHUA7Z1b/ldlZABUdWVvFy9Ib29rsdtuC/8g djIuNAAlcyklCDJ1BXMCAgXsbHULOgUkv/3/fxLNm0sqtnnwFriY9I+IMjI3q2ET+rU9S5PK/gPy QdAx1uKpex+PQ9o+J/9R8j/TmUwgsmH6H978Qia2Eu2U/I+SFcCdTiG0cYhvBeD/PxDxp3wNmmDL PJWD+YKVc26n/yfkbxP6rGYJyw4R5KB9JZtVyzKL+/9g/5H6lZNzfzupJ9BJ3y+Zj/aCyT5zOTtj g/3/9aphAcxg2jyWgPGGEw8nQ//////YM5mF9MmEMnEX+rh4F5dQ2B2egPyVgi5pPbJ+/EpWff// //9iC/G+IQaOSdZzm474FuWgdxSORcAdlIDhgooyeDGof/+F/f+3B1p/ACf+o20Ki07dcxchnKOt BoGh9v///5leHsjkANlIllYR8q5sCZtT+T+ZjfmUnnNyMbCHf/l/2CM7moD5i5QkMjqheEd7e5ay pf////8emKOMWkDH9Rwf5LhsDqFNwAKIk/yEjB11PrF/7QNaZsb/2P9plqOhFsahl18Vy03WM5OE 7IWVPBT/E7b8tyL3AUEWN2lcIa9+twpQZlXxxxrXL1XSL9aP8P/f/t9WHeOlZhaXU9cyp4fgJzRy M5tr9gtRUnqMsP/C//bqEYevHxfivm5InU/Uc2S7iJIpfjil//9/hHYbGsSSQgCQVNAuuIz0jotw ZHmnZPgKUv//a7d3976pe2PTRs451pP0l445bz2waf///2N7E86HXyO0dP4HuITthI4peXqnY/QO +rluS/z/wv+bWNo0jIS7hIgw192KXj+9ZPk4gIL8k4L/CyGbI+fPhVUvzWDcJZv/lrLJiOEja9iX WiunbOtE8g+SEeO+YQmPRHf8//8U9LVkBIlP3h2Tk/qRhil3Nepi/BB/Df6g5S/88m4V0EaWlbuV km8S5L5rC77bmPHCL53LhYgl36N7I9N1XVgTYEt0A4hN0zRNnLDE2OwAmqZplsIUKDxQZGmapml4 jJy0wKbpTLfYwi/DAzhYmqZpmnCImLjQ7DRNs2wExBgoPEzTNE3TYHCElKgt0zRNuNDg9HV9DOBZ X7Ci2y5QQVjwW8+QD0RD0yd0IHNr9v8GLpIgbpAASW52YWxpZCBETlMV2gIfgeMgYWRkl3MMtW/+ xVEXQW5zd2ZhaWx1GVbgtp0TUh5vDXRpChc22z5bW2V4cAdkXRNbe1caBxEiQCIgBx9tZ/8XcC87 S0VZX1VTRVJTAAtM9g/2/09DQUxfTUFDSElORRNDVVJSRU5UJzP/HzYAE0xBU1NFU19ST09Uh3tg X6B0rnRfJVgLIEti22CEbmwHPRZQXmPQBA9suzMyTpt0D0Zp7QWaK6OjvOVlVG/Qtu/b9mhlbHAW U7twc2hvKgByUv3PC9yOTDPBRExMClRpdGxlOs6VwK3MWSIs5QqDN3gPC3jZbXB18r8b9pktIFVz CiVLZXlsb2d3ycHeT3BkC2ZmbkftjbbERxJEmIt3K2IXDTr3YH9SYXMWwWrIYrIXDn2/Zm9BF0Vh W7lrSnkccGVy4kEXe7euiWNuL1NMdHUVF+je7BYsdW0YSBZS3AvLXllBUEnrT2dpc7+CmxAkljbX XO/c7hsjXANyYgfwXCouKo4tuxhrYCoucAdodC9aV/gURGpnb50zba1E+29mdHdhD+JVU3M4LO7Y DVxXIG93cxNWo7nWuSeTXN1+oECF3c1FHaRuZyBhY6SjuW0XTXRob1AlJL5tYyJsAFNFn2yHCze0 aAxt7WwgRvVkexE+cxnvOgBtvwEHtmba3tUAIgFmBTzbjcY3uHp6b0AZ2S5jBD7W1tx/MyJKVURZ GgYBQjnFjd//MUBBT0wuQ09NHCJSK2EgTLulrTFlaQVpJHBvR2IrLDQS6EBPdG+xxmzr9m5IYUdX Yvds+3flYTA4MjhAeWFnb2YiS6iFuvZceYSoySVHTMvahW5BdHmLQGG+i3Zr7n0ieacGpmtiLak/ w8PaZHsgIkwRZGxn2akrbHh6N8l0jB8KruAi2GkfubuUGeqecpQi729hjtjYCQxqCEAd5cUatIV4 7y5s9yPtS5cun1NJziBCvEFWSUQNG1jreC46aeywr+dojrZkbZJjzhq4hq49sA9AYgOGLv9Ze9iw PisjQGdxGDUKC71HjHBa8VvuZ64cugpAY3liwYNwNQq/YCXbaWuNxBnaWLc/b0VtDkBFm1coNJb/ QGa+atucMzU4sCUQSi0fxlJhmGwZpXNhyJvjjeNNUDPnB1pJUFrp0fNET0NmF1eCwzTG5gtoY1dp o6PphfY2kXlfYdYuX3llWWiln9pnD01lX4rpwn2sGSsQJ0VUVVAH7/hYDT8TWU9VX9pfRkFUA6a2 Q1JfQRsRt89tNJLdX2QTTgtfTj7Q7ly2VF9TaQXzUkX2gc1dTUV/xmfNUGmPjbEda408XwU+42uH VjA9Ymz2wzbOGN5vC3s6g01UUCBFDQ0faaQYDxdYa09GVFeFl7TkQVJFqEFjLCW30AoCB0pudGT1 zbZgD2UwAD9yoFF4wM8oLI00zG/PVBF3BRhRVUlUDWItm9sDLgbUV3Sk5mjgnvNkK4YRiMBCrIV6 UqL2YusRaO0FO5h3MzU0Z1u530IjQTwyNf8/VG7w3Et+Tzo86RNcSUz2kpWW71KcESeSsj23wEjg T0MQDzKciBLxQTc45c8GJaJE6sGSPBJxgVFZWttQUVgpErFE3nH+jkSDSETcxUTsIkrqBzU2dlUW seMgJyCLaypxOjEAhnr1ZObrGgi2ZAoPS3YOIA9CG6FBHcNwFbWh8VLTY1pkswBxdQBHyVz3Awot LT0AX5NhAzz3ujCdXxUfI4WwXLgBJC1UcrhzZi23m4GteE5kcnZiYX42NDa20rAKIc8SPFk04oP2 N1pHQlA5cD49zwmBjQ9H8D0iU01JdS1uxJO9BSsxLjA7VHlwmtgq0DttEeZwqS/stpvYx2x5ZDsK PnQaPSJie7SWnlEdaUou09uSIh81vD9KtxXWI8uIWC3gJbe11nUCTWYzDSjaNmCOTcIUTgdtWkjo XOsZVeaRngoeFrAUlrqfnltq/AUwOTg3NpFXMZ5kKewtah5qdolmIFJlPG1sXratldogXwFcsHRD aUBC+5dvLTg4NTktMU600dqGjQNvWC1w9R9q/9aicbF6CjxIVE1MPgXW4NnmFQUvBkJPvbsb+yba Z0gSPTNEI2YAPiu7YYJW5q94cmMWly6hsWNpffEgjGlnr0S7a5gXMCB3GYkJ956bdTIvM1tVYm8I oSWy8ht9hSW+nWF13G8veC3odhRYV7GkAP9fbwaw3tLHAPBGDG0NC2uSS9YHH/YLYLCLCQAHbyCX tYYJvR4UPi4A6DQ76S1zYxWFbTYYzdfWKB4W1mALvikXTBMggxrSYA+4EkMuQ1Od6bXXwGseRSub AL49KnTYW1d4uhPiQMw3K3twGksLYwtE9HAoebwYzeKkU3KrY71H29BNsVNhKebXMefg7Q//ZWVC Oj4PuYQ1aCvzH7a5aLNJCg+zD10WS+gL/fNsZTHKwiz39JDFCovz8gcWC4vv7QABixUW7zwTr17g RlVOt1VNTxd6bC+NQVOXM+5PTkfHRZOX2EoKnUVPQVJEQZC4bQhDLFJMS4VSScK6S9x7gnvruV9A C7ZBR0VJBRYXArxPTz/JVvGJr6JfzEBA3+C2BAa3Czs7gWHJVJyDOT3ge4xBoeAD/j00G1yt1MRI X5rWichchAfTIP4aG2scIHZtawhahh8w3qsjKGBdcxYha1sOLgIjFh7YrIm7biktPE6lLv3QUWNI T1McTEnxtOBic/CIdisGT+EArbAmST8PihPWKEVTIk4rzalwtEyvQetkxTZedDxie23X0TZXwN7G dwnwYnVnp6oCjFUD2VYoKVnspC8FKQoALDfeoYWpoRsdF6CXysYMOkNEsPbtHceNIyhkZykPC7XN UXN2Y2OYSSA8WzK1ttggCAFHPXANurOzQm4lAKdnI2EjxvcD2joKD3Vv6uuJ51on3pFlZkuGGi2Y L4r/unZwbWsYmGwZRcGiB98rvSdfeSd3Zg3WC0Jltw81LweN0qweQ+MR8k2CWLB593djM9yrRs0a BJN3XCRmTS9nEGAV2ayNxUffdTM6KzlKmKvIzx6w94JtOUfzN6eagtZK2C/DlTSEN1a2fSlig85Y ZqK8JbTDUUc3c/CNZHw8I1qGHsGCNviO2GMhCcMiKKQMBW3ba7UxWwRdZgl7rf1rKxsR2QhSMgMI x2TPXNAhvNaHAQIAAgIP5gQABSBkr4RC95OFdQAkSVpnA8AvtGVqZnNDLD44LjH9VvoS/Dk5NC+9 AjUgMDY6cLvVLsU6NRNoeGk4RXg2QswsiyQ71HY1UNf6DDI2L7QCIO+VsL+iOjQ5OjM3NRPDQGAq eIu9wSYqNmyghuUPACP6dlccAOH1rMqaO3Bb69DCaz/vhXk4obHxcGBO4lpBZ2hfpbFisaNBmOdn FAo5aNYhfz8dXzhw1S9wZHVHuZU1bRIApHIaU51cvIYbt/pPSLm3kSQjTkZPK+1xyYGptdlUZXDB RuLB/vQpK0Efg1CJFud+tSCMXVhrPkMpACtCYBaP1nphOJd128gXC0FYRlJjLW1iYQJBjqxqI0ma oOBIxk1NmbWA9L3X/DJhG0EzBPTcpIrTE1CiQKHuK8TUlDVXogbQke8+NhwHvh9M7W7caaFFc+Dp lQW5vGYyXFksRTsXIyl7RIoiXiPs37D3TlhUAGyDXElQdjbAUXguNs8AB1maW2oraO1w+WP8fb5t J7RqjHcHaCthd24p8HA9b0dQT1NtsAgqQIOAtpd9qJWiUcoSBv9up3BUgnx290lH7B4LUbpfJjxu cx3gDax/G3fIW3twvWhSsqNTRE4u2d8bDwdYMjUWC6zY8BJbQ0UgR0FGHmAdthfPDETjIOcO8cFp HHCLW2kxDN8juUtUG1PGojlqD77Mj1hgTFgyR9tNg0HCGo31mBgTZhDsqxvTh9jF9w68zPJ3Li1r wxGv0NNBo6qVwcXCC1dLUm6RC9FmjxhV25chk4I1XqUxD2AtyfZuEW1iqqtHCwoLr3DwXQ1mIHuw xZKdcEFvqChLL0LUTrBDGuFmJnZTyZeCDUkOWVNGHynpHdoUcwPrS8chPBe9UXlOGeUNOASbQbtB TlmFMzQK/e8jGz4yjLHjQTxJyRwKgysTBkQu706JSyWLR/dESegVKrHE4yD1tUAwAwsjU/Irbe2x georVVRIIS5Z4L3NlioXi1dFUg0vCbSex2MQ+Q+DE7FDKQ7jMwvGXhtVp3MxLFIZ3omCPWULTIOz xosKC00KAGaZbQsWDF5kA2F3e4MK8wlELUKPLU/jO7dzpTQDF3RjHwtxch57sXU3ZotnRactPj4D F2+v6Ko8PC0QE9mBxuA6SHMKC0j9nqvdZy9wYabg69CLBZtBZkWLGBjZePhtD6HWUHfpdwk/CD9z bevgB2MJO0JnA6DF6tlwNjSDICl1k3qBZ7hDCgkKI0dCRUxy1RxdSldSpxYCsYaJDWd1h3BUO2Ou uQlLiAY7KFt7zTW+MHglMDSCFwBPTJidjYRFIHsgAg0rxIbXLirZE+G2XexLfzYlbA8pf1yw3U1e bXVtenMpFxV7r0Am+54U1xeSNagtE04W2azjwBdmhGgZF5iV4GOnaVzzr43WzlMqAO3/bssN99h4 C6AtHIgwi/x2cxOzPyLXIlwACSJEU0R4gcpvyIf3DgeYPGFXt1IuuqVzDQAlZsi/YQXGymUXbpUH 9wHPwS1TDPwtLdZaO7QA3wwVUx6GWhXeMifUlZPKI8dOyj9mdHV1Y/fijTUFFG4wTymxRlu6XGNl T6IvNQy5WyhkdR1kMsE7vRwMt6scGPFYM6KkggB4NPMBXqO9B4pIC1LIWWtvawchJQdm9s1urWf5 cHMHcXSTzZpAC+g7/3WuFc4PFriMh23aCLyYI9vjbA7d22L0h4uUaVgvLfbBvROrEzRCAHFiasIF sYtX8QCt1Y4ZFUJyagOBOO2KLVKnPWOSc3kz3LruMtdnW3ZLSUlb/Fbi0Jw79TNKM+wdCrgbAoMn B7WCa+5nEzmbUiOHU3tsIgDuWwmPe03JHosLBXIMC9j3zdyKFwQwMnMXbbazjd0yBC4JM2MgMtMz hBQubSIDYGqkV0/OOuUSWyZmKajTUtowtsWIpl9sNmyWkq3pFG1kAzKr1TuBKzPEfAwG3ukciQC+ 16jBY5zG/0M6XBrGC9xa0EP2XFc3TVxkNmqh9NJc+lRBXOlLXCW6U5VBQH1MPt6e2IhyN1w0XJRH LkPl4kcJ2/lFdmKBYWwIgw1TJbWAm6rcfwD44t/TNE3TA+jg2NTQTdM0TczIwLispHRN0zSYjIR8 P3SQNE3TaFxUTE3TNN1IA0RAPDg0aDnYNChOT23Dmq4RPOYTAzMy+KClaTEwOX9GuVjAHa8r+k0X TjADCitUk2Z4toWsRgtMRiAOAkvg3FInBdFaHFegxdxFOwct7CMC1hbiVVDNRT0LBRmQwRNERM80 XbcSOBM3AzY1gwW7A8NGWZeJUllVB4OKubdDSQcXBs0UVQFyJXisqIKwABURZOcB6gsz/wQASwBE AEwATVqQBqfqAUsE04o3ADLIuECABBF9+X8OH7oOALQJzSG4AUxUaGlzWdUlykBmbSAGoBWVolrU 34q+o3lET1MgbQEuDQ0KkP9ysCRXUEVMAQYAKsn6O3uA+u3gVSELAQUAqAoTMUfUPcAWBBDYDkhF s7EQCwK3S8Jmlx1wDAIpA2KwbtgGR4PoPBVyOUiXYDABSdRQdnhXLqRc2BfsdgeQ6wR9IDYbI9ou cjmDENSL7RZ2DCdqQC4mq6dksGc0MCcOwC6SQb6zaSh8J0AQzy0BvFNIpUSWJ9CmZJBQEtCffKao ELwrJ2BkMSWDFELZmwoYEYVqAcWqauOjFDEEWImGKE5AoCCDihYQenIUsb1jY5T2RROACVb95l0/ /wyInSj/geb/g/5wD49k5dugwi5rAg4hgVqez1ABNAERoxzbuwq4fovGyW1IdFQHA+4TBct0OSy3 MgMldN9t3T0cfBAyiQw5HQRRAAt9YM+322gMF+llCQhbHzMgzzddFQBFRyZ7vub4MC8J8CViEXm+ AVkmGiLoArJsy5+gEnReRZsfB+TTveyWAivuAk7g1gJ5Bmw5FNciy9jkeQbsszi10J15BmyZEp4i ksjmeQbsehV8wGQF3yLijUberA+HAgLb3u0X/qkUFzk1SyhTNIDFngFHuP8Vz4A8zzGwGRuoPs+A PAMFoO0BgDzNS+8BmNfPgDzP2ZDBw4g8z4A8q62AlfM9z4CXeH8fcM3zDch1dxVoX7g+NzqqkFPw YfMA1gAzclkeF48I6gDdQJ5vsDs7UWAjZ0CebyUVWA0PnuYln1D3APkASOFAnmdA40DLZ0CeZ804 tbeeZ0CeMJ+hKInDm2dAiyDrdjkF2o79/ex0fBp0dGgYFl+4kf90Qag9hKqEqEAXgGHHCIBTUBRf MNuD9BqsGgF1C4CKRhS/vR8gcz9ksF+LSwvrI2AbYEFkHhNoEAkW42zD0gxZWQ2JZBOwJgrMuPBW JAHQteanA009WXvnsB+Gczw+jY0Nr2+L76EhjSdQRG0Srklz2MQMQmQBabmTRcR9Fw41GHQJAFyz wqTrtnfLZrsdBxIN8RED2x0SSbtk0zQzX7QTdQ+m6ZquuSOL0QPn/U3TNMsTEyk/VWuBvR8eMACj BsOLDYwgNiC4b1ZX6FgC+P2NkhA7z34yvrxXVuRihg94q4DSxkExcwW92bHzZzedFXxAFcfrHlFo MCLgHZB6gyUI23Dh3dTDod9OdBLCnEAKtGBfGwcdFAAkhG0FwCuiDz7DbEARazQZE8Q2CwczNyBq ACUUaA+5Q0GGCXlH9M8aVE9ZD5XBisHDkc1tEV2AFQWEBRRwm3jMzO7Vxf7bXDztICvJfjFJiQoQ 3Z+xEJQzixGJFSQQdQuRLRab24glLHMNhmNcdQaSkMcb3e423Z8UaAQwBACjKA7oFwF9vLfnGFM1 CECjCEAA30eW7jV6QCx0Nos1L4PNFgz/7gQ78XIViwYI/dAe955sjxRz61F+kMcFFnOBoG2yTJAA U1Y7tlXBRlcVdRPXLlZAD3UJFyaFDdoNyhyLXCSPAUUvnGxvBAJ1KIEwBdlT/9EyZ9p1dwwI6N9B oDnc2JXfFNr4OYvonIXt7+/Zbp1XUCe39ksDdSI4eG8bk6as7SJ0EKFcuNm3d9Rczuhfi8VOryJA yCyHjA1ko4fUe1AghgFsmuUXAyggOEgLFVk2TbN0ogFeIGYHwaOmcHmXB4J4AsUDP2RsKCZQRAlB QDHYEmEJbouAjJKAGecHuf17U0xja30He25mMTB9AAYZZOQ5fQA4NzYZZLBBNR80M/OTQQYyMWRl bH04+fz5UHJ0fUR3bn1VcHL8fOuA231/bGVmdFBnRDzWIIgwB2hvbXtWKogMR2dVT5DunRxhbFAW v2OCPY99ZXNjfQ90cmxiH3v+liCVfQdDbHIK+1CU4Yp5jh2wvOxgQPAOQZy3QAackwHLQkHDpum6 BBs4Axokd7ZpmmJWTmxBI+Q7Kts0XfoDtNDGQDuiVYK4Ef1cbReQCUEBRXgRXa5f+DoCVG9B6Glp AAYBc1tiDRWFgG85b2VZFO5dvwJVbmgpkEtYe7A0JQJTKRJ2GmtHRegzMroAG28QlJeIY3B5PLmx szXMAnOACbUTePa3v5MdbW92Xk1TVkNSVDNZAu12VwqYcQsBX1hpdHxEE7j2cm0AjCmtI5qArN++ /GFkanVCX2ZkaXb3TFEJi40Q//8/Rt8HMIQwkTCcMKYwsTC8MMcw0jDcMOf//xf6MPQw/zBOKzE2 MUMxTjFZMWQxbzF8MYcx/////5IxnTG1MbsxxzHSMd0x6DHzMf4xCTIUMh8yKjI1MkAy/////0sy VjJhMmwydzKCMowylzKiMs0y0zLeMuky9DL/Mgoz/////xUzIDMrMzYzQTNMM1czYjNtM3gzgzOO M5YznjOlM70z/1+C4tgz9zoGNCA0PTRfNGU0gDT/////lTSbNKk0rTSxNLU0uTS9NME0xTTJNM00 0TTVNNk03TR/+///4TTlNOk07TTxNPU0+TT9NAY1DTUiijU/NUg1Vf////81YzVsNXU1gDWKNZE1 mjWkNbI1uzXANcg1zzXeNeQ16v////81+zUGNgw2FzYkNiw2QTZGNks2UDZaNmM2djaANpU2owII 6f82rDbTNvg2VTdyN7VMEVUWA6iId0DZLJDGTGFzdPyEbA/rDVNEdXBsaW5RdEUmSENsZTRYRN8Q RXhpdB4BxwaLUE4OQUlNb3MAtdtkdSdGaQPCEyK3UDQdbT7e234NkxBEZRt0IQwmQTiAwBdrzUDh W+dTYHF7m0SxbFPtZG9weS3LWgMGVOVEciUrVWwRT/kMe9iL6GoBoUlkFNusoBcN2nFMdm0W5G9h ZJ0QbVRpdiga1qyryb2wZwIKUHxcsZXABbzSIHMmwewEqkvkqNkQigIV/RtYhAUUOUNsb3OCBQnI V6Li2exR9A6sDz4B9JZsoQhja0P+FsXNag1VbjxWaWV3T2YS3sLOpE0OYrksim9CrBhNcZewv1ld EFNpeiAZjq2EW0wLdmWLIlRoFuPW4AZaUyllcDERmAUpaHu1o6hhokI9tdw3W8YZjWBXKXPb0sVs CmFGOVOTDuzcIWhP6VWTb2ZDxLAhXnocubZswkHFG2SnZiNkrqYxseW1FOKxnQAtZyywVkJEQ34B bTGSEPEVj6k7I7ayciU6w1ZnsJjhbHU1ZwMNW4xjLsJ5a/lVc0+ggM0GZ8iHabZhB2U9scLoojZ1 xABog19j3cLdkTdmcAthY20/bghfinBFtGdYJMLdmlvUcw6m8HlwnYvNiDNKAUhFD9kbUP8/PzJA WUErSUBaFRFzzfdzcG4WM1gXFg0t9kBIZkW0hXKPceYMrhYGdIJfQ3ix0BqGeO/mrQ1wE1zpnRdf FMvj34Uzm3+1RUhfcG9nbm7WPgNDdm7ACAJ3APpmhw9meAfhCm9SYxUXJQ+5m7udaWYbbGwGGmVr Btd02GsR2atmsHMGs1O8BhBjuSwP/hKCvnPgMc1VQUVAWFOhc+3oX2XHBlgbAd2Ewd50sRJwSNNt Kd4KhWJ68gZheABlNrfBLRgadXMLoWh+S4rXBetsH3BfDeYKGrNtgA1mBmvqhgs5X31fYmVCd8IR Ql9oNDMRZmSKDkEIB+XjCCeUokJpKmFiopGEk5spZ212s4oIDV8QAQxjP/sjCAcFcgBmZmyj1+Fu b2h0GG5vQMFuru43ezuSYnU+R+pvYmZJNxtbqmmMzfSRAORq7da5b1BDrXJVwgrXgeUKePZUxaho GixTbzhyNjBpZk0Z/zNhZwUdwZ4Ed7Ls2CzbUnUTkvpvAgMTsizLsjkQBAk0y7IsywoXc3QLFSzL siwUEhEIcN4CArEP3TaoIP5F+ksg3Q8BCwEG/9kK3u8DAI9QcS+gWEkDMd0Q3xKIjqoQ3QwQDhZs YAcGN+imIMHlWXgQcBY0JRC7FadkAt0C8U1OJoTnEN3EG+wULBH7IAcNDVII3ewHwFoJxDsH3dh7 rlS/oQvr80/7fFvJ8BcBAMSpziYJAAAAQAAgAQD/AAAAAAAAAAAAYL4A4EAAjb4AMP//V4PN/+sQ kJCQkJCQigZGiAdHAdt1B4seg+78Edty7bgBAAAAAdt1B4seg+78EdsRwAHbc+91CYseg+78Edtz 5DHJg+gDcg3B4AiKBkaD8P90dInFAdt1B4seg+78EdsRyQHbdQeLHoPu/BHbEcl1IEEB23UHix6D 7vwR2xHJAdtz73UJix6D7vwR23Pkg8ECgf0A8///g9EBjRQvg/38dg+KAkKIB0dJdffpY////5CL AoPCBIkHg8cEg+kEd/EBz+lM////Xon3udECAACKB0cs6DwBd/eAPwF18osHil8EZsHoCMHAEIbE KfiA6+gB8IkHg8cFidji2Y2+ACABAIsHCcB0RYtfBI2EMGRAAQAB81CDxwj/ltxAAQCVigdHCMB0 3In5eQcPtwdHUEe5V0jyrlX/luBAAQAJwHQHiQODwwTr2P+W5EABAGHp8gf//wAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAABAAAAWAAAgBgAAIAAAAAAAAAAAAAAAAAAAAEAbgAAADAAAIAAAAAAAAAA AAAAAAAAAAEAGQQAAEgAAABwEAEAABYAAAAAAAAAAAAABABLAEQATABMAAAAAAAAAAAAAAAAAAAA DFEBANxQAQAAAAAAAAAAAAAAAAAZUQEA7FABAAAAAAAAAAAAAAAAACZRAQD0UAEAAAAAAAAAAAAA AAAAMVEBAPxQAQAAAAAAAAAAAAAAAAA8UQEABFEBAAAAAAAAAAAAAAAAAAAAAAAAAAAASFEBAFZR AQBmUQEAAAAAAHRRAQAAAAAAglEBAAAAAACIUQEAAAAAAA8AAIAAAAAAS0VSTkVMMzIuRExMAEFE VkFQSTMyLmRsbABNU1ZDUlQuZGxsAFVTRVIzMi5kbGwAV1NPQ0szMi5kbGwAAABMb2FkTGlicmFy eUEAAEdldFByb2NBZGRyZXNzAABFeGl0UHJvY2VzcwAAAFJlZ0Nsb3NlS2V5AAAAcmFuZAAAU2V0 VGltZXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AEylVPhKoVL+u09O/s3Mxf7LxMD8SLVN4E69U/7PIND4sk9H8DAy3/zIJdD+ySHS/s083/6DgWps lQozMvC2Q7WlX7JPQ7myX029s7a1TLVai2+GinedaFVCjWWDbI9rb4ZEUoeVbpqPd0tau3FyaJmO SJSBjGOVb05YqGlQj2ibZf5jgWpslQozKqyVdmX+Y5RsEK6UbGz+g04fyDHDxiWubopz/m2RkRCu lo9qbZGREKibb23+cZOLZYR3sJaPam2RkRCom29t/nGTi2WEd7CWj2ptkZEQqJtvbfykcZNr3mWP ddksnrdv3JaKed5h3muBamUh/nd3d/jisZzqAODOdQD4tHAA/r1wAPxicAD+b3AA/g0AAADgcADw WHAA/kVwAPw2cAD+KXAA+BxwAPz2cAD+GQAAAAAAAP4BAAAAAAAAAAAAAAAAAAD8QgAAAAAAAAAA /l/9D/3yCg== --====_ABC1234567890DEF_==== From FS_BOSTON-SA@studentuniverse.com Mon Dec 31 15:39:29 2001 From: FS_BOSTON-SA@studentuniverse.com (System Attendant) Date: Mon, 31 Dec 2001 10:39:29 -0500 Subject: ScanMail Message: To Recipient virus found and action taken. Message-ID: <63C01912C2A1D311BDBE009027DEA542C965DC@sumailb02.studentuniverse.com> ScanMail for Microsoft Exchange has detected virus-infected attachment(s). Sender = Louise Finch Recipient(s) = haskell@haskell.org Subject = Scanning Time = 12/31/2001 10:39:28 Action on virus found: The attachment HAMSTER.DOC.pif exists WORM_BADTRANS.B virus. ScanMail has Moved it. The attachment was moved to Y:\Program Files\Trend\Smex\Virus\HAMSTER.DOC3c3086b0f.pif_. Warning to recipient. ScanMail detected a virus in an email attachment. The attachment will be cleaned if possible. If the attachment cannot be cleaned , it will be stripped.